如果嵌套列表中的 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
我尝试调试嵌套列表但失败了,所以我想实现两件事:
- 如果 List 中至少有一个
use_certbot: true
,则执行任务
- 获取
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}}"
祝你好运
如果嵌套堆栈中的变量为真,我正在尝试在 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
我尝试调试嵌套列表但失败了,所以我想实现两件事:
- 如果 List 中至少有一个
use_certbot: true
,则执行任务 - 获取
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}}"
祝你好运