Я использую 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
Здесь у вас есть два решения, первое из которых, вероятно, самое чистое:
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"
- 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
Вы можете добавить | list
к переменной.
Вы используете старую неподдерживаемую версию Ansible, обновите ее. Или добавьте фильтр | list
в конце.
Как вы добавляете фильтры
@zccharts: | zip(minio_plate.0.disk_drive)
стать | zip(minio_plate.0.disk_drive) | list
Спасибо, все работает, но я не понимаю этот zip
Вы проверили документацию, на которую есть ссылка в ответе? Что именно вам в нем не понятно?
Преобразовать структуру
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
- msg: Недопустимые данные переданы в «цикл», для этого требуется список, вместо этого получил это: <itertools.izip object at 0x7f037ff5abd8>. Подсказка: если вы передали list/dict только из одного элемента, попробуйте добавить wantlist=True к вызову поиска или используйте q/query вместо поиска. Я допустил ошибку. Не могли бы вы проверить это