создайте измененный список из выходных данных регистра stdout_lines

#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(',') }}"