Ansible在哈希中处理多个元素
我正在尝试在我的剧本中加载一个主机列表以提供KVM。我需要关闭hosts.yml的这个键,因为另一个剧本将在主机启动后获取主机并连接到它们 这是my hosts.yml:Ansible在哈希中处理多个元素,ansible,Ansible,我正在尝试在我的剧本中加载一个主机列表以提供KVM。我需要关闭hosts.yml的这个键,因为另一个剧本将在主机启动后获取主机并连接到它们 这是my hosts.yml: kvm: hosts: kvm01 dcos: dcos-bootstrap: hosts: dcos-bootstrap vars: lv_size: "10g" dcos-masters: hosts: dcos-master-1 v
kvm:
hosts:
kvm01
dcos:
dcos-bootstrap:
hosts:
dcos-bootstrap
vars:
lv_size: "10g"
dcos-masters:
hosts:
dcos-master-1
vars:
lv_size: "50g"
dcos-agents:
hosts:
dcos-agent-1
dcos-agent-2
vars:
lv_size: "50g"
因此,在单个KVM上,我运行此playbook为与dcos主机对应的每个虚拟机创建逻辑卷:
---
- hosts: kvm
tasks:
- name: Get a list of vm's to create
include_vars:
file: "../hosts.yml"
- name: Verify the host list
debug: var=dcos
when: dcos is defined
- name: Provision Volume Groups
lvol:
vg: vg01
lv: "{{ item.value.hosts }}"
size: "{{ item.value.vars.lv_size }}"
with_dict: "{{ dcos }}"
在为一个组包含多个主机之前,这一切都很正常。我尝试过其他循环,但不确定如何继续。在处理组中的每台主机时,如何迭代哈希?您尝试重新设计Ansible已经提供的功能 这就是安斯比尔的生活方式: 在清单文件中定义主机和组
dcos.ini
:
[dcos-bootstraps]
dcos-bootstrap
[dcos-masters]
dcos-master-1
[dcos-agents]
dcos-agent-1
dcos-agent-2
[dcos:children]
dcos-bootstraps
dcos-masters
dcos-agents
然后在组变量中自定义组参数
组中的引导参数\u vars/dcos bootstraps.yml
:
---
lv_size: 10g
---
lv_size: 50g
---
lv_size: 50g
组中的Masters参数\u vars/dcos Masters.yml
:
---
lv_size: 10g
---
lv_size: 50g
---
lv_size: 50g
组中的代理参数\u vars/dcos Agents.yml
:
---
lv_size: 10g
---
lv_size: 50g
---
lv_size: 50g
你的剧本变得非常简单:
---
- hosts: dcos
tasks:
- name: Provision Volume Groups
lvol:
vg: vg01
lv: "{{ inventory_hostname }}"
size: "{{ lv_size }}"
运行此操作时,每个主机都会根据主机的组成员身份获取其
lv_size
参数。首先,我怀疑您的数据不正确。
如果您希望您的主机
成为一个列表,您应该这样做:
kvm:
hosts:
kvm01
dcos:
dcos-bootstrap:
hosts:
- dcos-bootstrap
vars:
lv_size: "10g"
dcos-masters:
hosts:
- dcos-master-1
vars:
lv_size: "50g"
dcos-agents:
hosts:
- dcos-agent-1
- dcos-agent-2
vars:
lv_size: "50g"
注意连字符
对于您的问题:如果您不打算在循环中使用“组”名称(如dcos bootstrap
等),您可以将与子元素一起使用:
- name: Provision Volume Groups
lvol:
vg: vg01
lv: "{{ item.1 }}"
size: "{{ item.0.vars.lv_size }}"
with_subelements:
- "{{ dcos }}"
- hosts
我是Ansible的新手,所以我真的不知道如何实现我想要的。我最初试图自己解析hosts文件,但不知道Ansible会为我做这件事。现在我知道了
所有主机和组数据都存储在主机变量和组中。我需要做的就是这样使用它:
vars:
dcoshosts: "{{ groups['dcos'] }}"
tasks:
- name: List groups
debug:
msg: "{{ groups }}"
- name: Get All DCOS hosts
debug:
msg: "Host: {{ item }}"
with_items:
- "{{ dcoshosts }}"
- name: Provision Volume Groups
lvol:
vg: vg01
lv: "{{ item }}"
size: "{{ hostvars[item].lv_size }}"
with_items: "{{ dcoshosts }}"
我最终使用了hosts.ini文件而不是yaml,因为ini起作用而yaml不起作用。下面是完整的图片:
[dcos-masters]
dcos-master-1
dcos-master-2
[dcos-masters:vars]
lv_size="50g"
[dcos-agents]
dcos-agent-1
dcos-agent-2
[dcos-agents:vars]
lv_size="50g"
[dcos-bootstraps]
dcos-bootstrap
[dcos-bootstraps:vars]
lv_size="10g"
[dcos:children]
dcos-masters
dcos-agents
dcos-bootstraps
感谢所有人的帮助并推动我找到解决方案:)如果我的问题不清楚,很抱歉。我不是在每个dcos主机上创建逻辑卷,而是在一台计算机(KVM)上创建与dcos主机名对应的逻辑卷。我已经更新了我的问题,以使我的意图更清楚。将主机文件放入列表可以解决循环问题,但它会中断主机文件的使用,这是正确的。当我运行ansible playbook-I hosts.yml site.yml时,我在dcos上得到了这样的结果:跳过:没有匹配的主机。我需要此文件作为主机文件使用。您的原始文件作为库存文件是巧合。你绝对应该重构你的环境。这不是巧合,是故意的:)我不想/不应该输入我的主机信息两次。主机已经在主机文件中…为什么不使用该文件?“巧合”我的意思是,您的YAML格式不正确。见和。