てくなべ (tekunabe)

ansible / network / automation

[Ansible] モジュールのオプションのデフォルトを自分で指定できる module_defaults

■ はじめに

Network Features Coming Soon in Ansible Engine 2.9 を見ているときにたまたま知ったのですが、モジュールのオプションのデフォルトを自分で指定できる module_defaults というディレクティブがあります。

タスクごとに、毎回指定しているようなオプション(リージョン名や認証情報)は、この module_defaults を利用すると負担が経験されるかもしれません。

docs.ansible.com

module_defaults がどのバージョンから利用できるようになったのか、changelog ではうまく見つからなかったのですが(PRはおそらくこちら)、少なくとも、Ansible 2.6 のドキュメントには module_defaults の説明ページがあります。


■ 基本的な使い方

例えば以下のように、module_defaults として file モジュールのオプション(ここでは ownergroupmode)のデフォルト値を指定することで、tasks 内の全 file モジュールのデフォルト値として適用されます。

- hosts: localhost
  module_defaults:
    file:
      owner: root
      group: root
      mode: 0755
  tasks:
    - file:
        state: touch
        path: /tmp/file1
    - file:
        state: touch
        path: /tmp/file2
    - file:
        state: touch
        path: /tmp/file3


■ Play、Role、Block、Task に指定できる

Playbook Keywords によると、module_defaults は、Play、Role、Block、Task に指定できるようです。


クラウド系モジュールなどはまとめて指定できる

Ansible 2.7 以降は、プレビュー機能という位置づけで、モジュールをグループで指定できようになりました。

具体的には、Module defaults groups に書かれているように、以下の系統のモジュールについては、一つ一つのモジュールごとの指定だけでなく、 group/aws のようなモジュールグループごとの指定もできます。

例えば、AWS 系モジュールであれば、以下のように group/aws で各モジュールのデフォルト値をまとめて指定できます。

- hosts: localhost
  module_defaults:
    group/aws:
      region: us-west-1   # デフォルトとしてここだけにに指定

  tasks:
    ec2_vpc_net:
        # その他オプション
    ec2_vpc_subnet:
        # その他オプション
    ec2_vpc_route_table:
        # その他オプション

もし、module_defaults を指定しない場合は、以下のようにタスクごとに指定するかたちになります。

- hosts: localhost

  tasks:
    - ec2_vpc_net:
        region: us-east-1   # 毎回指定
        # その他オプション
    - ec2_vpc_subnet:
        region: us-east-1   # 毎回指定
        # その他オプション
    - ec2_vpc_route_table:
        region: us-east-1   # 毎回指定
        # その他オプション

なお、Ansible 2.7 から、グループ名と所属モジュールの関係は lib/ansible/config/module_defaults.ymlという定義ファイルにまとめられています。


VMware、Docker 系モジュールもグループとして追加予定

Ansible 2.10 では、VMware 系のモジュール、Docker 系モジュールもそれぞれグループ定義が追加され、group/vmwaregroup/docker という指定で、モジュールなどのオプションデフォルト値を指定できるようです。

■ 自分でグループ化定義もできる

(2019/11/02 追記) 自分の環境の lib/ansible/config/module_defaults.yml を修正することで、自分でグループ化定義もできます。

bigip_* モジュールをグループ化した例の記事をご紹介します。 qiita.com


■ まとめ

モジュールのオプションのデフォルトを自分で指定できる module_defaults ディレクティブについてまとめました。

同じことを繰り返し指定しなくても良くなる方法は、他にも YAML のアンカー、エイリアスといった機能もあります。 やや好みが分かれるところでもあるようなので、module_defaults とうまく使い分けるのがよさそうです。

参考

Ansible Module defaults 検証awsbloglink.wordpress.com

  • 調べ中のツイートたち