🙆
Ansibleを試してみた(jinja2まとめ編)
jinja2のテンプレート使って色々とゴチャゴチャ考えていたらなんか各パーツを細かく分け過ぎた感があって分かりずらいなーと思った
だのでちょっと自分自身の頭の整理含めてここに残す
改めて・・・
jinja2のファイル構成
ゴチャっとしてしまったが実際は4つのカテゴリに分けられる
- ansible.cfg
- ansible自体の基本的な定義
- inventory.ini
- 対象機器を機能や役割り、OSごとに定義
- *.yml
- 挙動の定義
- *.j2
- コマンドラインのテンプレート
.
|-- after
|-- ansible.cfg
|-- before
|-- group_vars
| |-- junosleaf.yml
| `-- junosspine.yml
|-- inventory.ini
|-- junos_config.yml
|-- log
`-- roles
|-- set_int_j
| |-- tasks
| | `-- main.yml
| |-- templates
| | `-- config.j2
| `-- vars
| `-- main.yml
|-- set_ntp_j
| |-- tasks
| | `-- main.yml
| |-- templates
| | `-- config.j2
| `-- vars
| `-- main.yml
|-- show_conf_j
| |-- tasks
| | `-- main.yml
| `-- vars
| `-- main.yml
`-- show_ver_j
|-- tasks
| `-- main.yml
`-- vars
`-- main.yml
各ファイルの中身
- ansible.cfg
ban@UoVb:~/ansible$ cat ansible.cfg
[defaults]
retry_files_enabled = False #失敗時に失敗したホスト情報などを記述したretryファイルを出力するのを抑止
host_key_checking = False #SSHで一度も接続をしたことが無い時などにOpenSSHのチェック機能で警告が表示されても無視する
connect_timeout = 180 #コネクションのタイムアウト時間
command_timeout = 180 #コマンドのタイムアウト時間
ban@UoVb:~/ansible$
- inventory.ini
ban@UoVb:~/ansible$ cat inventory.ini
[junosall]
vsrx1 ansible_host=10.0.2.110 #ホスト名とIPアドレスのマッピング定義
vsrx2 ansible_host=10.0.3.110 #ホスト名とIPアドレスのマッピング定義
[junosspine]
vsrx1 ansible_host=10.0.2.110 #ホスト名とIPアドレスのマッピング定義
[junosleaf]
vsrx2 ansible_host=10.0.3.110 #ホスト名とIPアドレスのマッピング定義
[cisco]
cisco1 ansible_host=10.0.2.210 #ホスト名とIPアドレスのマッピング定義
cisco2 ansible_host=10.0.3.210 #ホスト名とIPアドレスのマッピング定義
ban@UoVb:~/ansible$
- junos_config.yml
ban@UoVb:~/ansible$ cat junos_config.yml
---
- name: Junos Configure
hosts: junosall #inventory.iniで定義しているホストを指定
strategy: free #タスクを並列で処理する
gather_facts: no #対象ホストの情報をansible_facts変数に格納するのを抑止
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 }
- { role: set_ntp_j, tags: set_ntp_j}
ban@UoVb:~/ansible$
- group_vars/junosspine.yml
ban@UoVb:~/ansible$ cat group_vars/junosspine.yml
---
set_int_j_conf: #inventory.iniでjunosspineグループのホストに対して有効なset_int_jのテンプレートに入る値。statusをaddにすればsetコマンドが投入されてdeleteにすればdeleteコマンドが投入される。
- { ifname: ge-0/0/3, desc: fromSPINEtoLEAF, status: delete }
set_ntp_j_conf: #inventory.iniでjunosspineグループのホストに対して有効なset_ntp_jのテンプレートに入る値。statusをaddにすればsetコマンドが投入されてdeleteにすればdeleteコマンドが投入される。
- { name: "", ipaddr: 1.1.1.1, status: delete }
- { name: "", ipaddr: 1.1.1.2, status: delete }
- { name: "", ipaddr: 1.1.1.3, status: delete }
ban@UoVb:~/ansible$
- group_vars/junosleaf.yml
ban@UoVb:~/ansible$ cat group_vars/junosleaf.yml
---
set_int_j_conf: #inventory.iniでjunosleafグループのホストに対して有効なset_int_jのテンプレートに入る値。statusをaddにすればsetコマンドが投入されてdeleteにすればdeleteコマンドが投入される。
- { ifname: ge-0/0/3, desc: fromLEAFtoSPINE, status: delete }
set_ntp_j_conf: #inventory.iniでjunosleafグループのホストに対して有効なset_ntp_jのテンプレートに入る値。statusをaddにすればsetコマンドが投入されてdeleteにすればdeleteコマンドが投入される。
- { name: "", ipaddr: 1.1.2.1, status: delete }
- { name: "", ipaddr: 1.1.2.2, status: delete }
- { name: "", ipaddr: 1.1.2.3, status: delete }
ban@UoVb:~/ansible$
- roles/set_int_j/tasks/main.yml
ban@UoVb:~/ansible$ cat roles/set_int_j/tasks/main.yml
---
- name: config template
cli_config: #cli_configプラグインを使用
config: "{{ lookup('template', '/home/ban/ansible/roles/set_int_j/templates/config.j2') }}" #コマンドラインではなくjinja2のテンプレートを指定
backup: yes #処理の実行前にconfigを保存
backup_options: #処理の実行前に保存するconfigの設定
filename: "{{ inventory_hostname }}_before_{{ lookup('pipe', 'date +%Y%m%d%H%M') }}" #処理の実行前に保存するconfigの名前指定
dir_path: /home/ban/ansible/before ##処理の実行前に保存するconfigの保存場所の指定
ban@UoVb:~/ansible$
- roles/set_int_j/vars/main.yml
ban@UoVb:~/ansible$ cat roles/set_int_j/vars/main.yml
---
ansible_become: true #ログインユーザーの昇格権限を付与
ansible_become_method: enable #ansible.cfgに設定したデフォルトメソッドを読み込むように設定
ansible_network_os: junos #対象OSの指定
ansible_password: ****** #実際はプレーンテキストでべた書きしてます
ansible_user: ban #ログインユーザーの指定
ansible_connection: network_cli #利用するモジュールの指定
ban@UoVb:~/ansible$
- roles/set_int_j/templates/config.j2
ban@UoVb:~/ansible$ cat roles/set_int_j/templates/config.j2
{% for setint in set_int_j_conf %} #繰り返しの設定。junos[spine|leaf].ymlで定義したset_int_j_configをsetintに代入
{% if setint.status == "add" %} #set_int_j_configのstatus: がaddだった場合の処理
set interfaces {{ setint.ifname }} description {{ setint.desc }}
{% elif setint.status == "delete" %} #set_int_j_configのstatus: がdeleteだった場合の処理
delete interfaces {{ setint.ifname }} description {{ setint.desc }}
{% endif %} #ifの終わりの定義
{% endfor %} #繰り返しの終わりの定義
ban@UoVb:~/ansible$
- roles/set_ntp_j/tasks/main.yml
- roles/set_int_j/tasks/main.ymlと同じ
ban@UoVb:~/ansible$ cat roles/set_ntp_j/tasks/main.yml
---
- name: config template
cli_config:
config: "{{ lookup('template', '/home/ban/ansible/roles/set_ntp_j/templates/config.j2') }}"
backup: yes
backup_options:
filename: "{{ inventory_hostname }}_before_{{ lookup('pipe', 'date +%Y%m%d%H%M') }}"
dir_path: /home/ban/ansible/before
ban@UoVb:~/ansible$
- roles/set_ntp_j/vars/main.yml
- roles/set_int_j/vars/main.ymlと同じ
ban@UoVb:~/ansible$ cat roles/set_ntp_j/vars/main.yml
---
ansible_become: true
ansible_become_method: enable
ansible_network_os: junos
ansible_password: *****
ansible_user: ban
ansible_connection: network_cli
ban@UoVb:~/ansible$
- roles/set_ntp_j/templates/config.j2
- コマンドラインはntpの設定用にしているだけでroles/set_int_j/templates/config.j2と同じ
ban@UoVb:~/ansible$ cat roles/set_ntp_j/templates/config.j2
{% for setint in set_ntp_j_conf %}
{% if setint.status == "add" %}
set system ntp server {{ setint.ipaddr }}
{% elif setint.status == "delete" %}
delete system ntp server {{ setint.ipaddr }}
{% endif %}
{% endfor %}
ban@UoVb:~/ansible$
- roles/show_conf_j/tasks/main.yml
ban@UoVb:~/ansible$ cat roles/show_conf_j/tasks/main.yml
---
- name: show_conf
junos_command: #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_conf_j/vars/main.yml
- 仕様するモジュールをnetwork_cliではなくnetconfに変更しているところ以外はroles/set_int_j/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 #netconfを使用
ban@UoVb:~/ansible$
- roles/show_ver_j/tasks/main.yml
- 実行するコマンドが複数ある以外はroles/show_conf_j/tasks/main.ymlと同じ
ban@UoVb:~/ansible$ cat roles/show_ver_j/tasks/main.yml
---
- name: show_ver
junos_command:
commands:
- show version #実行コマンドを指定
- show system uptime #2個目の実行コマンドを指定
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$
- roles/show_ver_j/vars/main.yml
- roles/show_conf_j/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$
Discussion