我需要创建一个用于续订的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
...
...
...
如何在一个命令中从每个vhost
的nginx.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 "
}