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. 最後に
もっと良い方法あるよ!という方がいらっしゃいましたら
ぜひコメントいただけると嬉しいです。