如何将一个 ansible 角色的 `defaults/main.yml` 文件拆分成多个文件?
How to split an ansible role's `defaults/main.yml` file into multiple files?
在某些 ansible 角色中(例如 roles/my-role/
),我有相当大的默认变量文件(defaults/main.yml
)。我想将 main.yml
分成几个较小的文件。可以吗?
我已经尝试创建文件 defaults/1.yml
和 defaults/2.yml
,但它们没有被 ansible 加载。
我在下面描述的功能从 Ansible 2.6 开始可用,但在 v2.6.2 中有一个错误修复,在 v2.7 中有另一个(次要)错误修复。
要查看旧版本的解决方案,请参阅 Paul 的回答。
defaults/main/
不是创建 defaults/main.yml
,而是创建一个 目录 — defaults/main/
— 并将所有 YAML 文件放在那里。
defaults/main.yml
→defaults/main/*.yml
Ansible 将加载该目录中的任何 *.yml
文件,因此您可以将文件命名为 roles/my-role/defaults/main/{1,2}.yml
.
请注意,旧文件 — defaults/main.yml
— 一定不存在。参见 this Github comment。
vars/main/
顺便说一句,上述解决方案也适用于vars/
:
vars/main.yml
→vars/main/*.yml
更多详情
该功能已在 v2.6 中引入 — git commit, Pull Request, main Github issue.
修复了两个错误:
- v2.7 修复:git commit, Pull Request — backported to v2.6.2: commit, Pull Request
- v2.7 修复:git commit, Pull Request, bug discussion
如果您不使用 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
请注意,这是一个任务指令。它不像能够将其包含到默认文件本身那样简洁。
在某些 ansible 角色中(例如 roles/my-role/
),我有相当大的默认变量文件(defaults/main.yml
)。我想将 main.yml
分成几个较小的文件。可以吗?
我已经尝试创建文件 defaults/1.yml
和 defaults/2.yml
,但它们没有被 ansible 加载。
我在下面描述的功能从 Ansible 2.6 开始可用,但在 v2.6.2 中有一个错误修复,在 v2.7 中有另一个(次要)错误修复。
要查看旧版本的解决方案,请参阅 Paul 的回答。
defaults/main/
不是创建 defaults/main.yml
,而是创建一个 目录 — defaults/main/
— 并将所有 YAML 文件放在那里。
defaults/main.yml
→defaults/main/*.yml
Ansible 将加载该目录中的任何 *.yml
文件,因此您可以将文件命名为 roles/my-role/defaults/main/{1,2}.yml
.
请注意,旧文件 — defaults/main.yml
— 一定不存在。参见 this Github comment。
vars/main/
顺便说一句,上述解决方案也适用于vars/
:
vars/main.yml
→vars/main/*.yml
更多详情
该功能已在 v2.6 中引入 — git commit, Pull Request, main Github issue.
修复了两个错误:
- v2.7 修复:git commit, Pull Request — backported to v2.6.2: commit, Pull Request
- v2.7 修复:git commit, Pull Request, bug discussion
如果您不使用 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
请注意,这是一个任务指令。它不像能够将其包含到默认文件本身那样简洁。