ansible - 如何使用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
解决方案
这可以通过loop
and 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 }}"
推荐阅读
- ruby-on-rails - Rails:作用域关联上的删除行为与仅从关联中删除不同
- python - 如何使用 DEAP 定义遵循特定顺序模式的自定义遗传算法个体
- asp.net - EF 6.2 - 具有引用 1 个表的 2 个导航属性的表
- javascript - 如何更改函数返回的对象属性以使函数可重用
- ruby-on-rails - 如何在 ruby on rails 中合并 json arry
- sql - SQL 如何从 2 列的组合中查找重复项,不区分大小写和重音
- mongodb - 删除同一字段上匹配的两个正则表达式
- powershell - Azure Web App - 设置 TLS 的最低版本
- angular -
- javascript - 尽管使用缓冲区调用文件类型 npm 模块,但它返回 null,我做错了什么?