如何使用带变量的ansible执行psql命令
How to execute psql command using ansible with variables
我正在尝试 运行 下面的任务,但出现错误。
-
name: Check if Schema exist
shell: "psql -h {{ dbserver }} -U {{ dbuser } {{ dbname }} -c '\dt' | grep -c public"
environment:
PGPASSFILE: "{{ pgpass_file }}"
register: table_count
-
name: Check if admin user exists or not
shell: "psql -h {{ dbserver }} -U {{ dbuser } {{ dbname }} -c 'select count(*) from user where name='adam'' | awk NR==3"
environment:
PGPASSFILE: "{{ pgpass_file }}"
register: admin_count
when: table_count.stdout != "0"
以下是我遇到的错误。
The offending line appears to be:
name: Check if Schema exist
shell: "psql -h {{ dbserver }} -U {{ dbuser } {{ dbname }} -c '\dt' | grep -c public"
^ here
现在我可以尝试替换这些变量并使用它,它可能会工作,但我如何让它工作,我尝试了 -c "\dt"(使用 '' 作为转义字符)但那没有工作也很好
问题实际上是 "
(不必要地)包装了您的 shell:
标量,因为 \
是 interpreted inside of double-quoted scalar values
你可以看到这个动作:
$ printf 'alpha: beta \dt\n' | yaml2json
{"alpha":"beta \dt"}
$ printf 'alpha: "beta \dt"\n' | yaml2json
Error: Cannot parse as YAML (while scanning a double-quoted scalar
in "<byte string>", line 1, column 8:
alpha: "beta \dt"
^
found unknown escape character 'd'
因此,您有两条前进的道路:
- 只需删除双引号,因为您的
shell:
中没有任何内容需要 yaml 解析器的保护
- 将内部
\dt
移动到 单引号 vars:
并让 ansible 为您引用它
- 按照 P.... 所说的去做,试试“为此我需要多少个反斜杠?”游戏
shell: psql -h {{ dbserver }} -U {{ dbuser }} {{ dbname }} -c '\dt' | grep -c public
或
shell: psql -h {{ dbserver }} -U {{ dbuser }} {{ dbname }} -c {{ psql_c | quote }} | grep -c public
vars:
psql_c: '\dt'
你几乎肯定会想利用 vars:
技巧来解决下一个问题,你会问为什么 name: Check if admin user exists or not
没有按照你的预期去做,因为在那个声明中也疯狂引用了你的-c
shell: "psql -h {{ dbserver }} -U {{ dbuser }} {{ dbname }} -c {{ psql_c | quote }} | awk NR==3"
vars:
psql_c: >-
select count(*) from user where name='adam'
p.s。我也在 dbuser }}
中冒昧地修正了你不匹配的胡须拼写错误,当时我正在做
我正在尝试 运行 下面的任务,但出现错误。
-
name: Check if Schema exist
shell: "psql -h {{ dbserver }} -U {{ dbuser } {{ dbname }} -c '\dt' | grep -c public"
environment:
PGPASSFILE: "{{ pgpass_file }}"
register: table_count
-
name: Check if admin user exists or not
shell: "psql -h {{ dbserver }} -U {{ dbuser } {{ dbname }} -c 'select count(*) from user where name='adam'' | awk NR==3"
environment:
PGPASSFILE: "{{ pgpass_file }}"
register: admin_count
when: table_count.stdout != "0"
以下是我遇到的错误。
The offending line appears to be:
name: Check if Schema exist
shell: "psql -h {{ dbserver }} -U {{ dbuser } {{ dbname }} -c '\dt' | grep -c public"
^ here
现在我可以尝试替换这些变量并使用它,它可能会工作,但我如何让它工作,我尝试了 -c "\dt"(使用 '' 作为转义字符)但那没有工作也很好
问题实际上是 "
(不必要地)包装了您的 shell:
标量,因为 \
是 interpreted inside of double-quoted scalar values
你可以看到这个动作:
$ printf 'alpha: beta \dt\n' | yaml2json
{"alpha":"beta \dt"}
$ printf 'alpha: "beta \dt"\n' | yaml2json
Error: Cannot parse as YAML (while scanning a double-quoted scalar
in "<byte string>", line 1, column 8:
alpha: "beta \dt"
^
found unknown escape character 'd'
因此,您有两条前进的道路:
- 只需删除双引号,因为您的
shell:
中没有任何内容需要 yaml 解析器的保护 - 将内部
\dt
移动到 单引号vars:
并让 ansible 为您引用它 - 按照 P.... 所说的去做,试试“为此我需要多少个反斜杠?”游戏
shell: psql -h {{ dbserver }} -U {{ dbuser }} {{ dbname }} -c '\dt' | grep -c public
或
shell: psql -h {{ dbserver }} -U {{ dbuser }} {{ dbname }} -c {{ psql_c | quote }} | grep -c public
vars:
psql_c: '\dt'
你几乎肯定会想利用 vars:
技巧来解决下一个问题,你会问为什么 name: Check if admin user exists or not
没有按照你的预期去做,因为在那个声明中也疯狂引用了你的-c
shell: "psql -h {{ dbserver }} -U {{ dbuser }} {{ dbname }} -c {{ psql_c | quote }} | awk NR==3"
vars:
psql_c: >-
select count(*) from user where name='adam'
p.s。我也在 dbuser }}
中冒昧地修正了你不匹配的胡须拼写错误,当时我正在做