他の言語でもお読みいただけます:
English,
日本語,
Français.
この演習は 演習 4 - Ansible ネットワークリソースモジュールに基づいています。 演習を始める前に、演習 4 を完了させてください。
この演習には 2 つのパートがあります。
- 設定用の
stateパラメーターを扱います
replacedoverridden
さらに merged で確認したものと対比します。
- 読み取り専用の
stateパラメーターを扱います
renderedparsed
さらに gathered パラメーターと比較します。
-
Arista スイッチにログインします。演習 4 のコンフィグが既に適用されていることを前提としています。
vlan 20 name desktops ! vlan 30 name servers ! vlan 40 name printers ! vlan 50 name DMZ
-
コントロールノードのターミナルから、
ssh rtr2に続いてenableと入力します。$ ssh rtr2 Last login: Wed Sep 1 13:44:55 2021 from 44.192.105.112 rtr2>enable -
configure terminalコマンドを使用して、手動でAristaのコンフィグを変更します。rtr2#configure terminal rtr2(config)# -
ここで vlan 50 を
state suspendに設定します。rtr2(config)#vlan 50 rtr2(config-vlan-50)#state ? active VLAN Active State suspend VLAN Suspended State rtr2(config-vlan-50)#state suspend
-
コンフィグを保存します。
rtr2(config-vlan-50)#exit rtr2(config)#end rtr2#copy running-config startup-config Copy completed successfully.
-
コンフィグを確認します。
rtr2#sh run | s vlan vlan 20 name desktops ! vlan 30 name servers ! vlan 40 name printers ! vlan 50 name DMZ state suspend
- running-configuration は Playbook と一致しなくなりました! vlan 50 は現在 suspend という状態です。
-
ansible-navigator runコマンドを使用して、Playbook を実行します。$ ansible-navigator run resource.yml --mode stdout
-
以下のように表示されます。
[student@ansible-1 network-workshop]$ ansible-navigator run resource.yml --mode stdout PLAY [configure VLANs] ********************************************************* TASK [use vlans resource module] *********************************************** ok: [rtr4] ok: [rtr2] PLAY RECAP ********************************************************************* rtr2 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 rtr4 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
Playbook はコンフィグを変更しませんでした。
state: mergedは、指定された構成がネットワークデバイスに存在することのみを強制します。Arista デバイスにログインすると、まだstate suspendが表示されます。
-
Playbook
resource.ymlを変更して、state: mergedをstate: replacedにします。 -
Playbook は以下のようになります。
--- - name: configure VLANs hosts: arista gather_facts: false tasks: - name: use vlans resource module arista.eos.vlans: state: replaced config: - name: desktops vlan_id: 20 - name: servers vlan_id: 30 - name: printers vlan_id: 40 - name: DMZ vlan_id: 50
-
ansible-navigator runコマンドを使用して Playbook を実行します。 タスクは 1 つしかないので、--mode stdoutを使用できます。$ ansible-navigator run resource.yml --mode stdout
-
以下のように表示されます。
$ ansible-navigator run resource.yml --mode stdout PLAY [configure VLANs] ********************************************************* TASK [use vlans resource module] *********************************************** changed: [rtr4] changed: [rtr2] PLAY RECAP ********************************************************************* rtr2 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 rtr4 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
rtr2 のコンフィグを確認すると
state suspendがなくなっています。replacedは、指定された設定を (指定された VLAN に対して) 強制します。これは、state: suspendが指定されておらず、VLAN のデフォルトではないため、ネットワークデバイスからstate suspendが削除されることを意味します。
-
rtr2に vlan 100 を追加します。rtr2(config)#vlan 100 rtr2(config-vlan-100)#name ? WORD The ASCII name for the VLAN rtr2(config-vlan-100)#name artisanal
-
誰かが自動化の外でこの VLAN を作成したと想定できます (たとえば、VLAN を手作業で作成した、今回の場合 artisanal VLAN)。これは、アウトオブバンドのネットワークの変更と呼ばれます。これはネットワーク業界で非常によくあることで、ネットワークエンジニアが問題を解決した後、文書化したり、この設定を削除するために周到に準備したりすることがなかったからです。この手動による構成の変更は、ベストプラクティスや文書化されたポリシーと一致しません。これにより、誰かが将来この VLAN を使用しようとして、この設定を認識しないという問題が発生する可能性があります。
rtr2#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 20 desktops active 30 servers active 40 printers active 50 DMZ active 100 artisanal active
-
Playbook を再実行します。VLAN 100 は削除されません。
-
再度 Playbook を変更します。今回は
state: overriddenを使用します。--- - name: configure VLANs hosts: arista gather_facts: false tasks: - name: use vlans resource module arista.eos.vlans: state: overridden config: - name: desktops vlan_id: 20 - name: servers vlan_id: 30 - name: printers vlan_id: 40 - name: DMZ vlan_id: 50
-
ansible-navigator runコマンドを使用して、Playbook を実行します。$ ansible-navigator run resource.yml --mode stdout
-
デバイス
rtr2にログインして、VLAN を確認します。rtr2#show vlan VLAN Name Status Ports ----- -------------------------------- --------- ------------------------------- 1 default active 20 desktops active 30 servers active 40 printers active 50 DMZ active
-
artisanal VLAN 100 が削除されました! 同じリソースモジュールを使用して、ネットワークデバイスを設定するだけでなく、どの VLAN を構成するかを強制することもできます。これはポリシーの適用と呼ばれ、構成管理の大部分を占めます。
mergedからreplaced、overriddenへの移行は、ネットワークチームが自動化にますます自信を持てるようになるにつれて、多くの場合、自動化ジャーニーと一致します。
ここで、読み取り専用パラメーターの使用に戻りましょう。これらのパラメーターは、ネットワークデバイスの設定を変更しません。演習 4 では、state: gathered を使用して、Arista ネットワークデバイスから VLAN の設定を取得しました。今回は、rendered を使用して、Arista の設定コマンドを取得します。
-
Playbook
resource.ymlを変更して、state: renderedします。 -
タスクの実行結果を変数
rendered_configに登録します。 -
ターミナルウィンドウに出力するために
debugタスクを追加します。 -
Playbook は以下のようになります。
{% raw %}
- name: use vlans resource module
arista.eos.vlans:
state: rendered
config:
- name: desktops
vlan_id: 20
- name: servers
vlan_id: 30
- name: printers
vlan_id: 40
- name: DMZ
vlan_id: 50
register: rendered_config
- name: use vlans resource module
debug:
msg: "{{ rendered_config }}"{% endraw %}
-
ansible-navigator runコマンドを使用して、Playbook を実行します。$ ansible-navigator run resource.yml --mode stdout
-
以下のように表示されます。
[student@ansible-1 network-workshop]$ ansible-navigator run resource.yml --mode stdout PLAY [configure VLANs] ********************************************************* TASK [use vlans resource module] *********************************************** ok: [rtr2] ok: [rtr4] TASK [use vlans resource module] *********************************************** ok: [rtr4] => { "msg": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "rendered": [ "vlan 20", "name desktops", "vlan 30", "name servers", "vlan 40", "name printers", "vlan 50", "name DMZ" ] } } ok: [rtr2] => { "msg": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "rendered": [ "vlan 20", "name desktops", "vlan 30", "name servers", "vlan 40", "name printers", "vlan 50", "name DMZ" ] } } PLAY RECAP ********************************************************************* rtr2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 rtr4 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
renderedキーでは、設定の生成に使用される Arista コマンドが表示されます!これにより、ネットワーク自動化担当者は、実際に自動化を実行してコマンドを適用する前に、どのコマンドが実行されるかを正確に知ることができます。
最後に、parsed パラメーターについて説明します。このパラメーターは、既存のファイルにネットワークデバイスのコンフィグが含まれている場合に使用されます。すでにバックアップが実行されている場合を想像してください。
- まずコンフィグをバックアップします。コンフィグをバックアップするシンプルな Playbook はこちらです。 backup.yml
{% raw %}
---
- name: backup config
hosts: arista
gather_facts: false
tasks:
- name: retrieve backup
arista.eos.config:
backup: true
backup_options:
filename: "{{ inventory_hostname }}.txt"{% endraw %}
-
Playbook を実行します。
$ ansible-navigator run backup.yml --mode stdout
-
バックアップファイルが生成されたことを確認します。
$ ls backup rtr2.txt rtr4.txt
-
ここで、
parsedを使用するように Playbookresource.ymlを変更します。
{% raw %}
---
- name: use parsed
hosts: arista
gather_facts: false
tasks:
- name: use vlans resource module
arista.eos.vlans:
state: parsed
running_config: "{{ lookup('file', 'backup/{{ inventory_hostname }}.txt') }}"
register: parsed_config
- name: print to terminal screen
debug:
msg: "{{ parsed_config }}"{% endraw %}
-
いくつか追加の変更があります
configの代わりにrunning-configを利用してバックアップファイルを指定しています。- モジュールの実行結果を
parsed_config変数に登録しています。 - debug モジュールを使用して
parsed_config変数を出力しています。
-
Playbook を実行します。
$ ansible-navigator run resource.yml --mode stdout
-
以下のように表示されます。
[student@ansible-1 network-workshop]$ ansible-navigator run resource.yml --mode stdout PLAY [use parsed] ************************************************************** TASK [use vlans resource module] *********************************************** ok: [rtr4] ok: [rtr2] TASK [print to terminal screen] ************************************************ ok: [rtr2] => { "msg": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "parsed": [ { "name": "desktops", "state": "active", "vlan_id": 20 }, { "name": "servers", "state": "active", "vlan_id": 30 }, { "name": "printers", "state": "active", "vlan_id": 40 }, { "name": "DMZ", "state": "active", "vlan_id": 50 } ] } } ok: [rtr4] => { "msg": { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "parsed": [ { "name": "desktops", "state": "active", "vlan_id": 20 }, { "name": "servers", "state": "active", "vlan_id": 30 }, { "name": "printers", "state": "active", "vlan_id": 40 }, { "name": "DMZ", "state": "active", "vlan_id": 50 } ] } } PLAY RECAP ********************************************************************* rtr2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 rtr4 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
上記の出力では、フラットファイル形式のバックアップが、構造化データにパースされていることがわかります。
"parsed": [ { "name": "desktops", "state": "active", "vlan_id": 20 }
-
デフォルトの出力は JSON ですが、YAML に簡単に変換できます。
追加の設定用 state パラメーターについて扱いました:
replaced- 指定された VLAN を矯正overridden- すべての VLAN を矯正
merged から replaced 、overridden へと移行することは、ネットワークチームが自動化により自信を深めるにつれて、自動化ジャーニーをたどります。
読み取り専用の state パラメーターについても扱いました。
rendered- 希望するコンフィギュレーションを生成するコマンドを表示しまKparsed- フラットファイルの設定(バックアップなど)を構造化されたデータに変換(実機は変更せず)
これらにより、ネットワーク自動化ツールは、切断された環境などのシナリオでリソースモジュールを使用できます。ネットワークリソースモジュールは、異なるネットワークデバイス間で一貫したエクスペリエンスを提供します。
ネットワークリソースモジュールのドキュメントには、更に情報が掲載されています。
完成した Ansible Playbook は、回答キーとしてここで提供されています。
追加の演習を完了しました!