我想使用Ansible来获取一个数据库数组,其中包含表的子元素,然后遍历它们以创建一个sed单行程序,它可以从SQL转储文件中删除对这些表的所有插入痕迹。
数据库和表格定义如下......
databases:
- db1:
- table1
- table2
- db2:
- table3
- table4
- table5
我希望Ansible运行的命令如下......
cat db1.sql | sed '/INSERT INTO `table1`/d' | sed '/INSERT INTO `table2`/d' > db1-out.sql
cat db2.sql | sed '/INSERT INTO `table3`/d' | sed '/INSERT INTO `table4`/d' | sed '/INSERT INTO `table5`/d' > db2-out.sql
我相信我应该可以使用with_items来使用shell模块执行此操作,但我不太确定如何将表名一起内爆/连接。
任何帮助或建议都将不胜感激!
更新
感谢@udondan的解决方案,这是一个与Ansible 1.9.4一起使用的示例剧本:
---
# Example playbook for Ansible 1.9.4
- hosts: localhost
vars:
databases:
- db1:
- table1
- table2
- db2:
- table3
- table4
- table5
tasks:
- shell: "cat {{ item.keys() | first }}.sql | {{ item[item.keys() | first] | map(\"regex_replace\", \"^(.*)$\", \"sed '/INSERT INTO `\\\\1`/d'\") | join(\" | \") }} > {{ item.keys() | first }}-out.sql"
with_items: databases
不幸的是,在Ansible 2.0.0.2中,regexp替换转义似乎有所不同,因此我不得不将\\\\ 1(四倍反斜杠)更改为\\ 1(双反斜杠)
---
# Example playbook for Ansible 2.0.0.2
- hosts: localhost
vars:
databases:
- db1:
- table1
- table2
- db2:
- table3
- table4
- table5
tasks:
- shell: "cat {{ item.keys() | first }}.sql | {{ item[item.keys() | first] | map(\"regex_replace\", \"^(.*)$\", \"sed '/INSERT INTO `\\1`/d'\") | join(\" | \") }} > {{ item.keys() | first }}-out.sql"
with_items: databases
答案 0 :(得分:0)
- shell: cat {{ item.keys() | first }}.sql | {{ item[item.keys() | first] | map("regex_replace", "^(.*)$", "sed '/INSERT INTO `\1`/d'") | join(" | ") }} > {{ item.keys() | first }}-out.sql
with_items: databases
此任务将执行命令:
cat db1.sql | sed '/INSERT INTO `table1`/d' | sed '/INSERT INTO `table2`/d' > db1-out.sql
cat db2.sql | sed '/INSERT INTO `table3`/d' | sed '/INSERT INTO `table4`/d' | sed '/INSERT INTO `table5`/d' > db2-out.sql
map将另一个过滤器应用于列表的每个元素。在这种情况下regex_replace。 join将一系列字符串连接成一个字符串。 .keys()
获取python哈希的键。
如果你看过我以前的答案......我首先想到的是,如果不知道字典键的名称就无法获取数据,但事实证明你实际上可以正确使用keys()
在模板中。我没想到。