Ansible处理哈希中的多个元素

时间:2017-09-13 12:44:43

标签: ansible

我正在尝试在我的Playbook中加载一个主机列表来配置KVM。我需要通过hosts.yml来关闭它,因为另一个剧本将会占用主机并在它们启动后连接到它们。

这是我的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 }}"

这适用于您为一个组包含多个主机。我尝试过其他循环,但我不知道如何继续。如何在处理组中的每个主机时迭代哈希?

3 个答案:

答案 0 :(得分:1)

我是Ansible的新手所以我真的不确定如何实现我想要的。我最初尝试自己解析hosts文件,不知道Ansible为我做了这个。现在我知道......

所有主机和组数据都存储在host_vars和组中。所有我需要做的就是这样:

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

感谢大家的帮助并推动我解决问题:)

答案 1 :(得分:0)

你试图重新发明Ansible已经提供的东西。

这是Ansbile的生活方式:

在清单文件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

然后在组变量中自定义组参数。

groups_vars/dcos-bootstraps.yml中的引导参数:

---
lv_size: 10g

group_vars/dcos-masters.yml中的主参数:

---
lv_size: 50g

group_vars/dcos-agents.yml中的代理商参数:

---
lv_size: 50g

你的剧本变得非常简单:

---
- hosts: dcos
  tasks:
    - name: Provision Volume Groups
      lvol:
        vg: vg01
        lv: "{{ inventory_hostname }}"
        size: "{{ lv_size }}"

运行此操作时,每个主机都会根据主机的组成员身份获取其lv_size参数。

答案 2 :(得分:0)

首先,我怀疑你的数据不正确。 如果您希望hosts成为列表,则应该这样做:

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等),则可以使用with_subelements

  - name: Provision Volume Groups
    lvol:
      vg: vg01
      lv: "{{ item.1 }}"
      size: "{{ item.0.vars.lv_size }}"
    with_subelements:
      - "{{ dcos }}"
      - hosts