我在使用 shell 模塊的劇本中有一個任務。該任務還恰好包含一個 sql 命令,該命令在其語法中需要單引號,該命令也恰好位于帶有字串附加的變數中。我嘗試了許多方法來轉義這些單引號,但都無濟于事,包括反引號、雙單引號、轉義/引號過濾器,甚至標量折疊,似乎都沒有奏效。
如果您在 shell 中鍵入命令,它會是什么樣子。(這確實有效)
sudo mysql databasename -e "insert into Scanner values (63,63,'M63')"
導致問題的任務中的代碼是什么樣的,由于單引號問題,沒有正確插值 ct_machine_serial 變數:(這就是問題所在。)
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers.
shell: >-
mysql databasename -e "insert into Scanner values ({{ ctfile1_vars.ct_machine_serial_number | string ',' ctfile1_vars.ct_machine_serial_number | string ',' ''' ctfile1_vars.ct_machine_serial | upper ''' }})"
become: yes
become_method: sudo
register: result
此外,ctfile1_vars 源自從include_varsyaml 檔案匯入的資料。檔案內容很簡單,如下:
ct_machine_serial: m63
ct_machine_serial_number: 63
所以基本上應該制定 shell 任務,使其輸出與我在第一個示例中的 shell 命令完全相同。然而,我所期望的并沒有發生。
現在我已經定義了基礎知識,下面是完全包含的實際劇本代碼。
tasks:
- name: Full import of the active scanner variables storage file for next sql modificaton.
include_vars:
file: ~/active_ct-scanner-vars.yml
name: ctfile1_vars
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers.
shell: >-
mysql databasename -e "insert into Scanner values ({{ ctfile1_vars.ct_machine_serial_number | string ',' ctfile1_vars.ct_machine_serial_number | string ',' ''' ctfile1_vars.ct_machine_serial | upper ''' }})"
become: yes
become_method: sudo
register: result
最后,這是使用超級詳細的運行結果,-vvv它確實很好地顯示了錯誤:
fatal: [server-1]: FAILED! => {
"changed": true,
"cmd": "mysql databasename -e \"insert into Scanner values (63,63, ctfile1_vars.ct_machine_serial | upper )\"",
"delta": "0:00:00.011330",
"end": "2022-10-17 17:13:46.813905",
"invocation": {
"module_args": {
"_raw_params": "mysql databasename -e \"insert into Scanner values (63,63, ctfile1_vars.ct_machine_serial | upper )\"",
"_uses_shell": true,
"argv": null,
"chdir": null,
"creates": null,
"executable": null,
"removes": null,
"stdin": null,
"stdin_add_newline": true,
"strip_empty_ends": true,
"warn": true
}
},
"msg": "non-zero return code",
"rc": 1,
"start": "2022-10-17 17:13:46.864367",
"stderr": "ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1",
"stderr_lines": [
"ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1"
],
"stdout": "",
"stdout_lines": []
}
如輸出所示,單引號(我假設)搞砸了ctfile1_vars.ct_machine_serial | upper變數和過濾器的正確插值/處理。由于缺少單引號,這顯然會阻止插入正確的值并破壞 mysql 語法。它顯然應該簡單地是: 'M63'就像在作業命令 shell 示例中一樣。
我已經嘗試了數百次修復迭代,所以我希望這里有人能告訴我我做錯了什么。提前致謝!
uj5u.com熱心網友回復:
以下應該可以解決您的問題:
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers.
vars:
sernum: "{{ ctfile1_vars.ct_machine_serial_number }}"
ser: "{{ ctfile1_vars.ct_machine_serial }}"
shell: >-
mysql databasename -e "insert into Scanner values
({{ sernum | int }}, {{ sernum | int }}, '{{ ser | upper }}')"
同時,正如評論中所建議的,您可以遵循 ansible 良好實踐(即當模塊存在時不要使用 shell ),同時降低一個參考級別:
- name: Insert scanner ct/ecc serial values into the sql database on both dispatchers.
vars:
sernum: "{{ ctfile1_vars.ct_machine_serial_number }}"
ser: "{{ ctfile1_vars.ct_machine_serial }}"
mysql_query:
login_user: "{{ vault_encrypted_login }}"
login_password: "{{ vault_encrypted_password }}"
login_db: databasename
query: >-
insert into Scanner values
({{ sernum | int }}, {{ sernum | int }}, '{{ ser | upper }}')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/516883.html
標籤:壳可靠的逃跑
上一篇:使用awk搜索包含方括號的模式
