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オプションで指定してあげればスッキリします。
---
- 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] (https://github.com/ansible/ansible/blob/stable-2.1/lib/ansible/module_utils/ios.py#L123)あたりのソースを確認してみると、
以下のパラメータがまとめられそうなことが分かりました。
- host
- port
- username
- password
- ssh_keyfile
- authorize
- auth_pass
- provider
- timeout
3. 別のアプローチ
スッキリさせるための別のアプローチです。
YAMLにはマージ記法というのがあって、ある個所に書いたものを別の個所で
使いまわすことができるそうです。こちらは汎用性高そうですね。
4. 最後に
もっと良い方法あるよ!という方がいらっしゃいましたら
ぜひコメントいただけると嬉しいです。
