【发布时间】: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