ansible上的条件测试

问题描述 投票:0回答:1

我正在尝试使用 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_facts的不同组合,例如:

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

,但是这些方法都不起作用。但是,如果我只是放置字符串而不是变量,它就可以正常工作。例如,

    ansible_facts.packages['httpd'] 

检查变量的正确语法是什么? 另外,确认一下,我可以传递一个数组给它来同时检查多个包吗?

ansible ansible-2.x ansible-facts
1个回答
2
投票
  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
© www.soinside.com 2019 - 2024. All rights reserved.