ChefをインストールしてAristaを設定・操作する(後編)

f:id:komeiy:20140820204528p:plain

前回に引き続き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)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef活用ガイド コードではじめる構成管理

Chef活用ガイド コードではじめる構成管理