Запишите массив переменных в /etc/fstab, используя Ansible

Я использую Ansible для создания распределенного кластера, для которого требуется несколько дисков данных и каталогов монтирования.

Я пытаюсь выполнить требование, определив следующие переменные в своем инвентаре:

[all:vars] 
minio_plate = [ { "disk_dirve": ["/dev/sdb","/dev/sdc","/dev/sdd"], "minio_data_dir": ["/minio/disk1","/minio/disk2","/minio/disk3"] } ] 

Это моя игровая книга:

- hosts: 10.102.26.31
  tasks:
    - name: Mount DVD read-only
      mount:
        path: "{{item.minio_data_dir}}" 
        src: "{{item.disk_dirve}}"
        opts: defaults,noatime
        dump: "0"
        passno: "2"
        fstype: xfs
        state: present
      with_items:
        - "{{minio_plate}}"

Результаты задания в /etc/fstab (приведены к соответствующей части файла):

['/dev/sdb',\040'/dev/sdc',\040'/dev/sdd'] ['/minio/disk1',\040'/minio/disk2',\040'/minio/disk3'] xfs defaults,noatime 0 2

Я ожидаю, что в результате /etc/fstab будет содержать:

/dev/sdb  /minio/disk1 xfs defaults,noatime 0 2 
/dev/sdc  /minio/disk2 xfs defaults,noatime 0 2 
/dev/sdd  /minio/disk3 xfs defaults,noatime 0 2
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь у вас есть два решения, первое из которых, вероятно, самое чистое:

  1. Исправьте список minio_plate, чтобы он соответствовал вашему использованию, это означает, что для каждого элемента вам нужен словарь, содержащий два ключа: disk_drive и minio_data_dir:
    [all:vars]
    minio_plate = [ { "disk_drive": "/dev/sdb", "minio_data_dir": "/minio/disk1" }, { "disk_drive": "/dev/sdc", "minio_data_dir": "/minio/disk1" }, { "disk_drive": "/dev/sdd", "minio_data_dir": "/minio/disk1" } ]
    
    Дополнительное примечание: честно говоря, для такого типа сложной структуры данных вы значительно улучшите читаемость, записав свою инвентаризацию в формате YAML:
    all:
      vars:
        minio_plate:
          - disk_drive: "/dev/sdb"
            minio_data_dir: "/minio/disk1"
          - disk_drive: "/dev/sdc"
            minio_data_dir: "/minio/disk1"
          - disk_drive: "/dev/sdd"
            minio_data_dir: "/minio/disk1"
    
  2. Исправьте свое использование, чтобы оно соответствовало вашим данным: поскольку у вас есть два списка, вы хотите зацикливаться на них обоих одновременно, чего можно добиться, объединив их с zip, во-первых:
     - name: Mount DVD read-only
       mount:
         path: "{{ item.0 }}" 
         src: "{{ item.1 }}"
         opts: defaults,noatime
         dump: "0"
         passno: "2"
         fstype: xfs
         state: present
       loop: >-
         {{ 
           minio_plate.0.minio_data_dir 
             | zip(minio_plate.0.disk_drive) 
         }}
    
    И даже тот факт, что у вас есть список, содержащий один элемент под minio_plate, делает использование странным, если честно.

Важное примечание: в этом примере я исправил опечатку в disk_drive, которая читалась disk_dirve

- msg: Недопустимые данные переданы в «цикл», для этого требуется список, вместо этого получил это: <itertools.izip object at 0x7f037ff5abd8>. Подсказка: если вы передали list/dict только из одного элемента, попробуйте добавить wantlist=True к вызову поиска или используйте q/query вместо поиска. Я допустил ошибку. Не могли бы вы проверить это

zccharts 18.11.2022 09:39

Вы можете добавить | list к переменной.

Kevin C 18.11.2022 09:40

Вы используете старую неподдерживаемую версию Ansible, обновите ее. Или добавьте фильтр | list в конце.

β.εηοιτ.βε 18.11.2022 09:40

Как вы добавляете фильтры

zccharts 18.11.2022 09:41

@zccharts: | zip(minio_plate.0.disk_drive) стать | zip(minio_plate.0.disk_drive) | list

β.εηοιτ.βε 18.11.2022 09:42

Спасибо, все работает, но я не понимаю этот zip

zccharts 18.11.2022 09:45

Вы проверили документацию, на которую есть ссылка в ответе? Что именно вам в нем не понятно?

β.εηοιτ.βε 18.11.2022 09:46

Преобразовать структуру

minio_plat2: |
  {% for i in minio_plate %}
  - disks:
  {% for k,v in i.disk_dirve|zip(i.minio_data_dir) %}
    - [{{ k }}, {{ v }}]
  {% endfor %}
  {% endfor %}

дает

minio_plat2:
  - disks:
    - - /dev/sdb
      - /minio/disk1
    - - /dev/sdc
      - /minio/disk2
    - - /dev/sdd
      - /minio/disk3

Итерация списка с подэлементами

    - debug:
        msg: |
          path: "{{ item.1.1 }}"
          src: "{{ item.1.0 }}"
          opts: defaults,noatime
          dump: "0"
          passno: "2"
          fstype: xfs
          state: present 
      with_subelements:
        - "{{ minio_plat2|from_yaml }}"
        - disks

дает

TASK [debug] *********************************************************************************
ok: [localhost] => (item=[{}, ['/dev/sdb', '/minio/disk1']]) => 
  msg: |-
    path: "/minio/disk1"
    src: "/dev/sdb"
    opts: defaults,noatime
    dump: "0"
    passno: "2"
    fstype: xfs
    state: present
ok: [localhost] => (item=[{}, ['/dev/sdc', '/minio/disk2']]) => 
  msg: |-
    path: "/minio/disk2"
    src: "/dev/sdc"
    opts: defaults,noatime
    dump: "0"
    passno: "2"
    fstype: xfs
    state: present
ok: [localhost] => (item=[{}, ['/dev/sdd', '/minio/disk3']]) => 
  msg: |-
    path: "/minio/disk3"
    src: "/dev/sdd"
    opts: defaults,noatime
    dump: "0"
    passno: "2"
    fstype: xfs
    state: present

Example of a complete playbook for testing

- hosts: localhost

  vars:

    minio_plate:
      - disk_dirve: [/dev/sdb, /dev/sdc, /dev/sdd]
        minio_data_dir: [/minio/disk1, /minio/disk2, /minio/disk3]
    minio_plat2: |
      {% for i in minio_plate %}
      - disks:
      {% for k,v in i.disk_dirve|zip(i.minio_data_dir) %}
        - [{{ k }}, {{ v }}]
      {% endfor %}
      {% endfor %}

        
  tasks:

    - debug:
        var: minio_plat2|from_yaml

    - debug:
        msg: |
          path: "{{ item.1.1 }}"
          src: "{{ item.1.0 }}"
          opts: defaults,noatime
          dump: "0"
          passno: "2"
          fstype: xfs
          state: present 
      with_subelements:
        - "{{ minio_plat2|from_yaml }}"
        - disks

Другие вопросы по теме