
이건 내 플레이북이야
---
- hosts: mytestserver
become: true
become_method: sudo
gather_facts: true
vars:
# To get vgname and lvname from ansible_mounts's device
mt: "{{ MT }}" #Extravariable
disp_pth: "{{ item['device'] }}"
disp_tmp: "{{ disp_pth | basename }}"
DISP: "{{ disp_tmp.split('-') }}"
VGname: "{{ DISP.0 }}"
LVname1: "{{ DISP.1 }}"
DISPP2: "{{ DISP.3|default('') }}"
LVname2: "{{ DISP.1 }}-{{ DISPP2 }}"
LVname: "{{ LVname2 if (disp_tmp | regex_search('--')) else LVname1 }}"
tasks:
- name: Get filesystem values
lvol:
vg: "{{ VGname }}"
lv: "{{ LVname }}"
with_items: "{{ ansible_mounts }}"
when: item.mount == MT
register: myfs
- debug:
var: myfs
내가 실행할 때 :
$ ansible-playbook -i proyects/Inventory/awx_hosts -l mytestserver getlvmfacts.yml -e MT=/DATA
나는 다음과 같은 값을 얻습니다.
PLAY [mytestserver] ******************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************************************************
ok: [mytestserver]
TASK [Get filesystem values] ************************************************************************************************************************************************************************************************************
ok: [mytestserver] => (item={'block_used': 21620, 'uuid': '7fef92b8-8157-43d1-92b4-525a56fa33f8', 'size_total': 1056858112, 'block_total': 258022, 'mount': '/DATA', 'block_available': 236402, 'size_available': 968302592, 'fstype': 'ext4', 'inode_total': 65536, 'options': 'rw', 'device': '/dev/mapper/vgAPP-DATA', 'inode_used': 11, 'block_size': 4096, 'inode_available': 65525})
TASK [debug] ****************************************************************************************************************************************************************************************************************************
ok: [mytestserver] => {
"myfs": {
"changed": false,
"msg": "All items completed",
"results": [
{
"ansible_loop_var": "item",
"changed": false,
"item": {
"block_available": 414770,
"block_size": 4096,
"block_total": 516052,
"block_used": 101282,
"device": "/dev/mapper/vg00-lvol01",
"fstype": "ext3",
"inode_available": 124211,
"inode_total": 131072,
"inode_used": 6861,
"mount": "/",
"options": "rw",
"size_available": 1698897920,
"size_total": 2113748992,
"uuid": "7df9171b-c31f-434f-94c5-344d02775e89"
},
"skip_reason": "Conditional result was False",
"skipped": true
},
{
"ansible_loop_var": "item",
"changed": false,
"item": {
"block_available": 1037688,
"block_size": 4096,
"block_total": 1046016,
"block_used": 8328,
"device": "/dev/mapper/vgDATA-BASET--DATA1",
"fstype": "xfs",
"inode_available": 4194301,
"inode_total": 4194304,
"inode_used": 3,
"mount": "/BASET/DATA1",
"options": "rw",
"size_available": 4250370048,
"size_total": 4284481536,
"uuid": "91689e9b-552c-4f0e-b0ec-0d3d25154a72"
},
"skip_reason": "Conditional result was False",
"skipped": true
},
{
"ansible_loop_var": "item",
"changed": false,
"failed": false,
"invocation": {
"module_args": {
"active": true,
"force": false,
"lv": "DATA",
"opts": null,
"pvs": null,
"resizefs": false,
"shrink": true,
"size": null,
"snapshot": null,
"state": "present",
"thinpool": null,
"vg": "vgAPP"
}
},
"item": {
"block_available": 236402,
"block_size": 4096,
"block_total": 258022,
"block_used": 21620,
"device": "/dev/mapper/vgAPP-DATA",
"fstype": "ext4",
"inode_available": 65525,
"inode_total": 65536,
"inode_used": 11,
"mount": "/DATA",
"options": "rw",
"size_available": 968302592,
"size_total": 1056858112,
"uuid": "7fef92b8-8157-43d1-92b4-525a56fa33f8"
},
"lv": "DATA",
"size": 1024.0,
"vg": "vgAPP"
},
{
"ansible_loop_var": "item",
"changed": false,
"item": {
"block_available": 472667,
"block_size": 4096,
"block_total": 516052,
"block_used": 43385,
"device": "/dev/mapper/vg00-lvol07",
"fstype": "ext3",
"inode_available": 131061,
"inode_total": 131072,
"inode_used": 11,
"mount": "/tivoli",
"options": "rw",
"size_available": 1936044032,
"size_total": 2113748992,
"uuid": "2310d046-eaad-4419-a94b-197c2c56502c"
},
"skip_reason": "Conditional result was False",
"skipped": true
}
]
}
}
일치하는 마운트 지점(/DATA) 끝에는 세 가지 파일 시스템 매개변수가 있습니다.
"lv": "DATA",
"size": 1024.0,
"vg": "vgAPP"
문제는 이 매개변수를 어떻게 참조할 수 있는가입니다.
나는 사용해 보았습니다.myfs.lv하지만 작동하지 않으며 다양한 방법이 있습니다. 그 안에 들어있지 않아서 그런 것 같아요'안건'
원하는 것: "myfs.lv"와 같은 것을 사용하고 "DATA"를 가져옵니다.
당신이 도울 수 있기를 바랍니다. 미리 감사드립니다!
답변1
출력을 디버깅하는 구조를 참조하면 myfs.lv
최상위 수준의 유일한 키가 msg
, changed
및 이기 때문에 분명히 잘못된 것을 알 수 있습니다 results
.
루프에서 작업을 실행하면results
결과는 키 아래에 목록으로 저장됩니다.등록된 변수의 특정 결과에 액세스하려면 다음과 같은 작업을 수행합니다 myfs.results.2.lv
.
이와 같은 인덱스를 하드코딩하는 것은 일반적으로 원하는 것이 아니므로 대신 원하는 결과를 선택하기 위한 작업을 수행해야 합니다. 건너뛰지 않은 첫 번째 결과를 (myfs.results | reject('skipped') | list | first).lv
검색합니다 .lv
또는 물론 첫 번째 작업에서 반복하지 않음으로써 이 작업을 더 쉽게 만들 수도 있습니다.
tasks:
- name: Get filesystem values
lvol:
vg: "{{ mount_dev_split.0 }}"
lv: "{{ mount_dev_split.1 ~ lv_name_suffix }}"
vars:
mount_dev: "{{ (ansible_facts.mounts | selectattr('mount', 'equalto', MT) | list).0.device }}"
mount_dev_split: "{{ (mount_dev | basename).split('-') }}"
lv_name_suffix: "{{ ('-' ~ mount_dev_split.3 | default('')) if '--' in mount_dev else '' }}"
register: myfs
- debug:
msg: "{{ myfs.lv }}"