Arista の ztpserver インストール~初期設定 (original : 2014/11/24)
この記事は某所で 2014/11/24
に書いたもののコピーです。
そのため 2017/05/13
時点ではやや古い情報も含まれています。
概要
本項の内容
Arista が公開している ztpserver(2014/11/24 時点の release 版である v1.1.0) を Ubuntu に手動でインストールして初期設定します。
ZTP (zero touch provisioning) とは?
ZTP とは PXE ブートみたいなプロビジョニングを Arista のスイッチで実現する方式です。
スイッチを結線して起動すると、DHCP でアドレスを取得して config ファイルや bootstrap を ztpserver から取得して初期設定されます。
スイッチでは旧来 Cisco が "Smart Install" という名前で実現している方法で、Arista の ZTP は旧来の Cisco より出来ることが多いです。
Arista の ZTP 概要(動作フローなど)は公式ドキュメント Overview 章 ZTP Overview を見ると手っ取り早く掴めます。
参考リンク
Arista EOS?
Arista EOS 自体については、以下の本をオススメしときますね。
Arista Warrior: A Real-World Guide to Understanding Arista Switches and EOS
- 作者: Gary A. Donahue
- 出版社/メーカー: O'Reilly Media
- 発売日: 2012/10/27
- メディア: ペーパーバック
- この商品を含むブログを見る
Arista ZTP に関する必読系
Packer で楽々インストール (本項では使わず)
Arista 公式で Packer も公開されているので、この辺を使うと手っ取り早く作って試せます。ネットワーク構成なども固まってしまうので、必要に応じてカスタマイズして使うのが良いと思います。本項の手動インストールでは参考資料として使いました。
事前準備
ztpserver をインストールするサーバを準備して、Python 2.7 以上をインストールしておきます。
あとは 公式の Requirement を満たせば、何でも良いと思います。
本項の環境は以下の通りです。(ztpserver は GuestOS にインストールしました。)
- ホスト:Windows7 + VirtualBox 4.3.18
- OS:Ubuntu-14.04.01-server-amd64
- CPU:1 core
- Memory:512MB
- ネットワークアダプタ1:NAT (apt などインターネット通信用)
- ネットワークアダプタ2:ホストオンリーネットワーク (ZTP する Arista との通信用)
インストール~初期設定手順
基本的に 公式のInstallation に従いつつ、必要に応じて 公式の Ubuntu12.04 用 ztpserver Packer レシピ を参考にしながら進めます。
必要パッケージインストール
とりあえず Python が 2.7 以上であることを確認します。
$ python --version Python 2.7.6
必要なパッケージを apt-get で install していきます。面倒なら適当に -y
とかつけて下さい。
ZTP v1.1.0 で bootstrap を使う場合、XMPP サーバと接続できないと異常終了してしまいます。これは ZTP 用のサーバとは別に居ても良いのですが、今回は相乗りさせるので ejabberd
も入れておきます。
$ sudo apt-get install python-setuptools python-pip python-dev li bxml2-dev libxslt-dev $ sudo apt-get install git $ sudo apt-get install libyaml-dev $ sudo apt-get install isc-dhcp-server $ sudo apt-get install ejabberd $ sudo apt-get install libapache2-mod-wsgi
ztpserver インストール
お手軽に pip install
で入れるか git clone
してコンパイルするか、お好きな方で。
ztpserver インストール (pip 版)
pip で簡単にインストールできます。これで実行したら、次項の git clone 版は実行不要です。
ファイルが /etc/
や /usr/share/
配下に展開されるので sudo
してます。
$ sudo pip install ztpserver $ ztps -v ztps version 1.1.0
ztpserver インストール (git clone 版)
pip install では味気ないと思うなら、手動でやることもできます。とはいえ、git clone して setup 叩くだけの簡単なお仕事です。
github から clone します。
$ git clone https://github.com/arista-eosplus/ztpserver.git $ cd ztpserver/ $ git show commit de90d377dd4be7f2fe5eccc70c4f3ca11c8fdc9a Author: Andrei Dvornic <advornic@aristanetworks.com> Date: Fri Nov 21 19:53:00 2014 +0000 fixes #242 diff --git a/client/bootstrap b/client/bootstrap index 0692900..5512442 100644 --- a/client/bootstrap +++ b/client/bootstrap @@ -358,7 +358,8 @@ class Node(object): self._disable_copp() except jsonrpclib.jsonrpc.ProtocolError as err: log('WARNING: unable to disable COPP: %s ' - '(can be ignored for EOS-4.11.x and older)' % err) + '(platform/EOS version might not support this feature)' % + err) global SYSTEM_ID #pylint: disable=W0603 SYSTEM_ID = \ @@ -397,8 +398,9 @@ class Node(object): 'show management api http-commands | grep running') def _disable_copp(self): - # COPP does not apply to vEOS - if self.system()['model'] != 'vEOS': + # COPP does not apply to vEOS or EOS-4.11.x and earlier + if (self.system()['model'] != 'vEOS' and + int(self.system()['version'].split('.')[1]) < 12): self.api_config_cmds(['control-plane', 'no service-policy input copp-system-policy'])
2014/11/24 時点のリリース版を checkout します。
$ git checkout v1.1.0 Note: checking out 'v1.1.0'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b new_branch_name HEAD is now at 269e7c2... Merge pull request #199 from arista-eosplus/rtd-docs $ git show commit 269e7c264c459c3af13104d28a9fd140cb3be47d Merge: 53fb159 4731287 Author: Jere Julian <jerearista@users.noreply.github.com> Date: Wed Aug 27 19:25:06 2014 -0400 Merge pull request #199 from arista-eosplus/rtd-docs Add capability for sphinx at ReadTheDocs to find bootstrap and actions docstrings $ ls -alh total 100K drwxrwxr-x 11 kotetsu kotetsu 4.0K Nov 23 00:42 . drwxr-xr-x 4 kotetsu kotetsu 4.0K Nov 23 00:40 .. drwxrwxr-x 2 kotetsu kotetsu 4.0K Nov 23 00:42 actions drwxrwxr-x 2 kotetsu kotetsu 4.0K Nov 23 00:42 bin -rw-rw-r-- 1 kotetsu kotetsu 20 Nov 23 00:42 CHANGELOG.md drwxrwxr-x 3 kotetsu kotetsu 4.0K Nov 23 00:42 client drwxrwxr-x 2 kotetsu kotetsu 4.0K Nov 23 00:42 conf -rw-rw-r-- 1 kotetsu kotetsu 1.8K Nov 23 00:41 CONTRIBUTING.md drwxrwxr-x 3 kotetsu kotetsu 4.0K Nov 23 00:42 docs drwxrwxr-x 8 kotetsu kotetsu 4.0K Nov 23 00:42 .git -rw-rw-r-- 1 kotetsu kotetsu 400 Nov 23 00:42 .gitignore -rw-rw-r-- 1 kotetsu kotetsu 300 Nov 23 00:41 INSTALL.md -rw-rw-r-- 1 kotetsu kotetsu 2.3K Nov 23 00:42 LICENSE -rw-rw-r-- 1 kotetsu kotetsu 2.0K Nov 23 00:42 Makefile -rw-rw-r-- 1 kotetsu kotetsu 96 Nov 23 00:42 MANIFEST.in -rw-rw-r-- 1 kotetsu kotetsu 1.1K Nov 23 00:42 .pylintrc -rw-rw-r-- 1 kotetsu kotetsu 2.5K Nov 23 00:41 README.md -rw-rw-r-- 1 kotetsu kotetsu 55 Nov 23 00:41 requirements.txt -rw-rw-r-- 1 kotetsu kotetsu 37 Nov 23 00:41 setup.cfg -rw-rw-r-- 1 kotetsu kotetsu 3.2K Nov 23 00:42 setup.py drwxrwxr-x 6 kotetsu kotetsu 4.0K Nov 23 00:41 test -rw-rw-r-- 1 kotetsu kotetsu 353 Nov 23 00:41 .travis.yml drwxrwxr-x 2 kotetsu kotetsu 4.0K Nov 23 00:41 utils -rw-rw-r-- 1 kotetsu kotetsu 6 Nov 23 00:42 VERSION drwxrwxr-x 2 kotetsu kotetsu 4.0K Nov 23 00:42 ztpserver
build ~ install します。
ファイルが /etc/
や /usr/share/
配下に展開されるので sudo
してます。
$ python setup.py build $ sudo python setup.py install $ ztps -v ztps version 1.1.0
DHCPサーバ (isc-dhcp-server) の設定
/etc/dhcp/dhcpd.conf
に環境に合わせた設定を追加しておきます。
domain-name 関係は今回使っていないので、設定しません。(内部 DNS サーバを使って、XMPPサーバや ZTP サーバをドメインで渡す場合には設定して下さい。本項では面倒なのでやっていないだけで、公式 Packer ではそうしています。)
以下例で range
に指定しているのは、ZTP の DHCP シーケンス中で一時的に Arista に付与されるアドレスなので、複数機器を同時に多数 ZTP 処理するような場合には広めにとっておきましょう。
option bootfile-name
には ZTP サーバのアドレスを入れておきます。ポート番号や path はこのままで OK です。
/etc/dhcp/dhcpd.conf
の追加設定例
#Subnet created for VEOS devices subnet 192.168.101.0 netmask 255.255.255.0 { range 192.168.101.61 192.168.101.69; option bootfile-name "http://192.168.101.16:8080/bootstrap"; default-lease-time 86400; max-lease-time 86400; }
サービス起動
$ sudo service isc-dhcp-server start
runlevel は 2345 になっている筈です。/etc/init/isc-dhcp-server.conf
参照。
XMPP サーバ (ejabberd) の設定
bootstrap を使うために必要なので、設定します。多分、startup-config ファイルを配布する方式だけを使う場合には、XMPP サーバは不要だと思います。
まず /etc/ejabberd/ejaejabberd.cfg
を編集。
以下設定例で ztpsadmin
の部分は、この後登録する ejabberd の admin ユーザ名です。(何でも良いです。)
%% Admin user {acl, admin, {user, "ztpsadmin", "localhost"}}.
ejabberd の admin ユーザを登録します。以下例では ztpsadmin
が設定ファイルにも書いたユーザ名で eosplus
はパスワード文字列です。
$ sudo ejabberdctl register ztpsadmin localhost eosplus User ztpsadmin@localhost successfully registered
サービスを起動します。
$ sudo service ejabberd restart Restarting jabber server: ejabberd is not running. Starting ejabberd.
$ ejabberd status
とか見ても、正常なのか良く分からなかったので、Web ブラウザで動作確認しました。http://<ejabberd 入れたサーバの IP アドレス>:5280/admin
にアクセスしてユーザ名に ztpsadmin@localhost
を、パスワードに eosplus
を入力して、何かオレンジの画面が出たらきっと動いてます。WebUI で設定変更とか出来るようです。
ztpserver の設定
ZTP の方式によって色々とカスタマイズできる個別設定は別項として、ここでは共通設定を済ませておきます。
例によって 公式の Configuration と 公式の Examples に従い、必要に応じて 公式 Packer で配布している設定ファイル群 を参考に進めます。
Global configuration file (/etc/ztpserver/ztpserver.conf) 編集
/etc/ztpserver/ztpserver.conf
を編集します。
デフォルトの identifier = serialnumber
を identifier = systemmac
にしています。自分が試した vEOS (公式で配布されている仮想OS)は、ZTP シーケンス時 serialnumber を空で ZTP サーバに送信していたので、identifier = serialnumber
だと異常終了してしまったからです。
[default] # Location of all ztps boostrap process data files data_root = /usr/share/ztpserver # UID used in the /nodes structure (either systemmac or serialnumber) identifier = systemmac # Server URL to-be-advertised to clients (via POST replies) during the bootstrap process server_url = http://192.168.101.16:8080 # Enable local logging logging = True # Enable console logging console_logging = True # Globally disable topology validation in the bootstrap process disable_topology_validation = False [server] # Note: this section only applies to using the standalone server. If # running under a WSGI server, these values are ignored # Interface to which the server will bind to (0:0:0:0 will bind to # all available IPv4 addresses on the local machine) interface = 192.168.101.16 # TCP listening port port = 8080 [ files] # Path for the files directory (overriding data_root/files) folder = files path_prefix = /usr/share/ztpserver [actions] # Path for the actions directory (overriding data_root/actions) folder = actions path_prefix = /usr/share/ztpserver [bootstrap] # Path for the bootstrap directory (overriding data_root/bootstrap) folder = bootstrap path_prefix = /usr/share/ztpserver # Bootstrap filename filename = bootstrap [neighbordb] # Neighbordb filename (file located in data_root) filename = neighbordb
bootstrap 設定ファイル (/usr/share/ztpserver/bootstrap/bootstrap.conf) 編集
これは bootstrap 方式で ZTP する場合にだけ使われるので、共通設定とはいえないかもですが。
/usr/share/ztpserver/bootstrap/bootstrap.conf
を編集します。xmpp のところには、ejaejabberd で設定した username
と password
を書きます。domain は本項の環境では使わないので、IP アドレスを。
logging: - destination: file:/tmp/ztps-log level: DEBUG xmpp: username: ztpsadmin password: eosplus domain: 192.168.101.16 msg_type : debug rooms: - xmpproom
ztpserver 起動
以下のように起動します。ZTP の方式によってはシーケンス中に /usr/share/ztpserver/
配下にファイル生成するので、sudo
してます。
$ sudo ztps --debug INFO: [app:115] Logging started for ztpserver INFO: [app:116] Using repository /usr/share/ztpserver DEBUG: [controller:776] server URL: http://192.168.101.16:8080 Starting server on http://192.168.101.16:8080
おわり
インストールと初期設定だけなので、特筆すべき点はないです。