2

我正在尝试将本地容器注册表的证书复制到具有 ansible 版本 2.9.6 的 Docker 主机。注册表由其他人管理,但在我们的本地网络中。

使用外壳我会这样做:

openssl s_client -showcerts -connect registry.example:443 < /dev/null 2> /dev/null | openssl x509 -outform PEM > ca.crt

到目前为止,我在community.crypto模块上工作了 ansible ans 设法获得证书:

- name: get certificate from registry
  community.crypto.get_certificate:
    host: "{{ registry_url }}"
    port: "{{ registry_port }}"
  delegate_to: localhost
  become: no
  register: cert

这类似于 shell 替代方案的前半部分。我还没有弄清楚如何完成后半部分的工作,即使用从服务器接收到的内容创建证书。

我尝试使用community.crypto.x509_certificate,但无法使其表现得像openssl_client以下 shell 示例中的那样。

openssl x509 -outform PEM -in server_content_file -text -out ca.crt

有没有办法用community.crypto模块或以任何其他方式使用 ansible 来做到这一点?

4

1 回答 1

2

您没有采用的一种选择是openssl在 Ansible 中运行命令。以下示例假设您已将remotehost变量设置为 eg registry.example

- hosts: localhost
  gather_facts: false
  tasks:
    - name: get remote certificate
      command: openssl s_client -showcerts -connect {{ remotehost }}
      register: remotecert

    - name: extract certificate
      command: openssl x509 -outform PEM
      args:
        stdin: "{{ remotecert.stdout }}"
      register: remotex509

    - name: write ca.crt
      copy:
        dest: ./ca.crt
        content: "{{ remotex509.stdout }}"

虽然不那么精细,但您当然可以将所有内容组合到一个 shell 脚本中:

- hosts: localhost
  gather_facts: false
  tasks:
    - name: get remote certificate
      shell: >-
        openssl s_client -showcerts -connect {{ remotehost }} |
        openssl x509 -outform PEM > ca.crt
      args:
        creates: ca.crt
      register: remotecert

如果目标文件 ( ) 已经存在,creates则 args 将导致任务被跳过。ca.crt

于 2021-07-19T12:29:39.660 回答