はじめに
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": [] }