てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Network Resource Module で実際に実行されるコマンドを確認する方法

はじめに

Ansible のネットワークモジュールの中には、コンフィグを直接指定しないタイプのものがあります。

中でも Ansible 2.9 から追加された Network Resource Module の機能は強力です。

とはいえ、ネットワークエンジニアとしては「実際どういうコマンドが実行されたの?」が気になるのではないでしょうか。

この記事では、ios_interfaces モジュールを例に、実行コマンドを確認する方法をご紹介します。

サンプル Playbook

GigabitEthernet1GigabitEthernet2description を設定する 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": []
}