在 Ansible 中组合值

Combining values in 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 任务而不是 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 "
}

例如

    - 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