module_defaultsいじってPlaybookみやすくしてみる(BIGIPモジュール)


module_defaultsとは

Ansibleのplaginの一つでモジュールの一部を共通化することができる
サーバ系のものは割と定義されているんですが、そこに登録されていない、
BIG-IPモジュールでも有効に使えそうだと感じたので記事にしてみました。

公式ドキュメントはこちら
https://docs.ansible.com/ansible/latest/user_guide/playbooks_module_defaults.html

例えば、BIG-IPモジュールには下記のようなものがあります

sample.yml
- 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だとどうでしょうか

sample2.yml
---
- 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:

完成形

after.yml
---
- 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でプルリクだせば追加してくれそうな気もするので、できれば出してみたいと思います。