如何循环库存并在Ansible中分配价值
我的Ansible playbook中有一个任务,我希望迭代我拥有的组中的每个主机,并从我在vars文件夹中创建的主机名列表中为每个主机分配一个名称 我已经熟悉通过编写循环来循环清单:{{groups['mygroup']}}},我有一个主机名列表,我想在主机文件中为'mygroup'中的每个IP分配一个如何循环库存并在Ansible中分配价值,ansible,yaml,ansible-inventory,Ansible,Yaml,Ansible Inventory,我的Ansible playbook中有一个任务,我希望迭代我拥有的组中的每个主机,并从我在vars文件夹中创建的主机名列表中为每个主机分配一个名称 我已经熟悉通过编写循环来循环清单:{{groups['mygroup']}}},我有一个主机名列表,我想在主机文件中为'mygroup'中的每个IP分配一个 # In tasks file - roles/company/tasks/main.yml - name: change hostname win_hostname: name:
# In tasks file - roles/company/tasks/main.yml
- name: change hostname
win_hostname:
name: "{{ item }}"
loop: "{{ hostname }}"
register: res
# In the Inventory file
[company]
10.0.10.128
10.0.10.166
10.0.10.200
# In vars - roles/company/vars/main.yml
hostname:
- GL-WKS-18
- GL-WKS-19
- GL-WKS-20
# site.yml file located under /etc/ansible
- hosts: company
roles:
- common
- company #This is where the loop exists mentioned above.
# Command to run playbook
ansible-playbook -i hosts company.yml
我似乎已经记下或了解了各个部分,但如何将对库存组中的主机的迭代与已创建列表(在roles vars文件夹中)中的名称相结合
更新
上述任务已更新,以反映答复中提到的变化:
- name: change hostname
win_hostname:
name: "{{ item.1 }}"
loop: {{ groups.company|zip(hostname)|list }}"
register: res
然而,我得到的输出是不正确的,这不应该运行9次,而应该只运行3次,在库存中的[company]组中每个IP运行一次。此外,列表中只有三个主机名需要分配给资源清册表中的每个主机
changed: [10.0.10.128] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.166] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.200] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.128] => (item=[u'10.0.10.166', u'GL-WKS-19'])
changed: [10.0.10.166] => (item=[u'10.0.10.166', u'GL-WKS-19'])
changed: [10.0.10.200] => (item=[u'10.0.10.166', u'GL-WKS-19'])
ok: [10.0.10.128] => (item=[u'10.0.10.200', u'GL-WKS-20'])
ok: [10.0.10.166] => (item=[u'10.0.10.200', u'GL-WKS-20'])
ok: [10.0.10.200] => (item=[u'10.0.10.200', u'GL-WKS-20'])
每当我对Ansible中的循环有疑问时,我也会去访问。听起来您想并行迭代两个列表,将清单中主机列表中的项目与主机名列表中的项目配对。在Ansible的早期版本中,建议同时使用
with_
循环,而在Ansible的较新版本中,建议使用zip
过滤器(文档中有一个示例)
为了在您的用例中演示这一点,我从一个包含三个主机的清单文件开始:
[mygroup]
hostA ansible_host=localhost
hostB ansible_host=localhost
hostC ansible_host=localhost
以及以下剧本:
---
- hosts: all
- hosts: localhost
gather_facts: false
vars:
hostnames:
- hostname01
- hostname02
- hostname03
tasks:
- name: change hostname
debug:
msg:
win_hostname:
name: "{{ item }}"
loop: "{{ groups.mygroup|zip(hostnames)|list }}"
这里我使用的是一个debug
任务,而不是实际运行win\u hostname
任务。运行的输出:
ansible-playbook -i hosts playbook.yml
看起来像:
TASK [change hostname] ********************************************************************************************************************************
ok: [localhost] => (item=[u'hostA', u'hostname01']) => {
"msg": {
"win_hostname": {
"name": [
"hostA",
"hostname01"
]
}
}
}
ok: [localhost] => (item=[u'hostB', u'hostname02']) => {
"msg": {
"win_hostname": {
"name": [
"hostB",
"hostname02"
]
}
}
}
ok: [localhost] => (item=[u'hostC', u'hostname03']) => {
"msg": {
"win_hostname": {
"name": [
"hostC",
"hostname03"
]
}
}
}
如您所见,它将清单中的每个主机与主机名
列表中的主机名配对
更新
根据你提供的额外信息,我认为你
实际需要的是:
- name: change hostname
win_hostname:
name: "{{ hostnames[group.company.index(inventory_hostname) }}"
这将从hostname
中为计算机中的每个主机分配一个值
库存我们正在查找电流的位置
inventory\u主机名
,然后使用该主机名索引到
主机名列表。这正是我要找的。两个列表将同时循环在一起。我不知道库存组被认为是列表,我认为这是我的问题之一。第二,与_x的循环非常混乱,甚至看着它都让我感到困惑。谢谢你的解释!在对循环进行更改并将名称字段的值更新为“{item.1}”之后我仍然遇到一些问题,循环似乎运行了9次。循环还为两台主机分配了相同的主机名。为什么这个zip筛选器运行了9次?您能否用您正在运行的实际数据和任务更新您的问题?很难弄清楚其他情况下会发生什么。我假设此示例正确运行r你?我能够成功地运行并获得你也展示的输出,这就是为什么我对我的问题感到困惑的原因。原始问题已经用输出和设置进行了更新。你还没有展示剧本本身,但我想我看到了发生的事。hosts:
行在调用它的剧本上是什么样子的任务