如何使用带变量的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'

因此,您有两条前进的道路:

  1. 只需删除双引号,因为您的 shell: 中没有任何内容需要 yaml 解析器的保护
  2. 将内部 \dt 移动到 单引号 vars: 并让 ansible 为您引用它
  3. 按照 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 }} 中冒昧地修正了你不匹配的胡须拼写错误,当时我正在做