组合Ansible中的值



我需要创建一个用于续订的cronjob,以便加密证书。最后的命令应该是这样的:

certbot certonly --no-eff-email -m my@mail.com --redirect --agree-tos --non-interactive --standalone -d mydomain.com -d www.mydomain.com -d domain1.mydomain.com -d domain1a.mydomain.com -d domain2.mydomain.com -d domain2a.mydomain.com

我有以下变量:

nginx:
vhost:
- name: mydomain.com
server_name:
- mydomain.com
- www.mydomain.com
...
...
- name: domain1.mydomain.com
server_name:
- domain1.mydomain.com
- domain1a.mydomain.com
...
...
- name: domain2.mydomain.com
server_name:
- domain2.mydomain.com
- domain2a.mydomain.com
...
...
...

如何在一个命令中从每个vhostnginx.vhost.server_name获取这些值?

例如

- debug:
msg: "cerbot -d {{ server_names }}"
vars:
server_names: "{{ nginx.vhost|map(attribute='server_name')|flatten|join(' -d ') }}"

给出

msg: cerbot -d mydomain.com -d www.mydomain.com -d domain1.mydomain.com -d domain1a.mydomain.com -d domain2.mydomain.com -d domain2a.mydomain.com

这里有一个例子;我使用的是debug任务,而不是command任务,因为我不想在我的计算机上实际运行任何东西,但这应该演示以下技术:

- hosts: localhost
gather_facts: false
vars:
nginx:
vhost:
- name: mydomain.com
server_name:
- mydomain.com
- www.mydomain.com
- name: domain1.mydomain.com
server_name:
- domain1.mydomain.com
- domain1a.mydomain.com
- name: domain2.mydomain.com
server_name:
- domain2.mydomain.com
- domain2a.mydomain.com
tasks:
- debug:
msg: "cerbot {% for name in server_names %}-d {{name}} {%endfor%}"
vars:
server_names: "{{ nginx.vhost|map(attribute='server_name')|flatten }}"

我们使用map过滤器从nginx.vhost列表中的每个项目中提取server_name的值,然后将结果传递给flatten,以获得单个列表而不是列表列表。

运行以上操作将生成输出:

TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "cerbot -d mydomain.com -d www.mydomain.com -d domain1.mydomain.com -d domain1a.mydomain.com -d domain2.mydomain.com -d domain2a.mydomain.com "
}

最新更新