代码之家  ›  专栏  ›  技术社区  ›  csx4

ansible的条件检验

  •  -1
  • csx4  · 技术社区  · 3 年前

    我正在尝试检查是否安装了特定的软件包或没有使用ansible,以下是我的任务

    - name: check whether a package called {{ pkg_name }} is installed or not
      ansible.builtin.debug:
        msg: "{{ ansible_facts.packages['pkg_name'] }} is installed
      when: "pkg_name in ansible_facts.packages"
    

    pkg_name是我定义的变量,我尝试过与ansible_fact的不同组合,如:

    "{{ ansible_facts.packages['pkg_name'] }} is installed"
    "{{ ansible_facts.packages.{{ pkg_name }} }} is installed"
    

    但是这些方法都不起作用,但是如果我简单地放字符串而不是变量,它就可以很好地工作,即。

    ansible_facts.packages['httpd'] 
    

    使用变量检查的正确语法是什么? 还确认我可以将数组传递给它以同时检查多个包吗

    1 回复  |  直到 3 年前
        1
  •  1
  •   Vladimir Botka    3 年前
    1. pkg_name 是一个变量。不要在括号中引用它
      {{ ansible_facts.packages[pkg_name] }}
    
    1. 不引用条件
      when: pkg_name in ansible_facts.packages
    

    完整的测试剧本示例

    shell> cat pb.yml
    - hosts: foo
    
      tasks:
    
        - package_facts:
            manager: auto
    
        - debug:
            msg: "{{ ansible_facts.packages[item].0.name }} is installed."
          when: item in ansible_facts.packages
          loop:
            - openssh
            - http
    

    给予

    shell> ansible-playbook pb.yml
    
    PLAY [foo] ************************************************************************************
    
    TASK [package_facts] **************************************************************************
    ok: [foo]
    
    TASK [debug] **********************************************************************************
    ok: [foo] => (item=openssh) => 
      msg: openssh is installed.
    skipping: [foo] => (item=http) 
    
    PLAY RECAP ************************************************************************************
    foo: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0