2015-06-14 2 views
0

Я пишу книгу, в которой узлы отображаются в /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. Тем не менее, я все еще ищу решение этой проблемы, потому что мне может понадобиться это позже.

ответ

0

У меня есть пара идей о том, почему ваш первоначальный подход не удался, но давайте поцарапаем это на мгновение. Похоже, вы слишком сложны - почему бы не использовать сложный список var, чтобы связать все это вместе, и использовать regexp arg для модуля lineinfile вместо отдельной задачи regex? (Хотя ваши данные образцы должны нормально работать даже без регулярных выражений пар) Что-то вроде:

--- 
- name: Make dirs 
    sudo: yes 
    file: path={{ item.path }} state=directory 
    with_items: fstab 

- name: Add the missing entries 
    sudo: yes 
    lineinfile: dest=/etc/fstab line={{ item.entry }} regexp={{ item.regex }} 
    with_items: fstab 

fstab: 
    - path: /mnt/a 
    regex: '\n# \(a\)\nfoo1' 
    entry: "\n# (a)\nfoo1" 
    - path: /mnt/b 
    regex: '\n# \(b\)\nfoo2' 
    entry: '\n# (b)\nfoo2' 
+0

Вашего решения было бы хорошо для лайнеры. lineinfile regexp не работает с несколькими шаблонами строк. Вот почему я сделал это разделение. –

Смежные вопросы