迭代多维数组/字典并连接Ansible

时间:2016-02-20 00:39:13

标签: ansible jinja2

我想使用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

1 个答案:

答案 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_replacejoin将一系列字符串连接成一个字符串。 .keys()获取python哈希的键。

如果你看过我以前的答案......我首先想到的是,如果不知道字典键的名称就无法获取数据,但事实证明你实际上可以正确使用keys()在模板中。我没想到。