大家好我有问题。
我目前遇到的问题是,无论文件名是否为空,复制文件的角色都会跳过所有文件。
在Role1中,我想保存每个文件的cat输出。在条件中的Role2中,如果注册的输出是==“”,我希望任务跳过。
基于role1:
---
- name: copy files
shell: "cat path{{ item }}files"
register: checkempty
loop:
- test1
- test2
- test3
- test4
基于role2:
---
- 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 == ""
剧本:
- 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
如何使用with_items设置注册变量并将其输出与“”(无)进行比较?有人可以帮我解决这个问题吗?
当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