我想使用Ansible獲取數據庫的數組,使用表的子元素,然後遍歷它們以創建sed單行數據庫將所有的插入軌跡從SQL轉儲文件剝離到這些表中。在Ansible中迭代多維數組/字典並連接子元素
的數據庫和表將被定義爲如下...
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模塊中執行此操作,但我不太確定如何將表名稱拼合/拼接在一起。
任何幫助或建議,將不勝感激!
UPDATE
感謝@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所以我不得不改變\\\\ 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
你只需要逃避,因爲你引用了整個字符串。我的任務在Ansible 2.0.0.2下進行了測試 - 但的確,他們在Ansible 2中改變了一些影響反斜槓轉義的內容。 – udondan
在Ansible 1.9.4上沒有引用字符串,它似乎不適用於我。輸出看起來像這樣'INSERT INTO'\ u0001'/d'。 –