Ansible:在 role/xyzrole/main.yml 下包含变量文件
Ansible: Include variables file under role/xyzrole/main.yml
我有一些变量不会改变,而有些变量会不时改变。
我希望角色中的 main.yml 列出所有静态变量,对于动态变量,我想将它们放在不同的文件中,每次发生变化时只包含新文件。
像这样:
main.yml:
---
var1: somevalue
var2: anothervalue
var3:
var3.1: somevalue that changes
var3.2: anothervalue that changes
相反,我想执行以下操作:
main.yml:
---
var1: somevalue
var2: anothervalue
invlude_vars: varsfile.yml
varsfile.yml:
---
var3:
var3.1: somevalue that changes
var3.2: anothervalue that changes
这样我就不必触摸 main.yml,而是每次有任何变化时都更改 varsfile.yml。
我试过了,以以下错误结束:
fatal: [hostnamehidden]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'var3.1' is undefined\n\nThe error appears to be in '.../tasks/main.yml': line 7, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Some tasks is getting executed here^ here\n"}
有什么想法吗?是否可以在 roles/rolename/vars/main.yml?
中完全做到这一点
根据具体的用例,有很多选项。例如,使用默认值。鉴于角色
shell> cat roles/role3/defaults/main.yml
var1: somevalue
var2: anothervalue
var3:
var3.1: "{{ somevalue_that_changes|default('UNDEFINED') }}"
var3.2: "{{ anothervalue_that_changes|default('UNDEFINED') }}"
shell> cat roles/role3/tasks/main.yml
- debug:
var: var3
剧本
shell> cat playbook.yml
- hosts: localhost
roles:
- role3
给予
shell> ansible-playbook playbook.yml
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: UNDEFINED
var3.2: UNDEFINED
如果您定义变量,例如在命令行上,剧本给出
shell> ansible-playbook playbook.yml -e somevalue_that_changes=XYZ
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: XYZ
var3.2: UNDEFINED
当然,也可以把变量放到一个文件中,然后在playbook中使用这个文件。例如
shell> cat varsfile.yml
somevalue_that_changes: XYZ
anothervalue_that_changes: 123
shell> cat playbook.yml
- hosts: localhost
vars_files:
- varsfile.yml
roles:
- role3
给予
shell> ansible-playbook playbook.yml
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: XYZ
var3.2: '123'
可以在角色而不是剧本中包含数据。例如
shell> cat roles/role3/tasks/main.yml
- include_vars: varsfile.yml
- debug:
var: var3
给予
shell> ansible-playbook playbook.yml
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: XYZ
var3.2: '123'
问:"将变化的变量分离到另一个文件中,并包含在vars/main.yml"
答:使用lookup plugin file。比如将变化的变量放入文件
shell> cat files/varsfile.yml
var3.1: XYZ
var3.2: 123
将文件中不断变化的变量与默认值合并
shell> cat roles/role3/defaults/main.yml
var1: somevalue
var2: anothervalue
var3_default:
var3.1: "{{ somevalue_that_changes|default('UNDEFINED') }}"
var3.2: "{{ anothervalue_that_changes|default('UNDEFINED') }}"
shell> cat roles/role3/vars/main.yml
var3: "{{ var3_default|combine(lookup('file', 'varsfile.yml')|from_yaml) }}"
然后,调试任务
shell> cat roles/role3/tasks/main.yml
- debug:
var: var3
给予
var3:
var3.1: XYZ
var3.2: 123
相当灵活。例如,如果您省略 var3.1
shell> cat files/varsfile.yml
var3.2: 123
结果是
var3:
var3.1: UNDEFINED
var3.2: 123
除此之外,您仍然可以覆盖默认值。例如,
shell> ansible-playbook playbook.yml -e somevalue_that_changes=ABC
给予
var3:
var3.1: ABC
var3.2: 123
根据您的需要调整 defaults/vars、路径和组合。
我有一些变量不会改变,而有些变量会不时改变。 我希望角色中的 main.yml 列出所有静态变量,对于动态变量,我想将它们放在不同的文件中,每次发生变化时只包含新文件。
像这样:
main.yml:
---
var1: somevalue
var2: anothervalue
var3:
var3.1: somevalue that changes
var3.2: anothervalue that changes
相反,我想执行以下操作:
main.yml:
---
var1: somevalue
var2: anothervalue
invlude_vars: varsfile.yml
varsfile.yml:
---
var3:
var3.1: somevalue that changes
var3.2: anothervalue that changes
这样我就不必触摸 main.yml,而是每次有任何变化时都更改 varsfile.yml。 我试过了,以以下错误结束:
fatal: [hostnamehidden]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'var3.1' is undefined\n\nThe error appears to be in '.../tasks/main.yml': line 7, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Some tasks is getting executed here^ here\n"}
有什么想法吗?是否可以在 roles/rolename/vars/main.yml?
中完全做到这一点根据具体的用例,有很多选项。例如,使用默认值。鉴于角色
shell> cat roles/role3/defaults/main.yml
var1: somevalue
var2: anothervalue
var3:
var3.1: "{{ somevalue_that_changes|default('UNDEFINED') }}"
var3.2: "{{ anothervalue_that_changes|default('UNDEFINED') }}"
shell> cat roles/role3/tasks/main.yml
- debug:
var: var3
剧本
shell> cat playbook.yml
- hosts: localhost
roles:
- role3
给予
shell> ansible-playbook playbook.yml
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: UNDEFINED
var3.2: UNDEFINED
如果您定义变量,例如在命令行上,剧本给出
shell> ansible-playbook playbook.yml -e somevalue_that_changes=XYZ
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: XYZ
var3.2: UNDEFINED
当然,也可以把变量放到一个文件中,然后在playbook中使用这个文件。例如
shell> cat varsfile.yml
somevalue_that_changes: XYZ
anothervalue_that_changes: 123
shell> cat playbook.yml
- hosts: localhost
vars_files:
- varsfile.yml
roles:
- role3
给予
shell> ansible-playbook playbook.yml
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: XYZ
var3.2: '123'
可以在角色而不是剧本中包含数据。例如
shell> cat roles/role3/tasks/main.yml
- include_vars: varsfile.yml
- debug:
var: var3
给予
shell> ansible-playbook playbook.yml
TASK [role3 : debug] ****
ok: [localhost] =>
var3:
var3.1: XYZ
var3.2: '123'
问:"将变化的变量分离到另一个文件中,并包含在vars/main.yml"
答:使用lookup plugin file。比如将变化的变量放入文件
shell> cat files/varsfile.yml
var3.1: XYZ
var3.2: 123
将文件中不断变化的变量与默认值合并
shell> cat roles/role3/defaults/main.yml
var1: somevalue
var2: anothervalue
var3_default:
var3.1: "{{ somevalue_that_changes|default('UNDEFINED') }}"
var3.2: "{{ anothervalue_that_changes|default('UNDEFINED') }}"
shell> cat roles/role3/vars/main.yml
var3: "{{ var3_default|combine(lookup('file', 'varsfile.yml')|from_yaml) }}"
然后,调试任务
shell> cat roles/role3/tasks/main.yml
- debug:
var: var3
给予
var3:
var3.1: XYZ
var3.2: 123
相当灵活。例如,如果您省略 var3.1
shell> cat files/varsfile.yml
var3.2: 123
结果是
var3:
var3.1: UNDEFINED
var3.2: 123
除此之外,您仍然可以覆盖默认值。例如,
shell> ansible-playbook playbook.yml -e somevalue_that_changes=ABC
给予
var3:
var3.1: ABC
var3.2: 123
根据您的需要调整 defaults/vars、路径和组合。