はじめに
Ansible のネットワークモジュールの中には、コンフィグを直接指定しないタイプのものがあります。
中でも Ansible 2.9 から追加された Network Resource Module の機能は強力です。
とはいえ、ネットワークエンジニアとしては「実際どういうコマンドが実行されたの?」が気になるのではないでしょうか。
この記事では、ios_interfaces モジュールを例に、実行コマンドを確認する方法をご紹介します。
サンプル Playbook
GigabitEthernet1 と GigabitEthernet2 に description を設定する Playbook です。
大まかな流れは、最初にチェックモードでタスクを実行し、戻り値内の commands で実行コマンドを表示して、実際に設定変更、です。
--- - hosts: rt01 gather_facts: false vars: # 設定内容を変数で定義 config: - name: GigabitEthernet1 description: desc1 enabled: True - name: GigabitEthernet2 description: desc2 enabled: True tasks: - name: 1. check mode # チェックモードで実行 ios_interfaces: config: "{{ config }}" register: result check_mode: true # タスク単位でチェックモードを有効 - name: 2. debug execute commands # 実行コマンドを確認 debug: msg: "{{ result.commands }}" - name: 3. set # 実際に設定変更 ios_interfaces: config: "{{ config }}" state: merged
補足
このサンプルでは、実際に設定変更を行う処理の前に、投入コマンドを表示させる意図で 1. check mode のタスクをチェックモードに指定しています。本来、特にチェックモードにしなくても commands は返ってきますが、その場合は実際に設定変更したあとの事後報告となります。
チェックモード実行後にコマンドを確認して、人による処理の中止や継続の判断をはさみたい場合、2 と 3 の間に、pause モジュールを挟むという方法があります。
実行
事前のネットワーク機器側のコンフィグ(抜粋)は以下の状態とします。
interface GigabitEthernet1 ip address 192.168.1.11 255.255.255.0 negotiation auto ! interface GigabitEthernet2 description desc2 ip address 10.0.0.1 255.255.255.0
Playbook で指定した、GigabitEthernet1 には description が設定されておらず、GigabitEthernet2 は Playbook で指定したものが設定されています。
この状態で、Playbook を実行します。
$ ansible-playbook -i inventory.ini ios_config.yml
PLAY [rt01] ************************************************************************************
TASK [1. check mode] ***************************************************************************
changed: [rt01]
TASK [2. debug execute commands] ***************************************************************
ok: [rt01] => {
"msg": [
"interface GigabitEthernet1",
"description desc1"
]
}
TASK [3. set] **********************************************************************************
changed: [rt01]
PLAY RECAP *************************************************************************************
rt01 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2. debug execute commands のタスクで、実行コマンドが表示されたことが分かります。
GigabitEthernet2 には既に意図する description が設定されていたことを Ansible が認識したため、 GigabitEthernet2 への設定コマンドは含まれていません。
なお、事後はこうなります。無事に設定されました。
interface GigabitEthernet1 description desc1 ip address 192.168.1.11 255.255.255.0 ! interface GigabitEthernet2 description desc2 ip address 10.0.0.1 255.255.255.0
もう一度 Playbook を実行すると、実行するコマンドがないので、msg の表示は以下のようにあります。
ok: [rt01] => { "msg": [] }