■ はじめに
Network Features Coming Soon in Ansible Engine 2.9 を見ているときにたまたま知ったのですが、モジュールのオプションのデフォルトを自分で指定できる module_defaults というディレクティブがあります。
タスクごとに、毎回指定しているようなオプション(リージョン名や認証情報)は、この module_defaults
を利用すると負担が経験されるかもしれません。
module_defaults
がどのバージョンから利用できるようになったのか、changelog ではうまく見つからなかったのですが(PRはおそらくこちら)、少なくとも、Ansible 2.6 のドキュメントには module_defaults の説明ページがあります。
■ 基本的な使い方
例えば以下のように、module_defaults
として file
モジュールのオプション(ここでは owner
、group
、mode
)のデフォルト値を指定することで、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
のようなモジュールグループごとの指定もできます。
group/aws
(Amazon Web Services)group/azure
(Azure)group/gcp
(Google Cloud Platform)group/k8s
(Kubernetes)group/os
(OpenStack)
例えば、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/vmware
、group/docker
という指定で、モジュールなどのオプションデフォルト値を指定できるようです。
- VMware: Add module defaults for VMware modules by Akasurde · Pull Request #63197 · ansible/ansible · GitHub
- docker_* modules: add docker module defaults group by felixfontein · Pull Request #63164 · ansible/ansible · GitHub
■ 自分でグループ化定義もできる
(2019/11/02 追記) 自分の環境の lib/ansible/config/module_defaults.yml を修正することで、自分でグループ化定義もできます。
bigip_* モジュールをグループ化した例の記事をご紹介します。 qiita.com
■ まとめ
モジュールのオプションのデフォルトを自分で指定できる module_defaults ディレクティブについてまとめました。
同じことを繰り返し指定しなくても良くなる方法は、他にも YAML のアンカー、エイリアスといった機能もあります。
やや好みが分かれるところでもあるようなので、module_defaults
とうまく使い分けるのがよさそうです。
参考
Ansible Module defaults 検証awsbloglink.wordpress.com
- 調べ中のツイートたち
てかてか、Ansibleの Play 単位に指定できる module_defaults というディレクティブを初めて知りました。これれ「毎回タスクに認証情報指定するのめんどくさい問題」を、YAMLのアンカー、エイリアス使わずに解決できないかな。https://t.co/t0jOYZzHpp
— よこち (@akira6592) 2019年10月14日
[2022/11/14 追記] 2022に書いた類似記事。