🙆

Ansibleを試してみた(jinja2まとめ編)

2024/12/31に公開

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