【问题标题】:How do I copy files to a machine based on a vars flag using ansible?如何使用 ansible 基于 vars 标志将文件复制到机器?
【发布时间】:2020-11-18 12:02:31
【问题描述】:

我正在尝试获取一个剧本来将一组不同的文件复制到服务器,这取决于它在 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


    【解决方案1】:

    变量is_emms_pp = true 是一个字符串。引用自Defining variables at runtime

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

    给定库存以简化测试

    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
    

    【讨论】:

    • 如果我可以多次投票,我会......谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2021-06-23
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多