【发布时间】:2016-12-19 01:30:33
【问题描述】:
我无法完全理解如何告诉 Ansible 执行以下操作:
- 循环遍历 /vars/main.yml 中定义的字典“用户”
- 填写/templates/sql_template.j2中定义的模板
- 使用生成的文件作为参数执行命令
当我运行 playbook 时,我可以在输出中看到字典中的每个项目都在使用。完成后,文件包含最后一项。
此时我有两个选择:
- 使用为每次迭代生成的文件执行我的 sql 命令。
- 以某种方式使每次迭代都添加到文件中而不是覆盖它,然后在循环完成时使用已完成的文件执行 sql 命令
选项 1 看起来像这样,但由于任务中的额外命令而失败
---
- name: Insert web app users
template:
src: sql_template.j2
dest: /tmp/sql_template
with_dict: users
command: cat /tmp/sql_template
我不知道如何解决选项 2。
这些是我目前拥有的将每次迭代写入目标服务器上的文件的文件。不是我需要的,但它很接近。
tasks/main.yml
---
- name: Insert web app users
template:
src: sql_template.j2
dest: /tmp/sql_template
with_dict: users
vars/main.yml
users:
test1:
user_nbr: 500
user_name: "test1"
user_desc: "developer"
password: "f0dd960681eca16f0f5c1cda8d83e72c"
display_name: "Test1"
email: "test1@teset.com"
test2:
user_nbr: 501
user_name: "test2"
user_desc: "developer"
password: "f0dd960681eca16f0f5c1cda8d83e72c"
display_name: "Test2"
email: "test2@test.com"
模板/sql_template.j2
INSERT INTO cbcommon:users (user_nbr, user_name, user_desc, password, user_timeout, suspended, change_password, no_password_expiry, display_name, email) VALUES ({{item.value.user_nbr}}, '{{item.value.user_name}}', '{{item.value.user_desc}}', '{{ item.value.password}}', 60, 0, 0, 1, '{{ item.value.display_name}}', '{{ item.value.email}}' );
INSERT INTO cbcommon:users_orgs (user_nbr, org_nbr, class_nbr, primary_org) VALUES({{item.value.user_nbr}}, 1000, -1, 1);
INSERT INTO cbcommon:users_orgs (user_nbr, org_nbr, class_nbr, primary_org) SELECT {{ item.value.user_nbr}}, org_nbr, -1, 0 FROM orgs WHERE org_nbr != 1000;
【问题讨论】: