如何为Ansible Playbook的delete_signer_cert_cert_id传递多值并避免代码重复?
批量删除过期签名证书的Ansible正确写法
1. 先搞个证书ID列表的变量文件
建个vars/expired_certs.yml,把所有要删的证书ID塞进去:
expired_cert_ids: - "cert-xxxx-1234" - "cert-yyyy-5678" - "cert-zzzz-90ab"
2. Playbook里循环调用角色
直接在调用角色的时候用loop遍历上面的列表就行,之前报错是因为瞎用{{ item.my_list }}——你遍历的是单个证书ID的列表,每个item就是一个证书ID,直接把delete_signer_cert_cert_id设为{{ item }}就对了:
- name: 批量删过期签名证书 hosts: your_target_hosts vars_files: - vars/expired_certs.yml roles: - name: delete_signer_cert loop: "{{ expired_cert_ids }}" vars: delete_signer_cert_cert_id: "{{ item }}"
为啥之前报错?
你之前写{{ item.my_list }},但loop遍历的是expired_cert_ids这个列表,每个item就是一个字符串形式的证书ID,根本没有my_list这个属性,Ansible找不到当然报item未定义(本质是item.my_list未定义)。
进阶玩法:带额外参数的批量删除
如果需要给每个证书传更多参数(比如环境、备注),可以把列表改成字典:
expired_certs: - cert_id: "cert-xxxx-1234" env: "生产环境" - cert_id: "cert-yyyy-5678" env: "测试环境"
对应的Playbook写法:
- name: 带参数批量删过期证书 hosts: your_target_hosts vars_files: - vars/expired_certs.yml roles: - name: delete_signer_cert loop: "{{ expired_certs }}" vars: delete_signer_cert_cert_id: "{{ item.cert_id }}" # 顺便把环境变量也传给角色 target_env: "{{ item.env }}"
内容的提问来源于stack exchange,提问作者Rjitta
相关产品推荐
相关产品推荐

