#ansible
Вопрос:
В учебнике у меня есть задача поиска кандидатов на диски на основе диапазона идентификаторов LUN дисков в системе:
- name: find disk candidates
shell: lsscsi|grep -E '[[0-9] :[0-9] :[0-9] :1.][[:space:]] disk. /dev/sd'|awk '{print $NF}'
register: disk_devices
В следующей задаче я создаю разделы диска на дисках:
- name: create partitions
parted:
device: "{{ item }}"
number: "{{ partition_number }}"
label: gpt
state: present
with_items:
- "{{ disk_devices.stdout_lines }}"
Теперь у меня возникла проблема с созданием группы томов из разделов, созданных на дисках.
Список дисков на disk_devices выводится этой командой:
$ lsscsi|grep -E '[[0-9] :[0-9] :[0-9] :1.][[:space:]] disk. /dev/sd'|awk '{print $NF}'
/dev/sdc
/dev/sdd
/dev/sde
/dev/sdf
/dev/sdg
/dev/sdh
/dev/sdi
/dev/sdj
/dev/sdk
/dev/sdl
Для модуля lvg Ansible требуется список, разделенный запятыми, для атрибута pvs:
/dev/sdc1,/dev/sdd1,/dev/sde1,/dev/sdf1,/dev/sdg1,/dev/sdh1,/dev/sdi1,/dev/sdj1,/dev/sdk1,/dev/sdl1
Я зарегистрировал новую переменную в задаче:
- name: Auxiliary task
shell: echo {{ disk_devices.stdout_lines }}|sed s/$/1/|paste -sd, -
register: disk_partitions
Но когда я отлаживаю disk_partitions, я получаю:
TASK [Auxiliary task] *****************************************************************************************************************************************************
ok: [l27.0.0.1] => {
"msg": "Found [/dev/sdc, /dev/sdd, /dev/sde, /dev/sdf, /dev/sdg, /dev/sdh, /dev/sdi, /dev/sdj, /dev/sdk, /dev/sdl]1"
}
Это отличается от вывода, который я получаю при выполнении команды оболочки в bash, которая:
/dev/sdc1,/dev/sdd1,/dev/sde1,/dev/sdf1,/dev/sdg1,/dev/sdh1,/dev/sdi1,/dev/sdj1,/dev/sdk1,/dev/sdl1
Как я мог получить такой динамический список разделов диска для использования его в pvs
атрибуте в lvg
модуле?
Ответ №1:
Вы можете использовать цикл для вычисления разделов диска и объединение фильтров для объединения разделов диска в строку
---
- hosts: localhost
gather_facts: false
tasks:
- name: find disk candidates
shell: lsscsi|grep -E '[[0-9] :[0-9] :[0-9] :[0-9]][[:space:]] disk. /dev/sd'|awk '{print $NF}'
register: disk_devices
- name: Calculate disk partitions
vars:
disk_entry: "{{ item }}1"
set_fact:
disk_partitions: "{{ disk_partitions | default([]) [disk_entry] }}"
loop: "{{ disk_devices.stdout_lines | list }}"
- name: Join disk partitions to string
set_fact:
disk_partitions_pvs: "{{ disk_partitions | join(',') }}"
- name: debug
debug:
msg: "{{ disk_partitions_pvs }}"
And the output:
TASK [debug] *************************************************************
ok: [localhost] => {
"msg": "/dev/sda1,/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1,/dev/sdf1"
}
Ответ №2:
Похоже, вы хотите добавить номер раздела к каждому возвращенному диску disk_devices.stdout_lines
. В Ansible есть join
фильтр, который позволяет нам «соединять» элементы списка с выбранными нами символами. Так что что-то вроде приведенного ниже должно выполнить эту работу:
- set_fact:
pvs: "{{ disk_devices.stdout_lines|join('1,') }}1"
- debug:
var: pvs
Выход:
ok: [localhost] => {
"pvs": "/dev/sdc1,/dev/sdd1,/dev/sde1,/dev/sdf1,/dev/sdg1,/dev/sdh1,/dev/sdi1,/dev/sdj1,/dev/sdk1,/dev/sdl1"
}
Другой немного более длинный способ сделать это-создать новую переменную, которая соединяется 1
с каждым элементом путем зацикливания stdout_lines
. Вот так:
- set_fact:
my_pvs: "{{ my_pvs | default([]) [ item ~ '1' ] }}"
loop: "{{ disk_devices.stdout_lines }}"
- debug:
msg: "PVs: {{ my_pvs | join(',') }}"