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、路径和组合。