Я пишу книгу, в которой узлы отображаются в /etc/fstab
.ansible loop over list и dictionary в то же время
Я использую циклы, чтобы предотвратить дублирование кода.
Логика сначала проверяет, появляется ли строка с использованием grep (с регулярным выражением perl, поскольку это многострочная строка) и сохраняет результаты в регистре.
Затем я хочу добавить только строки, которые не находятся в файле fstab. Для этого мне нужно перебрать список (регистр с кодами возврата grep) и словарь (содержащий записи fstab).
У меня возникают ошибки в параллельном цикле. Я попытался выполнить these шагов.
One or more undefined variables: 'str object' has no attribute 'item'
задачи/fstab.yaml:
---
- name: Make dirs
sudo: yes
file: path={{ item.value }} state=directory
with_dict:
"{{ fstab.paths }}"
- name: Check whether declared in fstab
sudo: no
command: grep -Pzq '{{ item.value }}' /etc/fstab
register: is_declared
with_dict:
"{{ fstab.regexs }}"
- name: Add the missing entries
sudo: yes
lineinfile: dest=/etc/fstab line="{{ item.1.item.value }}"
when: item.0.rc == 1
with_together:
- "{{ is_declared.results }}"
- "{{ fstab.entries }}"
вары/main.yml:
---
fstab:
paths:
a: "/mnt/a"
b: "/mnt/b"
regexs:
a: '\n# \(a\)\nfoo1'
b: '\n# \(b\)\nfoo2'
entries:
a: "\n# (a)\nfoo1"
b: "\n# (b)\nfoo2"
- Я не использую шаблон на цели (я хочу, чтобы добавить записи к существующим файлам и не переписывать их).
UPDATE: Я вижу анзибль имеет модуль "монтировать", которая занимается Fstab. Тем не менее, я все еще ищу решение этой проблемы, потому что мне может понадобиться это позже.
Вашего решения было бы хорошо для лайнеры. lineinfile regexp не работает с несколькими шаблонами строк. Вот почему я сделал это разделение. –