我正在使用 Ansible 模板在 SQL 匯入檔案中包含變數,直到最近,ansible 正在決議模板中變數周圍的引號并消除其中的一些,這是它從未習慣的地方。
例如,以下...
INSERT INTO `my_table` VALUES (1, '{{ var.one }}', NULL, '{{ var.two }}');
...現在導致...
INSERT INTO `my_table` VALUES (1, 'value-one, NULL, value-two');
請注意,中間的兩個單引號已被洗掉。這打破了 SQL。根據 MySQL/ANSI 標準,我應該對字串文字使用單引號,而只對識別符號使用反引號。那么這里的解決方案是什么?有誰知道這種行為何時改變?
我正在使用 Ansible 2.9.27
根據要求,這是簡單的模板任務呼叫...
- name: Copy SQL Dynamic Data Dump File for import
template: src=data.sql.j2 dest=/tmp/data.sql
uj5u.com熱心網友回復:
所以顯然這與 Jinja2 中的一個已知錯誤有關,該錯誤已在 2.11 中修復。我使用的是 3.0.3,所以奇怪的是它仍然是一個問題,所以我用 Ansible 發布了一個錯誤報告,他們已經確認了這種行為。在 Ansible 2.11 中,Jinja2 Native 在模板中的使用方式已經改變,這應該可以解決這個問題,但是直到它在我們發行版的發布通道中可用,我們已經能夠通過禁用 Jinja2 中的“本機”支持來解決這個問題,我們正在使用。這可能會導致其他問題,但我們陷入困境,因為 Ansible 2.9 現在只接收安全補丁。
我的錯誤報告在這里:https ://github.com/ansible/ansible/issues/76761
Jinja2 錯誤報告在這里:https ://github.com/pallets/jinja/issues/1020
uj5u.com熱心網友回復:
這個問題已經解決了。下面的示例在 2.10 和 2.12 中都適用于我
- ansible [核心 2.12.1],python 3.8.5,jinja 3.0.1
- ansible 2.10.11,python 3.6.9,python3-jinja2 2.10-1ubuntu0.18.04.1
shell> cat import.sql.j2
INSERT INTO my_table VALUES (1, '{{ var.one }}', NULL, '{{ var.two }}');
和任務
- template:
src: import.sql.j2
dest: import.sql
vars:
var:
one: value-one
two: value-two
給出有效的 SQL
shell> cat import.sql
INSERT INTO my_table VALUES (1, 'value-one', NULL, 'value-two');
作為一種解決方法,將單引號放入運算式中
shell> cat import.sql.j2
INSERT INTO my_table VALUES (1, {{ "'" }}{{ var.one }}{{ "'" }}, NULL, {{ "'" }}{{ var.two }}{{ "'" }});
使用 sed 在全域范圍內進行這些更改,例如
shell> cat templates/import.sql.j2
INSERT INTO my_table VALUES (1, '{{ var.one }}', NULL, '{{ var.two }}');
shell> for i in templates/*; do sed -i "s/'/{{ \"'\" }}/g" $i; done
shell> cat templates/import.sql.j2
INSERT INTO my_table VALUES (1, {{ "'" }}{{ var.one }}{{ "'" }}, NULL, {{ "'" }}{{ var.two }}{{ "'" }});
(可選)選擇一個 linter 并驗證 SQL。模板模塊中的validate選項不適用于sqlfluff ,因此下面使用下一個命令任務。不包括行長度的測驗(--exclude-rules L016)。
- template:
src: import.sql.j2
dest: import.sql
register: result
vars:
var:
one: value-one
two: value-two
- command: "sqlfluff lint {{ result.dest }} --exclude-rules L016"
changed_when: false
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/418488.html
標籤:
上一篇:在woocommerce電子郵件模板中添加客戶用戶名
下一篇:有沒有辦法解決這個日期時間錯誤?
