ansible循环列表和字典同时

时间:2015-06-14 08:30:13

标签: loops ansible

我正在编写一本确保节点出现在/etc/fstab

的剧本

我正在使用循环来防止代码重复。

逻辑首先检查是否使用grep(使用perl regex,因为它是多行)显示该行,并将结果存储在寄存器中。

然后我想只添加不在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"
  • 我没有故意使用模板(我想在现有文件中添加条目,而不是过度写入)。

更新:我看到ansible有模块" mount"处理fstab。但是我仍在寻找这个问题的解决方案,因为稍后我可能会再次需要它。

1 个答案:

答案 0 :(得分:0)

我有一些关于为什么你的原始方法失败的想法,但让我们暂时抓一下。看起来你过度复杂了 - 为什么不使用复杂的列表var将它们组合在一起,并使用regexp arg到lineinfile模块而不是单独的正则表达式任务? (尽管你的样本数据即使没有正则表达式参数也应该可以正常工作),例如:

---
- 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'