【问题标题】:Ansible: Include variables file under role/xyzrole/main.ymlAnsible:在角色/xyzrole/main.yml 下包含变量文件
【发布时间】:2021-04-05 14:11:55
【问题描述】:

我有一些变量不会改变,而一些变量会不时改变。 我希望角色中的 main.yml 列出所有静态变量,对于动态变量,我想将它们放在不同的文件中,并且每次发生更改时只包含新文件。

像这样:

ma​​in.yml:

---
var1: somevalue
var2: anothervalue
var3:
  var3.1: somevalue that changes
  var3.2: anothervalue that changes

除此之外,我想执行以下操作:

ma​​in.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"}

有什么想法吗?是否可以在角色/角色名/vars/main.yml 中执行此操作?

【问题讨论】:

  • 说实话,听起来你只是做错了。如果您有经常更改的变量,则应在清单中设置它们,而不是在角色中。
  • @杰克,谢谢!是的,这是一个选项,但是这些变量会发生变化,而这些变量不会发生变化,因此我喜欢将它们放在一起。感谢您调查。

标签: ansible roles


【解决方案1】:

有很多选项取决于具体的用例。例如,使用默认值。给定角色

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

当然,也可以将变量放入文件中并在剧本中使用该文件。例如

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

根据您的需要调整默认值/变量、路径和组合。

【讨论】:

  • 非常感谢一如既往,您的答案总是有据可查并经过测试。我不想将变量包含在任务文件夹中,认为这不是纯粹的方法,即roles/role3/vars/main.yml 拥有一切,我只是想通过将更改的变量分离到另一个文件中并将它们包含在vars/main.yml 中所以我可以跟踪变量更改的历史记录。就这些。在这种情况下,看起来 vars 文件夹的 main.yml 中的任何类型的 include 都不起作用。再次感谢。
  • 可以读取vars/main中的文件。我已经更新了答案。如果您有其他问题,请打开一个新问题。谢谢你们的cmets。
  • 再次感谢您!最新的似乎是更好、更可靠的角色做事方式。我会实施这个。
猜你喜欢
  • 2014-12-20
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多