Ansible循环调用ACME角色生成SSL证书时出现冲突错误求助
解决Ansible循环调用角色生成证书时的conflicting action statements错误
问题根源
你遇到的conflicting action statements: hosts, roles错误,核心原因是**include_tasks加载的是任务文件,不能包含playbook级别的关键字**。hosts和roles属于play(剧本)的顶层定义,只能写在主playbook的play块中;而include_tasks引入的文件仅允许包含tasks、handlers这类任务级别的内容。
解决方案
- 移除子任务文件中的
hosts和roles关键字,改用include_role/import_role调用acme角色 - 通过循环变量显式传递域名参数到角色配置中
- 利用主play的上下文继承,无需在子任务中重复定义执行主机
代码示例
主剧本 playbook_getsslcert_main.yml
- name: 批量生成Let's Encrypt证书 hosts: localhost vars: domains_list: - example.com - test.example.com - demo.example.com tasks: - name: 循环调用证书生成任务 include_tasks: playbook_getsslcert_task.yml loop: "{{ domains_list }}" loop_control: loop_var: current_domain
修改后的子任务文件 playbook_getsslcert_task.yml
- name: 调用ACME角色生成当前域名证书 include_role: name: t_systems_mms.acme.acme vars: acme_domain: "{{ current_domain }}" # 填写ACME与AutoDNS的通用配置 acme_challenge_type: dns-01 acme_dns_provider: autodns autodns_user: your_autodns_username autodns_password: your_autodns_password acme_server: https://acme-v02.api.letsencrypt.org/directory # 其他必要配置...
额外优化提示
Ansible 2.9中include_role支持直接添加loop,可以简化结构,无需单独的子任务文件:
- name: 批量生成Let's Encrypt证书 hosts: localhost vars: domains_list: [example.com, test.example.com] acme_common_config: acme_challenge_type: dns-01 acme_dns_provider: autodns autodns_user: your_autodns_username autodns_password: your_autodns_password tasks: - name: 直接循环调用ACME角色 include_role: name: t_systems_mms.acme.acme loop: "{{ domains_list }}" loop_control: loop_var: current_domain vars: "{{ acme_common_config }}" acme_domain: "{{ current_domain }}"
注意:Ansible 2.9中
import_role不支持loop,必须使用include_role
内容的提问来源于stack exchange,提问作者tom006
相关产品推荐
相关产品推荐

