大家好,我有问题。
我目前遇到的问题是,无论文件名是否为空,复制文件的角色都会跳过所有文件。
在Role1中,我想为每个文件保存cat的输出。在Role2中的when条件语句中,如果注册的输出为==“”,我希望任务跳过。
角色1:
---
- name: Copy Files
copy:
src: "{{ var1 }}{{ var2 }}{{ var3 }}{{ var4 }}{{ item }}/"
dest: "{{ copy_dest_sys }}" #destination path
loop: "{{ lookup('file', 'pathtofile/file').split('\n')}}"
when: hostvars['localhost'].checkempty.results == ""
角色2:
- name: check emptiness
hosts: localhost
become: yes
vars_files:
- ../variables/varsfile
roles:
- ../variables/role1
- name: Copy Files to prod/stag
hosts: "{{hosts_exec}}"
become: yes
vars_files:
- ../vars/recommendation-delta.yml
roles:
- ../roles/role2
剧本:
onCreate()/onCreateView()
如何使用with_items设置注册变量并将其输出与“”(无)进行比较? 有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
register
变量仅在执行该任务的特定主机上设置。因此,如果您正在localhost
上运行角色,则可以这样做:
---
- name: Check if sys files Empty
command: if [ ! -s filenames/"{{ item }}"files ]; then echo "{{ item }}fileempty"; fi
register: checkempty
loop:
- sys
- wifi
- recoprop
- udfprop
然后,当在另一台主机上运行任务时,您将像这样引用它:
hostvars["localhost"].checkempty
例如:
---
- name: Copy sys Files to prod/stag
copy:
src: "{{ git_dest }}{{ git_sys_files }}{{ item }}/"
dest: "{{ copy_dest_sys }}" #destination path
loop: "{{ lookup('file', '/home/ansible/repo/hal_ansible/scripts/delta-reco/filenames/sysfiles').split('\n')}}"
when: 'hostvars["localhost"].checkempty.stdout == "sysfileempty"'
您可以在“ Using Variables”文档中详细了解此内容。
我也在这里对您的when
语法进行了一些更正。通常,永远不要在{{...}}
条件下使用when
标记,因为when
条件始终被视为Jinja表达式。
但是,您还有另一个问题:
您的“检查sys文件是否为空”任务正在使用command
模块,但是您正在尝试运行Shell脚本。那将永远失败。您需要改用shell
模块:
---
- name: Check if sys files Empty
shell: if [ ! -s filenames/"{{ item }}"files ]; then echo "{{ item }}fileempty"; fi
register: checkempty
loop:
- sys
- wifi
- recoprop
- udfprop