Ansibleのios_command等の各タスクの認証情報は「provider」1行でキメる

  • 11
    いいね
  • 0
    コメント

1. 普通に指定すると冗長になってしまう

Cisco IOSに対応したモジュール ios_command や ios_config などでは、
ネットワーク機器にログインするための認証情報を指定する必要があります。
ios_config - Manage Cisco IOS configuration sectionsでいう
以下のようなオプションです。

  • username: ログインユーザー名
  • password: ログインパスワード
  • authorize: 特権モードが必要かどうか
  • auth_pass: 特権パスワード

これに従って素直にPlaybookを書くと以下のように冗長になってしまいます。
(各変数は別途定義してあるものとします)

個別指定
---
- hosts: cisco        # インベントリファイルで定義したciscoグループが操作対象
  gather_facts: no
  connection: local

  tasks:
    - name: change password
      ios_config:         # 1つ目のタスク
        host: "{{ inventory_hostname }}"  
        lines:
          - username ope password opeope
        username: "{{ ansible_user }}"       # 1つ目のタスクに対する認証情報
        password: "{{ ansible_password }}"  
        authorize: true
        auth_pass: "{{ cisco_enable_secret }}"

    - name: save config
      ios_command:        # 2つ目のタスク
        host: "{{ inventory_hostname }}" 
        commands:
          - write memory
        username: "{{ ansible_user }}"       # 2つ目のタスクに対する認証情報
        password: "{{ ansible_password }}"  
        authorize: true
        auth_pass: "{{ cisco_enable_secret }}"

2. providerによる認証情報の指定方法

以下のようにusernameなどの認証情報を辞書でまとめて、
各タスクのproviderオプションで指定してあげればスッキリします。

providerによる指定
---
- hosts: cisco
  gather_facts: no
  connection: local

  tasks:
    - name: change password
      ios_config:
        lines:
          - username ope password opeope
        provider: "{{ cli }}"   # ★下で定義する認証情報を一括で渡す

    - name: save config
      ios_command:
        commands:
          - write memory
        provider: "{{ cli }}"   # ★下で定義する認証情報を一括で渡す

  vars:    # 説明がしやすいようにPlaybook内で変数定義
    cli:   # ★★providerに渡すための辞書を定義★★
      host:     "{{ inventory_hostname }}"
      username: "{{ ansible_user }}"
      password: "{{ ansible_password }}"
      authorize: true
      auth_pass: "{{ cisco_enable_secret }}"

この方法は「Ansibleで複数のCatalystのパスワードを一括変更する」でも
書いていた方法なのですが、参考になればと思いこの件だけ書き出してみました。

なお、ios_config - Manage Cisco IOS configuration sections
providerオプションの説明には

Convience method that allows all ios arguments to be passed as a dict object. All constraints (required, choices, etc) must be met either by individual arguments or values in this dict.

程度しか書いてなく、また、参考になるPlaybookも少ないため、
当初、具体的に何のオプションをproviderでまとめられるのか分かりませんでした。
なので、 ios.pyあたりのソースを確認してみると、
以下のパラメータがまとめられそうなことが分かりました。

  • host
  • port
  • username
  • password
  • ssh_keyfile
  • authorize
  • auth_pass
  • provider
  • timeout

3. 別のアプローチ

スッキリさせるための別のアプローチです。
YAMLにはマージ記法というのがあって、ある個所に書いたものを別の個所で
使いまわすことができるそうです。こちらは汎用性高そうですね。

4. 最後に

もっと良い方法あるよ!という方がいらっしゃいましたら
ぜひコメントいただけると嬉しいです。