😊

Ansibleを試してみた(準備編)

に公開

Ansibleの準備

ファイル構成

こんな感じで作ってみた
今の環境にはないけどマルチベンダプロダクトの構成でもイケるようにしてみた(とりあえずjuniperとciscoを想定)

ban@UoVb:~/ansible$ tree --charset=C
.
|-- after
|-- ansible.cfg
|-- before
|-- group_vars
|-- inventory.ini
|-- junos_config.yml
|-- log
`-- roles
    |-- set_int_j
    |   `-- tasks
    |       `-- main.yml
    |-- show_conf_j
    |   |-- tasks
    |   |   `-- main.yml
    |   `-- vars
    |       `-- main.yml
    `-- show_ver_j
        |-- tasks
        |   `-- main.yml
        `-- vars
            `-- main.yml

13 directories, 8 files
ban@UoVb:~/ansible$

構成の説明

■ after
設定変更した時に設定後のconfigを保管するディレクトリ
後述のshow_conf_jとなんか組み合わせて設定変更時に設定変更終わったら自動でshow confが格納されるようにしたい

■ ansible.cfg
Ansibleが動作する時の基本的な設定を書いたファイル
今回はこんな感じのことを書いてみた

  • retry_files_enabled
    • エラー出た時のretryファイルを吐かないようにする
  • host_key_checking
    • SSHで一度も接続をしたことが無い時とかに出てきて鬱陶しいやつを無効化する
ban@UoVb:~/ansible$ cat ansible.cfg
[defaults]
retry_files_enabled = False
host_key_checking = False
connect_timeout = 180
command_timeout = 180
ban@UoVb:~/ansible$

■before
設定変更した時に設定前のconfigを保管するディレクトリ
ここには設定変更時に自動でshow confが格納されるようにする

■group_vars
今はyml形式のファイルは入れてないが、今後inventoryに書いたgroupごとに共通の何かがあればここにgroup名.ymlのファイルを作る(例えば共通のconfigをバラ撒きたいときとか)

■inventory.ini
そのまんまinventoryを書いてるだけ
ログを吐く時にファイル名で吐いた方がふつくしいのでこんな感じで書いてみた
ちなみにciscoはまだ無い・・・

ban@UoVb:~/ansible$ cat inventory.ini
[junos]
vsrx1 ansible_host=10.0.2.110
vsrx2 ansible_host=10.0.3.110

[junosact]
vsrx1 ansible_host=10.0.2.110

[junosstby]
vsrx2 ansible_host=10.0.3.110

[cisco]
cisco1 ansible_host=10.0.2.210
cisco2 ansible_host=10.0.3.210
ban@UoVb:~/ansible$

■junos_config.yml
こんな感じで書いてみた
実行したいオペレーションごとにroleを分けてみた
とりあえずお試しなのでshow confとshow verとかにしてるけどホントはvlanの設定とかbgpの設定とかにしたい
ansible-playbook実行時のtagの指定の仕方は Ansible試してみた(実行編)で

ban@UoVb:~/ansible$ cat junos_config.yml
---
- name: Junos Configure
  hosts: junos
  strategy: free
  gather_facts: no

  roles:
          - { role: show_conf_j, tags: show_conf_j }
          - { role: show_ver_j, tags: show_ver_j }
          - { role: set_int_j, tags: set_int_j }

ban@UoVb:~/ansible$

■log
show_confやらshow_verやらのログを溜めておくディレクトリ

■roles/set_int_j
roleを指定した時に読み込まれるファイルたち
ホントはset系の設定変更はjinja2とかでやりたかったがどんだけ書いてもエラー吐くし、公式ドキュメントは分かりづらいし、ホントここが一番ハマった
詳細は実行編で

■roles/show_conf_j
roleを指定した時に読み込まれるファイルたち
vars/main.yml

ban@UoVb:~/ansible$ cat roles/show_conf_j/vars/main.yml
---
ansible_become: true
ansible_become_method: enable
ansible_network_os: junos
ansible_password: **** #ファイル内にはベタ打ちしてる
ansible_user: ban
ansible_connection: netconf

ban@UoVb:~/ansible$

tasks/main.yml
contentのところのjoinは要らないけど今後、show confとあとなんか別のコマンドも一緒に取りたいと思った時のために書いてある
あと、このroleは設定変更後にshow confを取っておくためにも使う想定

ban@UoVb:~/ansible$ cat roles/show_conf_j/tasks/main.yml
---
- name: show_conf
  junos_command:
          commands: "show configuration"
  register: result

- name: output
  copy:
          content: "{{ result.stdout | join('\n\n') }}"
          dest: /home/ban/ansible/log/{{ inventory_hostname }}_conf_{{ lookup('pipe', 'date +%Y%m%d%H%M') }}

ban@UoVb:~/ansible$

■roles/show_ver_j
roleを指定した時に読み込まれるファイルたち
vars/main.yml

ban@UoVb:~/ansible$ cat roles/show_ver_j/vars/main.yml
---
ansible_become: true
ansible_become_method: enable
ansible_network_os: junos
ansible_password: **** #ファイル内にはベタ打ちしてる
ansible_user: ban
ansible_connection: netconf

ban@UoVb:~/ansible$

tasks/main.yml
contentのところのjoinはshow verとshow uptimeを両方取った時に同じファイルに吐いてもらうために書いている

ban@UoVb:~/ansible$ cat roles/show_ver_j/tasks/main.yml
---
- name: show_ver
  junos_command:
          commands:
                  - show version
                  - show system uptime
  register: result

- name: output
  copy:
          content: "{{ result.stdout | join('\n\n') }}"
          dest: /home/ban/ansible/log/{{ inventory_hostname }}_ver_{{ lookup('pipe', 'date +%Y%m%d%H%M') }}

ban@UoVb:~/ansible$

Discussion