首页 > 解决方案 > 如何使用ansible有条件地复制文件?

问题描述

请参考下面的配置,想法是,如果找到配置文件,则进行配置部署

我尝试了很多表达这个想法的变体,尤其是在最后 3 行中,但我无法以一种有意义的方式将 stat 循环的结果与我的 deploy 循环结合起来

我有我的结构列表,例如:

config_vars:
  - war_name: TestNode_app1.war
    standalone_name: jboss_standalone.xml
    jboss_service_name: jboss_app1
    jboss_folder: jboss_app1
  - war_name: TestNode_app2.war
    standalone_name: jboss_app2_standalone.xml
    jboss_service_name: jboss_app2
    jboss_folder: jboss_app2

在我的剧本中

...
...

tasks:
  - name: check if war exists
    stat:
      path: files/wars/{{ item.war_name }}
    register: war_file
    loop: "{{ config_vars }}"

  - name: Deploy config file
    copy: src=files/wars/{{ item.war_name }} dest=/opt/{{ item.jboss_folder }}/standalone/deployments/{{ item.war_name }}
    when: item.stat.exists
    loop: "{{ config_vars }}"
    with_items: war_file.results

预期结果:对于存在的战争文件,部署循环应将其拾取并进行复制。如果不存在,则不执行实际结果:各种。对于上述配置,我有:

ERROR! duplicate loop in task: items
The offending line appears to be:


    - name: deploy WAR file
      ^ here

标签: ansibleansible-inventory

解决方案


这可以通过loopand zip(替换旧with_together循环)来实现。

  - name: Deploy config file
    copy: src=files/wars/{{ item.0.war_name }} dest=/opt/{{ item.0.jboss_folder }}/standalone/deployments/{{ item.0.war_name }}
    when: item.1.stat.exists
    loop: "{{ config_vars | zip(war_file.results) | list }}"

这将产生相当详细的输出,因此如果您想最小化它,请添加以下内容:

  loop_control:
    label: "Copy {{ item.0.war_name }}"

推荐阅读