module_defaultsとは
Ansibleのplaginの一つでモジュールの一部を共通化することができる
サーバ系のものは割と定義されているんですが、そこに登録されていない、
BIG-IPモジュールでも有効に使えそうだと感じたので記事にしてみました。
公式ドキュメントはこちら
https://docs.ansible.com/ansible/latest/user_guide/playbooks_module_defaults.html
例えば、BIG-IPモジュールには下記のようなものがあります
- name: パーテーション作成
bigip_partition:
state: present
name: "{{ system_name }}"
description: "{{ system_name}}_partition"
provider:
server: "{{ inventory_hostname }}"
user: "{{ user }}"
password: "{{ password }}"
transport: rest
server_port: "{{ port }}"
validate_certs: false
register: Pertition_log
delegate_to: localhost
このモジュールではproviderの中にuser,passwordなどを指定しています
モジュール一つで良ければさほど気にならないかも知れないですが。
こんなPlaybookだとどうでしょうか
---
- hosts: BIGIP
gather_facts: no
tasks:
- name: パーテーション作成
bigip_partition:
state: present
name: SystemPartition
description: TestPartition
provider:
server: "{{ inventory_hostname }}"
user: "{{ user }}"
password: "{{ password }}"
transport: rest
server_port: "{{ port }}"
validate_certs: false
register: log1
delegate_to: localhost
- name: ノード作成
bigip_node:
state: disabled
name: Node_192.168.1.11
host: 192.168.1.11
description: TestNode
provider:
server: "{{ inventory_hostname }}"
user: "{{ user }}"
password: "{{ password }}"
transport: rest
server_port: "{{ port }}"
validate_certs: false
register: log2
delegate_to: localhost
- name: HTTPプロファイル作成
bigip_profile_http:
state: present
name: HttpProf-Test
insert_xforwarded_for: yes
redirect_rewrite: all
description: TestProfile
provider:
server: "{{ inventory_hostname }}"
user: "{{ user }}"
password: "{{ password }}"
transport: rest
server_port: "{{ port }}"
validate_certs: false
register: log3
delegate_to: localhost
なんども何度も同じことを書かなくてはいけないことがわかると思います。
これが***面倒くさい!***と思っていたところにちょうどmodule_defaultsの存在を知りました
module_defaultsがあるところ
https://github.com/ansible/ansible/blob/devel/lib/ansible/config/module_defaults.yml
自分の環境の
ansible->config->module_defaults.ymlに下記を追記
bigip_node:
- bigip
bigip_partition:
- bigip
bigip_profile_http:
- bigip
書き込んだらPlaybookを編集します。
module_defaultsを定義し、どこのgroupに所属するモジュールか選択します。
これは先程module_defaults.ymlに書き込んだbigipを指定します。
moduls_defalts:
group/bigip:
完成形
---
- hosts: BIGIP
gather_facts: no
module_defaults:
group/bigip:
provider:
server: "{{ inventory_hostname }}"
user: admin
password: bigipve
transport: rest
validate_certs: no
tasks:
- name: パーテーション作成
bigip_partition:
state: present
name: SystemPartition
description: TestPartition
register: log1
delegate_to: localhost
- name: ノード作成
bigip_node:
state: disabled
name: Node_192.168.1.11
host: 192.168.1.11
description: TestNode
register: log2
delegate_to: localhost
- name: HTTPプロファイル作成
bigip_profile_http:
state: present
name: HttpProf-Test
insert_xforwarded_for: yes
redirect_rewrite: all
description: TestProfile
register: log3
delegate_to: localhost
明らかに可読性が上がってますね!(断言)
まとめ
こんかい試したBIG-IPのモジュールに限らず、ACIモジュールなどもmoduleごとにuser/passなどを指定します。
そんなときにこのmodule_defaultsをちょっと編集するだけで、playbookの可読性を上げることができます。
こちらgithubでプルリクだせば追加してくれそうな気もするので、できれば出してみたいと思います。