在循环中设置注册变量,将其用于另一个角色

问题描述 投票:1回答:2

大家好我有问题。

我目前遇到的问题是,无论文件名是否为空,复制文件的角色都会跳过所有文件。

在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设置注册变量并将其输出与“”(无)进行比较?有人可以帮我解决这个问题吗?

ansible
2个回答
1
投票

如果您的文件保持文件名为空,则{{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"
        ]
    }
]

0
投票

我认为主要问题是你需要在你的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将为您提供您所捕获的文件中的一系列行,您不必使用查找和拆分代码。

© www.soinside.com 2019 - 2024. All rights reserved.