Public Cloud版のCatalyst 8000Vでは、User Dataにスクリプトの情報を記述することによってguestshell (コンテナ)でスクリプトを実行できます。
具体的にはUser Dataにて Section: Scripts
のセクションでスクリプトのURLと引数を記述しますが、筆者が検証してた際にハマり所があったため関連情報をまとめて整理します。
Section: Scripts の書式
まずは肝心要の Section: Scripts
の書式や使用例ですが、下記のドキュメントに記載があります。
Section: scripts
public_url <arg1> <arg2>
しかしながら、2022年12月時点でドキュメント内に複数の書式の表記が混在しているため、筆者が実機で確認してスクリプトの実行可否を表に整理しました。
書式 | 実行可否 | 備考 |
---|---|---|
Section: scripts | OK | 頭文字: 小文字, 複数形 |
Section: Scripts | OK | 頭文字: 大文字, 複数形 |
Section: Script | NG | 頭文字: 大文字, 単数形 |
Section: Scripts
セクションの2行目からはguesthellへ渡すためのスクリプトのURLや引数 (任意)を記述します。
public_url
にはスクリプト ファイルのURLを指定します。スクリプトは Bash もしくは Python で記述します。<arg1>
や<arg2>
にはスクリプトに渡すための引数を任意で指定します。
Section: Scripts
の動作をイメージ化すると下記のようになります。
補足ですが、IOX-XEホストOS上では bootflash:guest-share/customdata_bash.sh
にスクリプト ファイルが一時的に生成されるため、中身を確認すると挙動を追いやすくなります。
当該ファイルはguestshellの起動タイミングで一時的に生成されて後に削除されるため、筆者はターミナルでリアルタイムにログを追いながら検証しておりました。
参考までに確認に用いたい際のコマンドを下記に記載します。
terminal monitor terminal length 0 dir bootflash:guest-share/ more bootflash:guest-share/customdata_bash.sh
Section: Scripts で同じURLもしくはファイル名を渡された際の挙動
Section: Scripts
のセクション内では複数のURLを指定できますが、同じURLを重複して指定すると最後のものしか実行されない挙動がありました。
単一のスクリプトでも引数で挙動を変えられる都合上、同じURLを引数違いで渡す可能性があるため詳細な挙動を確認しました。 結論を先に出すと、同一スクリプトを使い回したい場合はURL Parameterを付与して一意なURLにする回避策がありました。
筆者はguestshell上にて下記のようなスクリプトで create_node.py
を引数違いで複数回実行したい目的があって本挙動を調べました。
create_node.py
はPublic Cloud環境でCatalyst 8000Vの冗長化を実現するために用意されているスクリプトです。
#!/bin/bash # # Description # # This script is intended to be called from "Section: Scripts" and executed by guestshell. # Execute create_node.py with arguments. # # # Arguments # # arg1: Node Index (e.g. 1) # arg2: Region (e.g. us-west-2) # arg3: Route table Name (e.g. rtb-0123456789) # arg4: Next Hop Interface (e.g. eni-0123456789) # arg5: Route/CIDR Prefix (e.g. 0.0.0.0/0) # arg6: primary or secondary # # # Reference # # Cisco Catalyst 8000V Edge Software High Availability Configuration Guide - Configure High Availability on Cisco Catalyst 8000V Running on Amazon Web Services [Cisco IOS XE 17] - Cisco # https://www.cisco.com/c/en/us/td/docs/routers/C8000V/HighAvailability/c8000v-high-availability-configuration-guide/configure-high-availability-for-aws.html create_node.py -i ${1} -rg ${2} -t ${3} -n ${4} -r ${5} -m ${6}
検証環境
検証時の情報を控えておきます。 ドキュメントには明記されていなかった挙動もあるため、挙動変更される可能性も考慮して適宜最新の情報を確認してください。
項目名 | 情報 |
---|---|
環境 | AWS |
製品名 | Cisco Catalyst 8000V Edge Software - BYOL |
Version | 17.09.01a |
例示用スクリプト: echo_msg.sh
動作確認に用いた例示用のスクリプトを掲載します。
与えられた第1引数がファイル名且つメッセージ内容となります。ファイルの出力先はホーム ディレクトリです。
#!/bin/bash echo "${1}" > ~/"${1}"
guestshell上にて ls ~/
コマンドでファイルの生成有無を調べて、スクリプトの実行有無の確認に用います。
想定ケース: 同じURLの重複指定
同じURLが重複して指定されると、最後のものが優先されて実行されます。URL分だけ重複して実行されるわけではないので留意してください。
Section: Scripts
で同じURLに対して、異なる引数を渡して動作確認を行いました。
Section: Scripts https://www.example.test/echo_msg.sh Hello https://www.example.test/echo_msg.sh World
guestshellでスクリプトのダウンロード状況を確認すると、同じURLを複数行記載していることもあってファイル自体は echo_msg.sh
の名称で1つしかダウンロードされていません。
[guestshell@guestshell ~]$ ls ~/customdata/ customdata.log echo_msg.sh echo_msg.sh.log syslogger.py [guestshell@guestshell ~]$
guestshellでスクリプトの実行結果を確認すると、ホーム ディレクトリに World
(最後の引数)のファイルが出力されているため最後のURLと引数の組み合わせが優先して実行されたのが確認できます。
[guestshell@guestshell ~]$ ls ~/ World cloud customdata [guestshell@guestshell ~]$
なお、Section: Scripts
の記述を元に生成された bootflash:guest-share/customdata_bash.sh
では、最後の引数分の処理しか生成されていませんでした。
そのため、同じURLの指定分回数のダウンロード処理は走らないようになっておりました。
想定ケース: ファイル名 (ベースURL)は重複且つURL Parameterは一意
同じ内容のスクリプトを何個もコピーしてURLを一意にするのはスクリプトの保守・運用性が悪くなります。 そのため、URL Parameterを用いてファイルの実体は1つでありながら、疑似的に一意なURLを複数生成する回避策を見つけました。
Section: Scripts
に記述するベースとなるURLは同じものの、URL Parameterにダミーの値を渡してURLを別物扱いにしました。
Section: Scripts https://www.example.test/echo_msg.sh?v=dummy1 Hello https://www.example.test/echo_msg.sh?v=dummy2 World
guestshellでスクリプトのダウンロード状況を確認すると、URL Parameterを付与された名称でファイルがダウンロードされます。
[guestshell@guestshell ~]$ ls ~/customdata/ customdata.log 'echo_msg.sh?v=dummy1.log' 'echo_msg.sh?v=dummy2.log' 'echo_msg.sh?v=dummy1' 'echo_msg.sh?v=dummy2' syslogger.py [guestshell@guestshell ~]$
guestshellでスクリプトの実行結果を確認すると、ホーム ディレクトリに Hello
と World
のファイルがあるため、同じベースURLのスクリプトを元に実行されているのが分かります。
[guestshell@guestshell ~]$ ls ~/ Hello World cloud customdata [guestshell@guestshell ~]$
想定ケース: 異なるURLで同一ファイル名
異なるURLであってもファイル名部分は重複する可能性があるため動作確認を行いました。
スクリプトは上から順にダウンロードと実行がなされます。そして、同名ファイルは上書きされるため、結果的に最後のURLのファイルの内容だけが残ります。
Section: Scripts
のURLのファイル名部分が同じになるようにして動作確認を行いました。
Section: Scripts https://www.example.test/echo_msg.sh Hello https://www.example.test/dir/echo_msg.sh World
guestshellでスクリプトのダウンロード状況を確認すると、同じファイル名のURLを複数行記載していることもあってファイル自体は echo_msg.sh
の名称で1つしかダウンロードされていません。
[guestshell@guestshell ~]$ ls ~/customdata/ customdata.log echo_msg.sh echo_msg.sh.log syslogger.py [guestshell@guestshell ~]$
guestshellでスクリプトの実行結果を確認すると、ホーム ディレクトリに Hello
と World
のファイルがあるため、異なるURLで同一ファイル名であっても実行されているのが分かります。
[guestshell@guestshell ~]$ ls Hello World cloud customdata [guestshell@guestshell ~]$
詳細な挙動ですが、最初のURLのファイルをダウンロードして実行してから、次のURLのファイルをダウンロードして実行されます。 ファイル自体は上書きされてしまいますが処理自体は同一ファイル名であっても実行されます。
IOX-XEホストOS上で一時的に生成される bootflash:guest-share/customdata_bash.sh
ファイルの中の処理を見ると一目瞭然だと思われます。
c8000v01#more bootflash:guest-share/customdata_bash.sh <snip> wget --read-timeout=30 --tries=5 https://www.example.test/echo_msg.sh -O echo_msg.sh &>> customdata.log <snip> chmod +x echo_msg.sh ./echo_msg.sh Hello &>> echo_msg.sh.log & <snip> wget --read-timeout=30 --tries=5 https://www.example.test/dir/echo_msg.sh -O echo_msg.sh &>> customdata.log <snip> chmod +x echo_msg.sh ./echo_msg.sh World &>> echo_msg.sh.log & <snip>
wget
コマンドの -O
(--output-document=file
) オプションで出力先ファイル名が同名になっているため、順次上書きされてしまい、最後のファイルの内容だけが残る仕組みです。
ちなみに -O
オプションによるファイル名の指定がないと、重複したファイルは連番が付与されます。