我在一个变量中有一个列表,我需要对它执行一个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行以仅使用过滤后的项目?
答案 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) }}"
...