我可能错过了一些简单的事情。我的字典在 vars.yml
deploy_env:
dev:
schemas:
year1:
- main
- custom
year2:
- main
- custom
- security
year3:
- main
- custom
然后在我的playbook.yml中,我有类似的东西
- set_fact:
years: "{{ deploy_env.dev.schemas }}"
- name: Create schemas
shell: "mysql ....params go here... {{ item }}"
with_nested:
- "{{ years }}"
如果 vars.yml 中的模式是一个简单的列表,则上述方法可以正常工作,即:
deploy_env:
dev:
schemas:
- year1
- year2
- year3
但是一旦我在每年下添加额外的项目(使其成为字典(?),我就开始收到错误:
- "{{ years }}
我基本上想用此任务的 year1、year2、year3 值填充 {{years}}。
我看过很多例子,但我看到的所有内容都非常复杂,而且都是关于如何创建字典,这没有帮助。
可以创建字典键的列表。例如,
- set_fact:
years: "{{ deploy_env.dev.schemas.keys()|list }}"
- debug:
var: item
loop: "{{ years }}"
给出(删节)
item: year1
item: year2
item: year3
注意:方法key()在上面的表达式中是多余的。默认情况下,字典到列表的转换会返回字典键的列表。例如,下面的迭代给出相同的结果
loop: "{{ deploy_env.dev.schemas | list }}"
列表与字典
引用问题:
“...我在每年下添加额外的项目(使其成为字典(?)...”
添加项目不会将列表更改为字典。
YAML中的破折号
-
引入了列表中的一项。
列表示例:
schemas:
- year1
- year2
- year3
具有单个列表的哈希列表示例:
schemas:
- year1:
- main
- custom
- year2:
- main
- custom
- security
- year3:
- main
- custom
字典示例:
schemas:
year1:
- main
- custom
year2:
- main
- custom
- security
year3:
- main
- custom
备注:
- debug:
msg: "{{ deploy_env.dev.schemas|difference(['year2']) }}"
给予
msg:
- year1
- year3
- hosts: localhost
vars:
deploy_env:
dev:
schemas:
year1: [main, custom]
year2: [main, custom, security]
year3: [main, custom]
tasks:
- set_fact:
years: "{{ deploy_env.dev.schemas.keys()|list }}"
- debug:
var: item
loop: "{{ years }}"
- debug:
msg: "{{ deploy_env.dev.schemas|difference(['year2']) }}"