首页 > 解决方案 > 如何使用 ansible 根据 vars 标志将文件复制到机器?

问题描述

我正在尝试获取一个剧本来将一组不同的文件复制到服务器,这取决于它在 ansible 库存中所属的组上设置的标志。

代码如下

      - name: check if they exist already
       stat:
         path: /home/me/set1files
       register: st
     - name: copy pre-prod if they don't
       copy:
         src: /home/me/set1files
         dest: /home/me
         owner: me
         group: me
         mode: "0644"
      when: (st.stat.exists==false) and (is_emms_pp==true)

     - name: check if prod files exist
       stat:
        path: /home/me/set2files
      register: stprod
     - name: copy prod files
       copy:
         src: /home/me/set2files
         dest: /home/me
         owner: me
         group: me
         mode: "0644"
      when: (stprod.stat.exists==false) and (is_emms_pp==false)

并在库存文件中

  [PPEMMS]
  emmspp1
  emmspp2
  emmspp3

  [PPEMMS:vars]
  is_emms_pp = true
                                                                                                                              
  [PRODEMMS]
  emms1
  emms2
  emms3

  [PRODEMMS:vars]
  is_emms_pp = false

  [EMMS:children]
  PPEMMS
  PRODEMMS

当我在新的 PP 机器上运行脚本时,一切似乎都运行良好,但是当我在新的 Prod 机器上运行它时,它仍然会复制 PP 文件并跳过 Prod 机器的步骤。

这是一个有效的测试还是我有什么问题?

我的一个想法是,因为我将脚本限制为一台机器,而不是组,所以它没有选择 group_var?

我正在使用脚本作为

ansible-playbook -i inventory/hosts -l emms1 install_emms.yml  --ask-vault-pass  --extra-vars '@passwd.yml'

对于每台机器。

标签: ansible

解决方案


变量is_emms_pp = true是一个字符串。引用在运行时定义变量

"使用 key=value 语法传入的值被解释为字符串。如果您需要传递非字符串值,例如布尔值、整数、浮点数、列表等,请使用 JSON 格式。 "

给定库存以简化测试

test_01 is_emms_pp=true
test_02 is_emms_pp=false

剧本

- hosts: test_01,test_02
  tasks:
    - debug:
        var: is_emms_pp|type_debug

ok: [test_01] => 
  is_emms_pp|type_debug: str
ok: [test_02] => 
  is_emms_pp|type_debug: str

字符串和布尔值之间的比较将失败

    - debug:
        msg: Copy file
      when: is_emms_pp == true

skipping: [test_01]
skipping: [test_02]

一种选择是比较字符串。下面的任务按预期工作

    - debug:
        msg: Copy file
      when: is_emms_pp == 'true'

ok: [test_01] => 
  msg: Copy file
skipping: [test_02]

更简洁的选项是将变量转换为布尔值。下面的任务给出了相同的结果

    - debug:
        msg: Copy file
      when: is_emms_pp|bool

请参阅CONDITIONAL_BARE_VARS


如何修复条件的示例

    - name: check if they exist already
      stat:
        path: /home/me/set1files
      register: st
    - name: copy pre-prod if they don't
      debug:
        msg: Copy set1files
      when:
        - not st.stat.exists
        - is_emms_pp|bool

    - name: check if prod files exist
      stat:
        path: /home/me/set2files
      register: st
    - name: copy prod files
      debug:
        msg: Copy set2files
      when:
        - not st.stat.exists
        - not is_emms_pp|bool

推荐阅读