여기 내 플레이북이 있어요
- name: Host's luns
debug:
msg: "{{ luns }}"
vars:
luns: "{{ ansible_facts.lvm.pvs }}"
그리고 이에 대한 출력은 다음과 같습니다.
TASK [Luns del vg] ************************************************************
ok: [awxworker_rhel6] => {
"msg": {
"/dev/sda2": {
"free_g": "20.72",
"size_g": "79.72",
"vg": "vg00"
},
"/dev/sdb1": {
"free_g": "3.99",
"size_g": "4.99",
"vg": "vg01"
},
"/dev/sdc1": {
"free_g": "0.99",
"size_g": "4.99",
"vg": "vg02"
},
"/dev/sdd1": {
"free_g": "4.99",
"size_g": "4.99",
"vg": "vg01"
}
}
}
일치하는 vg의 luns를 가져와야 합니다.
Ej: "The vg01 luns are: /dev/sdb1 /dev/sdd1"
나는 이것을 다른 방법으로 시도했습니다
- name: Luns del VG
set_fact:
vg_luns: "{{ item }}"
with_items: "{{ ansible_facts.lvm.pvs }}"
vars:
VGname: "{{ VG }}"
when: ansible_facts.lvm.pvs.vg_luns.vg == VGname
- name: Print VG's luns
debug:
msg:
- "The {{ VGname }} luns are: {{ vg_luns }}"
VG는 일치하는 VGname을 입력하는 추가 변수입니다.
$ ansible-playbook -i proyects/Inventory/awx_hosts -l testhost getvgluns.yml -e VG=vg01
당신이 도울 수 있기를 바랍니다
Thanks in advance!
답변1
그룹의 사전을 만듭니다. 예를 들어
- set_fact:
vgs: "{{ vgs|d({})|
combine({item.0: item.1|
map(attribute='key')|
list}) }}"
loop: "{{ luns|dict2items|groupby('value.vg') }}"
준다
vgs:
vg00:
- /dev/sda2
vg01:
- /dev/sdb1
- /dev/sdd1
vg02:
- /dev/sdc1
그렇다면 선택은 사소한 것입니다
- debug:
msg: "The {{ VG }} luns are: {{ vgs[VG]|join(' ') }}"
메시지를 준다
shell> ansible-playbook playbook.yml -e VG=vg01
msg: 'The vg01 luns are: /dev/sdb1 /dev/sdd1'
답변2
set_fact 또는 Ansible 루프가 필요하지 않습니다. 사전을 목록으로 변환하고 이에 대해 일반적인 Jinja 작업을 사용합니다.
- debug:
msg: "The {{ VG }} luns are: {{ ansible_facts.lvm.pvs | dict2items | selectattr('value.vg', 'equalto', VG) | map(attribute='key') | join(' ') }}"