大家好我有问题。
我目前遇到的问题是,无论文件名是否为空,复制文件的角色都会跳过所有文件。
在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设置注册变量并将其输出与“”(无)进行比较?有人可以帮我解决这个问题吗?
如果您的文件保持文件名为空,则{{item}}为空时,会发生复制整个目录的问题。它正在考虑src为
src: "{{ git_dest }}{{ git_recoprop_files }}"
尽管
src: "{{ git_dest }}{{ git_recoprop_files }}{{ item }}/"
因为{{item}}是空的。我不确定您是否必须使用第一个角色来检查文件是否为空。如果不是强制性的,那么你可以更新你的第二个角色
when: item != ""
在此之上 -
checkempty.results ==“”
也是错的。无论文件是否为空,这将为每个循环项的结果提供一个字典数组。和字典有很多东西,如item,stdout等的kay值对样本: -
{
"_ansible_ignore_errors": null,
"_ansible_item_label": "inventory1",
"_ansible_item_result": true,
"_ansible_no_log": false,
"_ansible_parsed": true,
"changed": true,
"cmd": "cat /home/rohit/ansible/inventory1",
"delta": "0:00:00.004505",
"end": "2019-04-21 21:13:55.042776",
"failed": false,
"invocation": {
"module_args": {
"_raw_params": "cat /home/rohit/ansible/inventory1",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"warn": true
}
},
"item": "inventory1",
"rc": 0,
"start": "2019-04-21 21:13:55.038271",
"stderr": "",
"stderr_lines": [],
"stdout": "inventory\nplaybook.yml",
"stdout_lines": [
"inventory",
"playbook.yml"
]
}
]
我认为主要问题是你需要在你的checkempty变量上使用stdout而不是结果,如下所示:
when: hostvars['localhost'].checkempty.stdout != ""
看起来你的逻辑也有倒退,我想你想用!=而不是==
我建议您通过在循环中使用stdout_lines来重构一下并简化代码,如下所示:
- name: Copy sys Files to prod/stag
copy:
src: "{{ git_dest }}{{ git_sys_files }}{{ item }}/"
dest: "{{ copy_dest_sys }}" #destination path
loop: "{{ hostvars['localhost'].checkempty.stdout_lines }}"
when: hostvars['localhost'].checkempty.stdout != ""
stdout_lines将为您提供您所捕获的文件中的一系列行,您不必使用查找和拆分代码。