Ansible操作例 – Arista EOSの操作方法の説明

スポンサーリンク

AnsibleでArista EOSを操作する方法を説明します。showコマンドの出力を得たい時はeos_commandを使用し、複数の設定を投入したい時はeos_configを使います。その他、冪等性を担保しつつ慎重な設定を行うeos_system, eos_userなどのモジュールもあります。

Arista EOSへの接続方法が分からない方は「Ansible操作例 – Arista EOSへの接続方法の説明」を参照ください。

showコマンドの実行

プレイブック作成

以下のようなプレイブックを作成します。

着目して欲しいのはregister句です。Ansibleは実行結果を変数に格納する事ができ、その変数名を定義するのがregister句です。以下のプレイブックは、「show version」の実行結果を変数「eos_result」に格納し、変数「eos_result」をdebugで出力する例です。

cat << EOS > arista_eos_show_version.yml
---
- hosts: arista_eos
  gather_facts: no

  tasks:
    - name: send show version
      eos_command:
        commands: "show version"
      register: eos_results
    - name: display show version
      debug:
        var: eos_results
EOF

戻り値の一覧

Ansibleは実行結果を変数に格納する事ができます。この実行結果をプログラミングの文脈では「戻り値」と呼ぶ事が多く、公式ドキュメントでは「Return Value」との表現を使っています。実行結果にどのような値が格納されているかは、公式ドキュメントをマニュアルを参照ください。この場合ならば、「eos command モジュール」に記載されています。

eos commandのマニュアル

実行結果

実行結果は以下のようになります。

# ansible-playbook -i inventory.ini arista_eos_show_version.yml

PLAY [arista_eos] **************************************************************

TASK [send show version] *******************************************************
ok: [arista64]

TASK [display show version] ****************************************************
ok: [arista64] => {
    "eos_results": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": false,
        "failed": false,
        "stdout": [
            "vEOS\nHardware version:      \nSerial number:         \nHardware MAC address:  0050.562d.30f7\nSystem MAC address:    0050.562d.30f7\n\nSoftware image version: 4.24.1.1F\nArchitecture:           x86_64\nInternal build version: 4.24.1.1F-17183145.42411F\nInternal build ID:      2327dbcf-7ab8-4276-bd86-0d3e61a824fe\n\nUptime:                 0 weeks, 0 days, 11 hours and 2 minutes\nTotal memory:           2014416 kB\nFree memory:            886132 kB"
        ],
        "stdout_lines": [
            [
                "vEOS",
                "Hardware version:      ",
                "Serial number:         ",
                "Hardware MAC address:  0050.562d.30f7",
                "System MAC address:    0050.562d.30f7",
                "",
                "Software image version: 4.24.1.1F",
                "Architecture:           x86_64",
                "Internal build version: 4.24.1.1F-17183145.42411F",
                "Internal build ID:      2327dbcf-7ab8-4276-bd86-0d3e61a824fe",
                "",
                "Uptime:                 0 weeks, 0 days, 11 hours and 2 minutes",
                "Total memory:           2014416 kB",
                "Free memory:            886132 kB"
            ]
        ]
    }
}

PLAY RECAP *********************************************************************
arista64                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

複数コマンドの実行

プレイブック作成

複数のコマンドを同時に投入したい時はeos_configモジュールを使用すると便利です。以下は5エントリのACLを作成する例です。

cat << EOF > arista_eos_add_acl_entry.yml
---
- hosts: arista_eos
  gather_facts: no

  tasks:
    - name: load new acl into device
      eos_config:
        lines:
          - 10 permit ip host 192.0.2.1 any log
          - 20 permit ip host 192.0.2.2 any log
          - 30 permit ip host 192.0.2.3 any log
          - 40 permit ip host 192.0.2.4 any log
          - 50 permit ip host 192.0.2.5 any log
        parents: ip access-list extended test
        before: no ip access-list extended test
        match: exact
EOF

プレイブック実行

プレイブックを実行すると以下のように出力されます。

# ansible-playbook -i inventory.ini arista_eos_add_acl_entry.yml

PLAY [arista_eos] **************************************************************

TASK [load new acl into device] ************************************************
changed: [arista64]

PLAY RECAP *********************************************************************
arista64                   : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

プレイブック確認

確かにプレイブックで記載された設定が投入されている事を確認します。

R64#show ip access-lists test
IP Access List test
        10 permit ip host 192.0.2.1 any log
        20 permit ip host 192.0.2.2 any log
        30 permit ip host 192.0.2.3 any log
        40 permit ip host 192.0.2.4 any log
        50 permit ip host 192.0.2.5 any log

テンプレートの利用

テンプレートの作成

Ansibleはテンプレートを作成し、そのテンプレートに記載されたconfigを流し込む事ができます。

以下にテンプレートの例を紹介します。ここで記載したテンプレートは静的なものですが、Ansibleが内部的に使うJinja2と呼ばれるテンプレートエンジンは変数読み込みや繰り返し処理も実装する事ができます。説明は省略しますが、JavaやRubyの実装経験がある人ならばJSP, ERBなどとほぼ同等機能と思って差支えございません。

cat << EOF > eos_template.j2
vrf instance VRF10
!
vlan 10
!
interface Vlan10
  vrf VRF10
  ip address 192.168.10.1/24
!
interface Ethernet1
   switchport mode trunk
EOF

プレイブックの作成

テンプレートを流し込むプレイブックの例を紹介します。backupをyesとすると設定流し込み前の設定をバックアップする事もできます。

cat << EOF > arista_eos_add_ipv4_address.yml
---
- hosts: arista_eos
  gather_facts: no

  tasks:
    - name: render a Jinja2 template onto an Arista switch
      eos_config:
        backup: yes
        src: eos_template.j2
EOF

テンプレート実行

プレイブックを実行すると以下のように出力されます。

# ansible-playbook -i inventory.ini arista_eos_add_ipv4_address.yml

PLAY [arista_eos] **************************************************************

TASK [render a Jinja2 template onto an Arista switch] **************************
changed: [arista64]

PLAY RECAP *********************************************************************
arista64                   : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

プレイブック確認

確かにプレイブックで記載された設定が投入されている事を確認します。

R64#conf t
R64(config)#int vlan 10
R64(config-if-Vl10)#show active
interface Vlan10
   vrf VRF10
   ip address 192.168.10.1/24

バックアップファイルの確認

Ansible実行前の設定がバックアップされている事を確認します。

# ls -l backup/
total 8
-rw------- 1 root root 1274 Aug 28 22:37 arista64_config.2020-08-28@22:37:54
-rw------- 1 root root 1274 Aug 28 22:40 arista64_config.2020-08-28@22:40:03

手堅い設定投入

概要

Ansibleは、前述のeos_command, eos_config以外のモジュールを使用する事を推奨しています。eos_system, eos_logginなどのモジュールが該当し、これらは「冪等性」が担保されたモジュールです。

「冪等性」とは「再実行しても得られる結果が同じ」という意味ですが、私個人の見解としては、「一般的な意味の冪等性」と「Ansibleの文脈での冪等性」はニュアンスが異なると理解しています。前述のeos_configは何度実行しても「changed」と表示されますが、eos_system, eos_loggingなどのモジュールは設定変更が発生してない場合は「ok」のみが表示されます。Ansibleの文脈での「冪等性」とは、プレイブックを何度も実行するような運用において、changeなのかokなのかが目視チェックしやすい仕組みと理解した方が良いでしょう。

例えば、以下スクリーンショットならば、syslogは設定変更されたもののDNSはそのままである事が一目瞭然です。

冪等性のあるAnsibleモジュールの実行例

プレイブック作成

DNSサーバとsyslogサーバを設定する例を紹介します。

cat << EOF > arista_eos_modify_eos_services.yml
---
- hosts: arista_eos
  gather_facts: no

  tasks:
    - name: configure name servers
      eos_system:
        name_servers:
          - 8.8.8.8
          - 8.8.4.4
    - name: configure host logging
      eos_logging:
        dest: host
        name: 172.16.0.1
        state: present
EOF

プレイブック実行

プレイブックを実行すると以下のように出力されます。

# ansible-playbook -i inventory.ini arista_eos_modify_eos_services.yml

PLAY [arista_eos] **************************************************************

TASK [configure name servers] **************************************************
changed: [arista64]

TASK [configure host logging] **************************************************
ok: [arista64]

PLAY RECAP *********************************************************************
arista64                   : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

プレイブック確認

確かにプレイブックで記載された設定が投入されている事を確認します。

R64#show ip name
8.8.8.8
8.8.4.4
R64#
R64#
R64#show running-config | i logging
logging host 172.16.0.1 514
R64#
タイトルとURLをコピーしました