在Ansible中使用acme_certificate模块申请Let’s Encrypt证书时无法找到’challenge_data’的解决方案

64次阅读
没有评论

问题描述

在使用Ansible的acme_certificate模块申请Let’s Encrypt的TLS证书时遇到了问题。他已经成功生成了私钥、CSR等,并使用相应的任务启动了挑战(challenge)。但在尝试满足http-01挑战时出现了错误,错误信息为:”The error was: ‘list object’ has no attribute ‘challenge_data'”。他尝试了多种方式来访问acme_challenge变量,但都无法成功读取该变量的内容。

解决方案

请注意以下操作可能存在版本差异,建议在使用之前做好备份。

用户遇到的问题是因为他在启动Let’s Encrypt挑战时使用了with_items循环,导致acme_challenge变量的结构发生了变化,具体原因可以从Ansible文档的这里找到。解决方案是将每个Let’s Encrypt挑战放在单独的任务中,而不是将它们全部放在一个任务中。

以下是解决问题的步骤:

  1. 确保你已经正确安装并配置了Ansible以及所需的依赖。
  2. 创建一个包含需要的任务的Ansible playbook文件。

以下是一个示例的Ansible playbook文件:

---
- name: Issue Let's Encrypt Certificates
  hosts: your_target_hosts
  tasks:
    - name: Start challenge for www.example.com
      acme_certificate:
        acme_version: 1
        account_key_src: /etc/letsencrypt/account/account.key
        challenge: http-01
        csr: /etc/letsencrypt/csrs/www.example.com.csr
        dest: /etc/letsencrypt/certs/www.example.com.crt
        fullchain_dest: /etc/letsencrypt/certs/fullchain_www.example.com.crt
      # 使用单独的变量保存结果
      register: acme_challenge_www_example

    - name: Implement challenge for www.example.com
      copy:
        content: "{{ item.item.results['challenge_data'][item.item.ansible_loop.index0]['www.example.com']['http-01']['resource-value'] }}"
        dest: "/var/www/html/{{ item.item.results['challenge_data'][item.item.ansible_loop.index0]['www.example.com']['http-01']['resource'] }}"
        owner: root
        group: root
        mode: "u=rw,g=r,o=r"
      loop: "{{ acme_challenge_www_example.results }}"
      # 使用loop_control来访问循环中的每个元素
      loop_control:
        loop_var: item
        extended: yes

在上面的示例中,我们将启动Let’s Encrypt挑战和实现挑战的操作放在了两个不同的任务中,并使用register来保存第一个任务的结果。然后在第二个任务中,我们通过循环来访问每个挑战的结果,并使用item变量来访问具体的挑战数据。

这样,用户就能够在不再使用with_items循环的情况下成功访问acme_challenge的挑战数据,解决了”list object has no attribute ‘challenge_data'”的问题。

正文完