ChefをインストールしてAristaを設定・操作する(後編)
前回に引き続きAristaとChefについて書きます。 そもそもネットワークはポート設定やVLAN設定など、統一できない箇所が多く果たしてChefを使う意味があるのか。そんなことを考えながら今回AristaとChefを試してみて感じたことは以下の通り。
- グローバルコンフィグで使いたい
- メーカーに関わらず大規模な設定変更に使いたい
- バージョン管理、設定の統一性、チーム開発での管理にはやはり良さそう(chefなので)
結局、つまらないコンフィグ変更をターミナルたくさん開いてやるのは嫌なので、ChefでもAnsibleでもいいのですが是非ネットワークも何か共通化してほしいところです。
それでは、Arista(EOS)の設定です。特にマニュアルがないので頑張ります。
EOS Extensionインストール
まずAristaに必要なextensionをインストールする必要があります。通常のサーバへのインストールとは違うので注意してください。今回費用となるchefとdvopsの2つのrpmを適宜ダウンロードしてEOSへ導入してください。
今回は下記のバージョンを使用しています。
- chef-11.6.0-1.el6.i686.rpm
- devops-0.1.1-1.noarch.rpm
TFTPなどでextension領域にコピーして以下の通り、インストールを行います。
arista-kensho#extension devops-0.1.1-1.noarch.rpm arista-kensho#copy installed-extensions boot-extensions Copy completed successfully.
問題なくインストールできれば以下のコマンドで確認できます。
Status部分がInstallの「I」になっているはずです。
arista-kensho#show extensions Name Version/Release Status RPMs ------------------------------------------ ------------------------- ------ ---- chef-11.6.0-1.el6.i686.rpm 11.6.0/1.el6 A, I 1 devops-0.1.1-1.noarch.rpm 0.1.1/1 A, I 1
Arista(EOS)へChef Clientをインストール
ここからは通常のクライアントの設定です。knifeコマンドも使えるようになっているはずです。分からない人は前回のエントリを参考に進めてください。
今回、/persist/local/chefに設定ファイルや鍵を配置している点に注意してください。
bash-4.1# ls /persist/local/chef admin.pem client.pem client.rb validation.pem
devops設定
ChefサーバとのやりとりはChefクライアントが担いますが、Aristaのコンフィグレーション部分をdevopsが実施します。Recipeの中にrun.commandsで出てきていました。
devopsの使い方は -h オプションで出てきますね。 まずはVLAN一覧を表示してみます。
[admin@arista-kensho .ssh]$ devops vlan list { "message": "connection error (1)", "result": null, "status": 404 }
コネクションエラーになりました。実はdevopsはshellからEOSのAPIを叩いているので、その設定が必要です。
ここで設定するUSERNAMEはEOS側で作成が必要です。また、HOSTNAMEはEOSのhostnameではなくアクセスするために必要な名前です。DNSかhostsで解決できるものを使用してください。
$ vi /mnt/flash/devops.conf [main] USERNAME = apiadmin PASSWORD = admin HOSTNAME = localhost PORT = 80 PROTOCOL = http LEVEL = DEBUG
EOS側でAPI関連の設定も忘れずに。 もう一度、devopsを確認してみます。
[admin@arista-kensho ~]$ devops vlan list { "message": "OK", "result": { "1": { "name": "default", "vlan_id": "1" }, "10": { "name": "VLAN0010", "vlan_id": "10" } }, "status": 200 }
問題ありませんでした。chef-clientとdevopsの準備が完了しました。
Arista向けのレシピ確認
まずはgithubからレシピをchefサーバにレポジトリごとコピーしてください。
https://github.com/aristanetworks/chef-eos
ざっくりこんな構造になってます。
chef-eos/ - cookbook - LICENSE - README.md - cookbooks - eos/ - attributes - files - libraries - providers - recipes - resources - ohai/ - attributes - files - recipes
まずはrecipes配下のdefault.rbを確認します。
# cat default.rb ohai "load_eos" do action :reload plugin "eos" end
次にvlan.rbを確認します。「config」はget_config()で取得しているようです。覚えておきます。
# cat vlan.rb config = get_config() if config.has_key?('vlans') config['vlans'].each do |name, attribs| Chef::Log.info "Processing vlan #{name}" if attribs['state'] == 'absent' eos_vlan name do vlan_id attribs['vlan_id'].to_s action :remove end else eos_vlan name do vlan_id attribs['vlan_id'].to_s action :manage end end
次にlibraries内を確認します。get_config()が定義されていました。
libraries/eos_config.rb def get_config() config_provider = node[:eos][:config][:provider]
続きを見ると、コンフィグはdatabagを使用していることがわかります。data_bagsはchef用語なのですが、nodeに直接紐づかない設定パラメータなどをjson形式で設置するものです。
default[:eos][:config][:provider] = "databag" identifier = node[:eos][:config][:identifier] default[:eos][:config][:identifier] = "hostname" `````` ※ databagについては以下がしっかりと書かれているので参考にしてみてください。 http://inokara.hateblo.jp/entry/2013/05/05/084251 あとは、関連するところ以下にを抜粋しました。このエントリーを書いている現時点でマニュアルはないので自力で読みます。 ```` libraries/default.rb def run_command(command, jsonify=false) command.run_command() providers/vlan.rb action :manage do def create_vlan def edit_vlan action :remove do resources vlan.rb actions :manage, :remove default_action :manage attribute :name, :kind_of => String, :name_attribute => true attribute :vlan_id, :kind_of => String, :required => true attribute :state, :kind_of => String, :equal_to => ['present', 'absent'] attr_accessor :exists attribute/default.rb default[:eos][:config][:identifier] = "hostname" default[:eos][:config][:databag] = "eos_config" default[:eos][:config][:provider] = "databag" normal[:ohai][:plugin_path] = "/persist/local/chef/ohai_plugins" normal[:ohai][:plugins][:eos] = "ohai"
設定パラメータを作成するためにdatabagを作成するのですが、マニュアルもなければサンプルもないので自分で読み解いてトライ&エラーでやってみます。
ちなみにdatabagはknife data bagコマンドで作成可能です。
# knife data bag create eos_config arista-kensho Created data_bag[eos_config] ERROR: RuntimeError: Please set EDITOR environment variable [root@chef-server chef-eos]# export EDITOR=$(which vi)
エラーが出るので環境変数を設定して再度作成します。 edit/showなども使えます。
# knife data bag create eos_config arista-kensho Created data_bag[eos_config] Created data_bag_item[arista-kensho] { "id" : "arista-kensho", "vlans":[ { "name" : "testvlan", "vlan_id" : "99", "state" : "present" } ] }
json形式で必要そうなパラメータをvlansに設定し、chef nodeを認識するためのidを入れてみました。
レシピを確認すると、idはデフォルトでhostnameとなっていますが、以下が選べるようです。
- hostname
- macaddress
- serialnum
- model
knifeコマンドでレシピをアップロードしたら、chefクライアントを実施します。
-bash-4.1# chef-client -c /persist/local/chef/client.rb ========================== Recipe Compile Error in /var/chef/cache/cookbooks/eos/recipes/vlan.rb ========================== NoMethodError ------------- undefined method `[]' for nil:NilClass 39>> if attribs['state'] == 'absent'
エラーが出てしまいました。datbagの作りがレシピにマッチしてないのでしょうか。実はnameとattribsの部分がどうも理解できず、ここでかなり苦戦しました。アドバイスをもらいつつ、結局databagは最初のままにレシピを少しいじらせてもらいました。
※ 修正版レシピはgitでやりとりすべきと思いますので、一旦ここでの紹介は控えます。
成功した場合の出力は以下の通りです。
bash-4.1# chef-client -c /persist/local/chef/client.rb - Vlan testvlan will be created - manage will create vlan testvlan Recipe: <Dynamically Defined Resource> * execute[devops vlan create] action run[2014-08-19T23:07:16+09:00] INFO: Processing execute[devops vlan create] action run (/var/chef/cache/cookbooks/eos/providers/vlan.rb line 90) { "message": "Created", "result": { "name": "testvlan", "vlan_id": "99" }, "status": 201 } [2014-08-19T23:07:17+09:00] INFO: execute[devops vlan create] ran successfully - execute devops vlan create 99 --name testvlan Chef Client finished, 3 resources updated
devopsとEOSのコマンドで確認してみます。
bash-4.1# devops vlan list { "message": "OK", "result": { "1": { "name": "default", "vlan_id": "1" }, "10": { "name": "VLAN0010", "vlan_id": "10" }, "99": { "name": "testvlan", "vlan_id": "99" } }, "status": 200 } arista-kensho#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 10 VLAN0010 active 99 testvlan active
削除の場合はdatabagのstateを変更します。
chef clientを再度実行することで反映できます。
bash-4.1# chef-client -c /persist/local/chef/client.rb - remove vlan testvlan Recipe: <Dynamically Defined Resource> * execute[devops vlan delete] action run[2014-08-19T23:08:29+09:00] INFO: Processing execute[devops vlan delete] action run (/var/chef/cache/cookbooks/eos/providers/vlan.rb line 55) { "message": "OK", "result": null, "status": 200 } [2014-08-19T23:08:30+09:00] INFO: execute[devops vlan delete] ran successfully - execute devops vlan delete 99 Chef Client finished, 3 resources updated
削除されている事を確認します。
bash-4.1# devops vlan list { "message": "OK", "result": { "1": { "name": "default", "vlan_id": "1" }, "10": { "name": "VLAN0010", "vlan_id": "10" } }, "status": 200 } arista-kensho#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 10 VLAN0010 active
スケジュールを設定してchef-clientを実行させることも可能です。 個人的にはコミットのタイミングは自分で制御したいので、chef server側からknife sshを使う方が良いかなと思います。
arista-kensho(config)#schedule chef-client interval 10 max-log-files 20 command bash sudo chef-client -c /persist/local/chef/client.rb
無事にchef server経由でvlanの作成と削除ができました。他にはport-channel, swichport, interfaceなどの設定が可能です。
今回、1台のAristaに対して設定を行いましたが台数が出てきてメリットが出てくるかと思います。あとはdevopsの設定項目が増えてほしいです。
今後、ネットワーク全体でビジネスから一旦離れたところで
面白い技術ネタが出てくるような動きがあるといいですね。
シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。
Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)
- 作者: 吉羽龍太郎,安藤祐介,伊藤直也,菅井祐太朗,並河祐貴
- 出版社/メーカー: 技術評論社
- 発売日: 2014/05/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
- 作者: 澤登亨彦,樋口大輔,クリエーションライン株式会社
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/04/25
- メディア: 大型本
- この商品を含むブログを見る