Ansible,如何在主机清单中定义列表?
Ansible, how to define a list in host inventory?
我有一个剧本,我想在我的主机文件中定义一个字符串列表。
这是我的主机文件:
[dashboard]
1.2.3.4 dashboard_domain=test site_domain=['one','two','foo', 'bar']
这是我尝试使用 list documentation:
编写的剧本
---
- hosts: dashboard
gather_facts: False
remote_user: ubuntu
become: yes
tasks:
- name: ping
ping:
- debug:
msg: "Domain: {{dashboard_domain}}"
- debug:
msg: "Site: {{ item }}"
with_items: "{{site_domain}}"
但是 运行 这个带有 ansible-playbook -i hosts ping.yml
的剧本会导致这个错误:
TASK: [debug ] ****************************************************************
fatal: [1.2.3.4] => with_items expects a list or a set
这似乎是将定义的列表从主机文件传输到剧本的问题,因为直接在剧本中定义列表是可行的:
---
- hosts: dashboard
gather_facts: False
remote_user: ubuntu
become: yes
vars:
site_domain: ['one','two','foo', 'bar']
tasks:
#### APPLY HTTP-AUTH ####
- name: ping
ping:
- debug:
msg: "Domain: {{dashboard_domain}}"
- debug:
msg: "Site: {{ item }}"
with_items: "{{site_domain}}"
只需引用变量值:
[dashboard]
1.2.3.4 dashboard_domain=test site_domain="['one','two','foo', 'bar']"
似乎在 INI-formatted 个清单文件的情况下,如果 Ansible 以未加引号的 [
开头并将其作为字符串传递,则 Ansible 不会解析变量值。
关于你的例子:我不确定为什么你在读取库存文件时没有收到 expected key=value
错误,如果你真的有一个 space 里面。
@techraf 确实回答了您的问题,如果 dashboard
组中的每个主机都有一个具有不同值的 site_domain
列表,他们的解决方案就是完美的。
不过,看看你的剧本,似乎 site_domain
在整个 dashboard
组中都是不变的。如果 dashboard
中有 10 个主机,则必须将列表复制到每个主机的行中。为避免重复,您可以在清单中有一个 dashboard:vars
部分,您可以在其中为组中的所有主机定义具有相同值的变量:
[dashboard:vars]
site_domain="['one','two','foo', 'bar']"
[dashboard]
1.2.3.4 dashboard_domain=test
1.2.3.5 dashboard_domain=uat
1.2.3.6 dashboard_domain=integ
如果您的清单文件夹更加结构化,您还可以在 YAML 中的单独文件中为 dashboard
组定义变量。您的清单文件夹树可能是:
inventories
|
+-- group_vars
| \-- dashboard.yml
|
+-- hosts.ini
在那个配置中,dashboard.yml
可以简单地是:
site_domain: ['one', 'two', 'foo', 'bar']
...或:
site_domain:
- one
- two
- foo
- bar
我有一个剧本,我想在我的主机文件中定义一个字符串列表。
这是我的主机文件:
[dashboard]
1.2.3.4 dashboard_domain=test site_domain=['one','two','foo', 'bar']
这是我尝试使用 list documentation:
编写的剧本---
- hosts: dashboard
gather_facts: False
remote_user: ubuntu
become: yes
tasks:
- name: ping
ping:
- debug:
msg: "Domain: {{dashboard_domain}}"
- debug:
msg: "Site: {{ item }}"
with_items: "{{site_domain}}"
但是 运行 这个带有 ansible-playbook -i hosts ping.yml
的剧本会导致这个错误:
TASK: [debug ] ****************************************************************
fatal: [1.2.3.4] => with_items expects a list or a set
这似乎是将定义的列表从主机文件传输到剧本的问题,因为直接在剧本中定义列表是可行的:
---
- hosts: dashboard
gather_facts: False
remote_user: ubuntu
become: yes
vars:
site_domain: ['one','two','foo', 'bar']
tasks:
#### APPLY HTTP-AUTH ####
- name: ping
ping:
- debug:
msg: "Domain: {{dashboard_domain}}"
- debug:
msg: "Site: {{ item }}"
with_items: "{{site_domain}}"
只需引用变量值:
[dashboard]
1.2.3.4 dashboard_domain=test site_domain="['one','two','foo', 'bar']"
似乎在 INI-formatted 个清单文件的情况下,如果 Ansible 以未加引号的 [
开头并将其作为字符串传递,则 Ansible 不会解析变量值。
关于你的例子:我不确定为什么你在读取库存文件时没有收到 expected key=value
错误,如果你真的有一个 space 里面。
@techraf 确实回答了您的问题,如果 dashboard
组中的每个主机都有一个具有不同值的 site_domain
列表,他们的解决方案就是完美的。
不过,看看你的剧本,似乎 site_domain
在整个 dashboard
组中都是不变的。如果 dashboard
中有 10 个主机,则必须将列表复制到每个主机的行中。为避免重复,您可以在清单中有一个 dashboard:vars
部分,您可以在其中为组中的所有主机定义具有相同值的变量:
[dashboard:vars]
site_domain="['one','two','foo', 'bar']"
[dashboard]
1.2.3.4 dashboard_domain=test
1.2.3.5 dashboard_domain=uat
1.2.3.6 dashboard_domain=integ
如果您的清单文件夹更加结构化,您还可以在 YAML 中的单独文件中为 dashboard
组定义变量。您的清单文件夹树可能是:
inventories
|
+-- group_vars
| \-- dashboard.yml
|
+-- hosts.ini
在那个配置中,dashboard.yml
可以简单地是:
site_domain: ['one', 'two', 'foo', 'bar']
...或:
site_domain:
- one
- two
- foo
- bar