ansible with_items stdout_lines过滤器

时间:2018-11-06 17:53:03

标签: ansible

我在一个变量中有一个列表,我需要对它执行一个shell命令。

   - name: Set Percentage value to "yes" to all disks for NFS SERVERS
    shell: |
      NUM=$(cat -n {{ cdm_path }} |\
            sed -n "/<disk>/,/<\/disk>/p" |\
            sed -n "/<alarm>/,/<\/alarm>/p" |\
            sed -n "/<fixed>/,/<\/fixed>/p" |\
            sed -n "/<{{ item }}>/,/<\/{{ item }}>/p" |\
            awk '/ percent = no/ {printf "%d", $1}')"s";
      if [ "${NUM}" != "s" ]; then
          sed -i "${NUM}/no/yes/g" {{ cdm_path }};
          echo "file_was_changed" ;
      fi
    with_items: "{{ result.stdout_lines }}"
    register: percent_nfs
    when: ansible_hostname == "nfs01" or
          ansible_hostname == "nfs02"
    changed_when: '"file_was_changed" in percent_nfs.stdout'

结果包含以下内容:

#
#boot
#emc#dest#admin
#emc#dest#dbdata
#emc#dest#dbbackups
#emc#dest#lsgdev
#emc#dest#lsgdev_dev
#emc#dest#lsgdev_stage
#emc#dest#lsglegacy

当ansible_hostname == nfs01或nfs02时,我正在运行此代码

我需要对多个设备保持相同的“结果”,但是我只想对名称中不包含*lsg*的项目执行shell命令。

如何进一步过滤with_items行以仅使用过滤后的项目?

1 个答案:

答案 0 :(得分:0)

对于从result.stdout_lines中排除不包含子字符串lsg的项目,您可能会找到一种更优雅的解决方案。

但是,一种可能的解决方案是结合使用Ansible difference set theory filter和Jinja2 select过滤器(类似于以下answer)来进行过滤您的物品,如下所示:

...
with_items: "{{ result.stdout_lines|difference(result.stdout_lines|select('search','lsg')|list) }}"
...