一部のansibleロール(例:roles/my-role/
)には、かなり大きなデフォルト変数ファイル(defaults/main.yml
)があります。 main.yml
をいくつかの小さなファイルに分割したいと思います。それは可能ですか?
defaults/1.yml
およびdefaults/2.yml
ファイルを作成しようとしましたが、ansibleによってロードされません。
以下で説明する機能は、Ansible 2.6以降で使用可能ですが、v2.6.2でバグ修正が、v2.7で別の(マイナー)修正が適用されました。
古いバージョンのソリューションを確認するには、ポールの回答を参照してください。
defaults/main/
defaults/main.yml
を作成する代わりに、directory—defaults/main/
—とすべてのYAMLファイルをそこに配置します。
defaults/main.yml
→defaults/main/*.yml
Ansibleはそのディレクトリ内に*.yml
ファイルをロードするため、roles/my-role/defaults/main/{1,2}.yml
のようにファイルに名前を付けることができます。
古いファイルdefaults/main.yml
は存在しないことに注意してください。 このGithubコメント を参照してください。
vars/main/
ところで、上記の解決策はvars/
でも機能します:
vars/main.yml
→vars/main/*.yml
この機能はv2.6で導入されました— git commit 、 Pull Request 、 Githubの主な問題 。
2つのバグ修正がありました。
2.6を使用していない場合(おそらくそうする必要がありますが、常にオプションではないことを理解しています)、 include_vars が役立つ場合があります。
- name: Include vars of stuff.yaml into the 'stuff' variable (2.2).
include_vars:
file: stuff.yaml
name: stuff
- name: Conditionally decide to load in variables into 'plans' when x is 0, otherwise do not. (2.2)
include_vars:
file: contingency_plan.yaml
name: plans
when: x == 0
- name: Load a variable file based on the OS type, or a default if not found. Using free-form to specify the file.
include_vars: "{{ item }}"
with_first_found:
- "{{ ansible_distribution }}.yaml"
- "{{ ansible_os_family }}.yaml"
- default.yaml
- name: Bare include (free-form)
include_vars: myvars.yaml
- name: Include all .json and .jsn files in vars/all and all nested directories (2.3)
include_vars:
dir: vars/all
extensions:
- json
- jsn
- name: Include all default extension files in vars/all and all nested directories and save the output in test. (2.2)
include_vars:
dir: vars/all
name: test
- name: Include default extension files in vars/services (2.2)
include_vars:
dir: vars/services
depth: 1
- name: Include only files matching bastion.yaml (2.2)
include_vars:
dir: vars
files_matching: bastion.yaml
ただし、これはタスクディレクティブであることに注意してください。それをデフォルトファイル自体に含めることができるほどきれいではありません。