与ansible'合作;s变量、列表和指令

与ansible'合作;s变量、列表和指令,ansible,Ansible,我想使用ansible vault部署敏感数据。基本上,我希望遍历每个存储库,遍历其配置文件,查找保管在vault中的秘密,并用vault中的加密值替换它们。我希望将存储库的值作为一个变量传递,以查看秘密,但不断出现错误 我尝试了各种方法,但不确定如何使用这些数据结构。 非常感谢您的建议 我的代码结构: vars: 存储库:[“service1”、“service2”] 服务1: service1.conf:[“保险库用户1”、“保险库密码1”] service1.env:[“保险库加密1”]

我想使用ansible vault部署敏感数据。基本上,我希望遍历每个存储库,遍历其配置文件,查找保管在vault中的秘密,并用vault中的加密值替换它们。我希望将存储库的值作为一个变量传递,以查看秘密,但不断出现错误

我尝试了各种方法,但不确定如何使用这些数据结构。
非常感谢您的建议

我的代码结构:

vars:
存储库:[“service1”、“service2”]
服务1:
service1.conf:[“保险库用户1”、“保险库密码1”]
service1.env:[“保险库加密1”]
服务2:
service2.conf:[“保险库用户2”、“保险库密码2”]
-名称:地方秘密
替换:
路径:“/tmp/{{repositories}}/{{item.key}”
regexp:“{item.value}}”
替换:“{item.value}}”
带有_项:“{repositories}}| dict2items”
亚马尔酒店

vault\u用户1:a
保险库密码1:b
保险库用户2:c
保险库密码1:d
地下室1:e
service1.conf

user=vault_user1
password=vault_password1
secret=vault_secret1
service2.conf

user=vault_user2
password=vault_password2

给定包含变量的文件(在本例中加密与否没有任何区别)和文件(在本例中根目录为tmp)

shell>cat vault.yaml
保险库用户1:a
保险库密码1:b
保险库用户2:c
保险库密码2:d
地下室1:e
shell>树tmp
tmp
├── 服务1
│   ├── service1.conf
│   └── 服务1.env
└── 服务2
└── service2.conf
shell>cat tmp/service1/service1.conf
保险库用户1
保险库密码1
地下室1
保险库用户2
保险库密码2
shell>cat tmp/service1/service1.env
保险库用户1
保险库密码1
地下室1
保险库用户2
保险库密码2
shell>cat tmp/service2/service2.conf
保险库用户1
保险库密码1
地下室1
保险库用户2
保险库密码2
要解决此问题,必须有两个嵌套循环。在第一个循环中迭代存储库,在第二个循环中迭代变量列表。这可以通过使用文件中的第二个循环迭代include_任务来实现。例如,创建一个文件

shell>cat place\u secrets.yml
-名称:地方秘密
替换:
路径:“tmp/{{dir}}/{{item.0.key}}”
regexp:“{{item.1}}”
替换:“{{my_vault[item.1]}”
带_子元素:
-“{repo|dict2items}”
-价值观
在剧本中,将变量读入字典my_vault,并迭代列表存储库

-hosts:localhost
变量:
存储库:[service1,service2]
服务1:
service1.conf:[vault\u user1,vault\u password1]
service1.env:[vault\u secret1]
服务2:
service2.conf:[vault\u user2,vault\u password2]
任务:
-包括以下变量:
文件:vault.yaml
姓名:my_vault
-包含任务:place_secrets.yml
循环:“{{repositories}}”
回路控制:
循环变量:外部项目
变量:
目录:“{{outer_item}}”
repo:“{{lookup('vars',outer_item)}”
给予

shell>cat tmp/service1/service1.conf
A.
B
地下室1
保险库用户2
保险库密码2
shell>cat tmp/service1/service1.env
保险库用户1
保险库密码1
E
保险库用户2
保险库密码2
shell>cat tmp/service2/service2.conf
保险库用户1
保险库密码1
地下室1
C
D

如果数据结构可以简化,下面的剧本也会给出相同的结果
-hosts:localhost
变量:
存储库:
service1.conf:[vault\u user1,vault\u password1]
service1.env:[vault\u secret1]
service2.conf:[vault\u user2,vault\u password2]
任务:
-包括以下变量:
文件:vault.yaml
姓名:my_vault
-名称:地方秘密
替换:
路径:“tmp/{(item.0.key | splitext.0}}/{{item.0.key}}”
regexp:“{{item.1}}”
替换:“{{my_vault[item.1]}”
带_子元素:
-“{存储库| dict2items}”
-价值观

请添加您收到的错误消息为什么要以如此困难的方式执行此操作?您可以为配置文件使用模板。您的
replace
操作正在搜索与其替换的完全相同的内容。这是复制/粘贴错误吗?除此之外,正如@toydarian所指出的,您可以简单地使用模板。我希望在服务的存储库中保留尽可能多的信息。如果我开始模板化,配置文件会移动到ansible存储库,我不喜欢这样拆分它。是,替换操作目前没有意义。基本上,regexp应该查找“vault\u user1”并将其替换为“a”。是否可以简化变量?请看我的答案。感谢您的详尽回答,我想我可以在AWX中使用库存变量应用简化版本。如果我有更多问题,我会再打给你。再次,非常感谢!!有没有理由不在字典中使用引号?请参阅。