如果嵌套列表中的 var 在 Ansible 中为真,则执行任务

Execute Task if var in nested List is true in Ansible

如果嵌套堆栈中的变量为真,我正在尝试在 Ansible 中执行任务,但无法让它工作...

我的列表看起来像这样:

apache_vhosts_ssl:
  - servername: local.host.com
    documentroot: "/var/www/html/web"
  - servername: webcontent1.com
    documentroot: "/var/www/webcontent1.com/web"
  - servername: webcontent2.com
    use_certbot: true
    documentroot: "/var/www/webcontent2.com/web"
  - servername: webcontent3.com
    documentroot: "/var/www/webcontent3.com/web"
    use_certbot: true

我尝试调试嵌套列表但失败了,所以我想实现两件事:

  1. 如果 List 中至少有一个 use_certbot: true,则执行任务
  2. 获取 servername 的列表,其中 use_certbot: true 可以在该任务中使用

如有任何想法、建议甚至答案都将是完美的,谢谢!

试试这个

    - debug:
        msg: "Execute this task for {{ srv_list }}"
      when: srv_list|length > 0
      vars:
        srv_list: "{{ apache_vhosts_ssl|
                      selectattr('use_certbot', 'defined')|
                      selectattr('use_certbot')|
                      map(attribute='servername')|
                      list }}"

给予

  msg: Execute this task for ['webcontent2.com', 'webcontent3.com']

如果您使用的是列表变量,我建议您添加“use_certbot: false”并且对于没有 use_certbot 的服务器不要将此项留空。 您的 vars 文件应如下所示。

apache_vhosts_ssl:
  - servername: local.host.com
    documentroot: "/var/www/html/web"
    use_certbot: false
  - servername: webcontent1.com
    documentroot: "/var/www/webcontent1.com/web"
    use_certbot: false
  - servername: webcontent2.com
    use_certbot: true
    documentroot: "/var/www/webcontent2.com/web"
  - servername: webcontent3.com
    documentroot: "/var/www/webcontent3.com/web"
    use_certbot: true

这样的剧本:

- name: playbook name
  hosts: localhost
  vars_files:
    - varsfilename.yml
  tasks:
    - name: task name
      debug:
        msg: "{{ item.servername }}"
      loop: "{{ apache_vhosts_ssl }}"
      when: "{{ item.use_certbot}}"

祝你好运