我正在尝试在我的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 }}"
这适用于您为一个组包含多个主机。我尝试过其他循环,但我不知道如何继续。如何在处理组中的每个主机时迭代哈希?
答案 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