My Home NW Lab

逸般の誤家庭のネットワーク

Catalyst 8000V (Public Cloud版)の Section: Scripts によるguestshellでのスクリプト実行

Public Cloud版のCatalyst 8000Vでは、User Dataにスクリプトの情報を記述することによってguestshell (コンテナ)でスクリプトを実行できます。

具体的にはUser Dataにて Section: Scripts のセクションでスクリプトのURLと引数を記述しますが、筆者が検証してた際にハマり所があったため関連情報をまとめて整理します。

Section: Scripts の書式

まずは肝心要の Section: Scripts の書式や使用例ですが、下記のドキュメントに記載があります。

www.cisco.com

Section: scripts
public_url <arg1> <arg2>

しかしながら、2022年12月時点でドキュメント内に複数の書式の表記が混在しているため、筆者が実機で確認してスクリプトの実行可否を表に整理しました。

ドキュメント内の Section: Scripts の書式 (2022年12月時点)

書式 実行可否 備考
Section: scripts OK 頭文字: 小文字, 複数形
Section: Scripts OK 頭文字: 大文字, 複数形
Section: Script NG 頭文字: 大文字, 単数形

Section: Scripts セクションの2行目からはguesthellへ渡すためのスクリプトのURLや引数 (任意)を記述します。

Section: Scripts の動作をイメージ化すると下記のようになります。

Catalyst 8000Vの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分だけ重複して実行されるわけではないので留意してください。

同じ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を複数生成する回避策を見つけました。

ファイル名 (ベースURL)は重複且つURL Parameterは一意

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でスクリプトの実行結果を確認すると、ホーム ディレクトリに HelloWorld のファイルがあるため、同じベースURLのスクリプトを元に実行されているのが分かります。

[guestshell@guestshell ~]$ ls ~/
Hello  World  cloud  customdata
[guestshell@guestshell ~]$

想定ケース: 異なるURLで同一ファイル名

異なる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でスクリプトの実行結果を確認すると、ホーム ディレクトリに HelloWorld のファイルがあるため、異なる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 オプションによるファイル名の指定がないと、重複したファイルは連番が付与されます。

関連ドキュメント

myhomenwlab.hatenablog.com