2016-02-20 61 views
0

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

你只需要逃避,因爲你引用了整個字符串。我的任務在Ansible 2.0.0.2下進行了測試 - 但的確,他們在Ansible 2中改變了一些影響反斜槓轉義的內容。 – udondan

+0

在Ansible 1.9.4上沒有引用字符串,它似乎不適用於我。輸出看起來像這樣'INSERT INTO'\ u0001'/d'。 –

回答

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()。我原本沒想到。

+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「' –