【问题标题】:variable undefined in ansible playbook with group_vars/all.yml使用 group_vars/all.yml 在 ansible 剧本中未定义的变量
【发布时间】:2022-11-18 17:36:23
【问题描述】:

我正在尝试在 ansible 剧本中动态设置 hosts 值。这意味着在 group_vars/all.yml 中,我有正确的主机 IP,ansible 应该使用它来连接。我必须这样做,因为我事先没有 IP。在运行下面描述的角色之前,我运行了一个创建服务器的角色,只有在那之后我才有了 IP。

这是我的playbook.yml

- name: do_something
  hosts: 
    - "{{ NETWORK.IP }}"
  roles:
    - my_role

文件group_vars/all.yml 看起来像这样:

NETWORK:
    IP: 10.0.0.1

当我执行时,我得到:

$ ansible-playbook playbook.yml
...
ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'NETWORK' is undefined

The error appears to be in 'playbook.yml': line X, column Y, but may
be elsewhere in the file depending on the exact syntax problem.

我试过了使用不同的东西,例如

  • 在本地主机上的早期任务中使用 set_facts 模块设置变量
  • 在剧本中使用 gather_facts
  • 使用 vars_file:group_vars/all.yml

甚至可以这样做吗?我究竟做错了什么?


当我在剧本中做这样的事情时:

- name:
  do_something2  hosts:
    - LOCALHOST
  tasks:
    - set_fact:
        MY_HOST: "{{ NETWORK.IP }}"

这是工作。所以我猜它与“all.yml”有关,因为 LOCALHOST 是在一个组中定义的。但是 all.yml 应该可以使用,即使主机没有在组中定义,对吗?


附加信息: 这是ansible --version的输出:

ansible [core 2.13.3]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['SOME_PATH', '/usr/share/ansible/plugins/modules']
  ansible python module location = SOME_PATH
  ansible collection location = SOME_PATH
  executable location = SOME_PATH
  python version = 3.10.8 (main, Oct 19 2022, 07:46:20) [GCC]
  jinja version = 3.1.2
  libyaml = True

我在 openSUSE Leap 上运行它

编辑:添加了关于为什么我需要动态设置它的描述(因为我在较早的角色中创建了服务器)。

【问题讨论】:

  • 您应该使用库存。为什么要在 group_vars 中设置 ip?您正在创建一个“先有鸡/先有蛋”的问题,因为 Ansible 无法连接到您在组变量中设置的主机。
  • 问题是我当时不知道主机的 IP。在第一步中,我使用 proxmox 模块创建主机,然后我想直接配置它。

标签: ansible ansible-facts


【解决方案1】:

我不是 100% 的你在这里试图完成的事情,但正如凯文所说,你应该为此使用清单。我从未使用过 group_vars/all.yml。只需在您的剧本所在的位置创建一个清单目录,然后使用您的主机名和组创建清单或主机文件(如果有的话):

库存/主机:

[dev]
host1
host2

然后如果你想为每个主机添加网络IP,你应该把它放在你的host_vars目录下,而不是放在group_vars上。为每个主机创建一个包含不同文件的 host_vars 目录。他们需要与您的主机同名:

库存/host_vars/host1.yml

ansible_host: 10.10.10.10

然后,如果您有将被不同主机使用的公共变量,您可以在 group_vars 目录中创建一个由该组命名的文件:

库存/group_vars/dev.yml:

gateway_ip: 10.10.10.1

一旦创建了所有内容,它就非常容易管理。如果需要添加特定主机,只需将它们放在 hosts.yml 文件中的一个组中即可。

【讨论】:

  • 谢谢你的回答。问题是我当时“不知道”IP。我已经在库存中有服务器,但我没有 IP。这是因为我在剧本中更早地创建了它们。
【解决方案2】:

因此,对于遇到类似问题的任何人,我的解决方案是在本地主机上发挥作用并更改清单文件。这是我使用的代码:

- name : Adding created hosts to inventory
  lineinfile:
    path: "inventory.yml"
    insertafter: "{{ item.NAME }}"
    regexp: '^{{ item.NAME }}'
    line: "          ansible_ssh_host: {{ item.IP }}"
  loop: "{{ network }}"

- meta: refresh_inventory

有了这个,我就可以解析配置文件all.yml,然后为每个主机分配他们的 ip。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多