0

有没有办法使用 host_vars/ 或 group vars/ 或者就此而言 defaults/ 或任何类型的变量插件,some_playbook.yml它们使用自定义集合。导入的角色看不到任何变量。

# some_collection
galaxy.yml
playbooks
 |_playbook.yml
roles
 |_autopatch  <-- is templated i.e. do auto patching and take "datetime" as variable
 |_role2

host_vars 的理想情况,因为它可以是每个主机。显然,如果我在集群中有 2 台服务器,我无法硬编码日期并让它们同时重新启动。

inventory
collections.yml
group_vars
host_vars
some_playbook.yml
---
# some_playbook.yml
- hosts: all
  name: 
  tasks:
    import_role: namespace.some_collection.autopatch

现在我得到

TASK [namespace.some_collection.autopatch : Setup autopatch cron file] *****************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ansible.errors.AnsibleUndefinedVariable: 'datetime' is undefined

现在,我可以做到这一点,但它并不能真正与hosts: all.

  tasks:
    import_role: namespace.some_collection.autopatch
  vars:
    datetime: "yolo"
4

1 回答 1

0

当然这是可能的,只是弄清楚我的问题是什么,这很愚蠢。

我正在从一个单一的 ansible repo 迁移到基于更扁平更简洁结构的集合(我们有很多 ansible)。我的 group_vars/ 和 host_vars/ 文件夹不是顶级的,它们嵌套在库存目录中,并且已修复:

inventory
collections.yml
group_vars
host_vars
  |_hostname1
       |_base.yml         # <--- put host_var here
  |_hostname2
       |_base.yml         # <--- put host_var here
some_playbook.yml
---
# base.yml
the_hosts_specific_datetime: some_time

我确实发现传递datetime: "{{ datetime }}"会导致递归错误,因此将 var 命名为特定的名称可以让您将其传递到集合中。

- import_role: 
  name: namespace.some_collection.autopatch
  vars:
    datetime: "{{ the_hosts_specific_datetime }}"
于 2021-05-10T11:23:35.580 回答