LoginSignup
17
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-08

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. 最後に

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

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18