Ansible在哈希中处理多个元素

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.yml的这个键,因为另一个剧本将在主机启动后获取主机并连接到它们

这是my hosts.yml:

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格式不正确。见和。