Ansible中如何重命名或映射变量键,实现cert_item.name转cert_item.domains
方案1:修改循环表达式,直接生成符合要求的变量结构
通过Jinja2过滤器在循环时动态给每个vhost项新增要求的domains字段,不修改原始变量:
- include_tasks: create-cert-standalone.yml loop: "{{ apache2.vhost | map('combine', {'domains': [item.name]}) | list }}" when: - certbot_create_if_missing - certbot_create_method == 'standalone' - item.add_ssl | d(true) loop_control: loop_var: cert_item
说明:combine过滤器会保留原有vhost的所有属性,仅新增domains字段,值为单元素数组适配certbot的参数要求,处理后的变量直接用于循环即可满足被调用任务的参数要求。
方案2:保留原有循环逻辑,引入时动态补全属性
如果不想修改原有循环的遍历逻辑,可以在调用include任务时通过vars参数动态补全字段:
- include_tasks: create-cert-standalone.yml loop: "{{ apache2.vhost }}" when: - certbot_create_if_missing - certbot_create_method == 'standalone' - cert_item.add_ssl | d(true) loop_control: loop_var: cert_item vars: # 动态补全domains字段,优先级高于原始循环变量,不会修改源数据 cert_item: "{{ cert_item | combine({'domains': [cert_item.name]}) }}"
注意:certbot要求domains为列表类型,必须把单个域名包裹在[]中转为数组格式,否则会出现传值格式错误。
内容的提问来源于stack exchange,提问作者Azer Tyker
相关产品推荐
相关产品推荐

