如何解决如何使用Ansible / Jinja2将字符串拆分为列表?
我有以下变量:
domain_names:
- app1.example.com
- app2.example.com
customers:
- name: customer1
- name: customer2
我正在尝试生成以下域名列表:
- customers1.app1.example.com
- customers2.app1.example.com
- customers1.app2.example.com
- customers2.app2.example.com
通过使用以下Ansible / Jinja2代码:
- name: check which certificates exist
stat:
path: '/etc/nginx/{{item}}.crt'
register: cert_file
loop: '{% for d in domain_names %}{{ d }} {% for customer in customers %}{{ customer.name }}.{{ d }} {% endfor %}{% endfor %}'
但是,出现以下错误:
failed | msg: Invalid data passed to 'loop',it requires a list,got this instead: customers1.app1.example.com customers2.app1.example.com customers1.app2.example.com customers2.app2.example.com. Hint: If you passed a list/dict of just one element,try adding wantlist=True to your lookup invocation or use q/query instead of lookup.
我该如何解决?
解决方法
只需使用正确的工具:)。在这种情况下,您的朋友是:
- the
map
filter从您的name
变量中提取customers
属性作为列表 - the
product
filter来混合两个列表
例如test.yml
剧本:
---
- name: product and map filters demo
hosts: localhost
gather_facts: false
vars:
domain_names:
- app1.example.com
- app2.example.com
customers:
- name: customer1
- name: customer2
tasks:
- name: Demonstrate product and map filters use
debug:
msg: "{{ item.0 }}.{{ item.1 }}"
loop: "{{ customers | map(attribute='name') | product(domain_names) | list }}"
哪个给:
$ ansible-playbook test.yml
PLAY [product and map filters demo] *******************************************************************************************************************************************************************************
TASK [Demonstrate product and map filters use] ********************************************************************************************************************************************************************
ok: [localhost] => (item=['customer1','app1.example.com']) => {
"msg": "customer1.app1.example.com"
}
ok: [localhost] => (item=['customer1','app2.example.com']) => {
"msg": "customer1.app2.example.com"
}
ok: [localhost] => (item=['customer2','app1.example.com']) => {
"msg": "customer2.app1.example.com"
}
ok: [localhost] => (item=['customer2','app2.example.com']) => {
"msg": "customer2.app2.example.com"
}
PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
应用于您的任务,它给出:
- name: Check which certificates exist
stat:
path: '/etc/nginx/{{ item.0 }}.{{ item.1 }}.crt'
register: cert_file
loop: "{{ customers | map(attribute='name') | product(domain_names) | list }}"
如果您真的想重新使用该列表,则可以在set_fact
任务中构建它,例如
- name: Create my application names list
vars:
current_name: "{{ item.0 }}.{{ item.1 }}"
set_fact:
application_names_list: "{{ application_names_list | default([]) + [current_name] }}"
loop: "{{ customers | map(attribute='name') | product(domain_names) | list }}"
- name: Check which certificates exist
stat:
path: '/etc/nginx/{{ item }}.crt'
register: cert_file
loop: "{{ application_names_list }}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。