Postgresql 如何在ansible中使psql进程幂等?

Postgresql 如何在ansible中使psql进程幂等?,postgresql,ansible,psql,Postgresql,Ansible,Psql,我有一个进程在ansible中运行psql进程 此任务一直在运行。如何使这个幂等元?我想唯一的方法是将sql脚本包装成shell脚本并进行检查。 作为一个例子,我知道有postgresql_用户模块,但这是一个例子: #!/bin/bash if [[ $(psql postgres -tAc "SELECT 'found' FROM pg_roles WHERE rolname='{{ user }}'" | grep found) ]]; then echo "User exists"

我有一个进程在ansible中运行psql进程


此任务一直在运行。如何使这个幂等元?

我想唯一的方法是将sql脚本包装成shell脚本并进行检查。 作为一个例子,我知道有postgresql_用户模块,但这是一个例子:

#!/bin/bash
if [[ $(psql postgres -tAc "SELECT 'found' FROM pg_roles WHERE rolname='{{ user }}'" | grep found) ]]; then
  echo "User exists"
else
  psql -c "CREATE USER {{ user }} LOGIN ENCRYPTED PASSWORD '{{ password }}';" > /dev/null
  echo "User created"
fi
在你的剧本中:

- name: Run psql
  shell: createuser.sh
  register: result
  changed_when: "'User created' in result.stdout"

我想唯一的方法是将sql脚本包装成shell脚本并进行检查。 作为一个例子,我知道有postgresql_用户模块,但这是一个例子:

#!/bin/bash
if [[ $(psql postgres -tAc "SELECT 'found' FROM pg_roles WHERE rolname='{{ user }}'" | grep found) ]]; then
  echo "User exists"
else
  psql -c "CREATE USER {{ user }} LOGIN ENCRYPTED PASSWORD '{{ password }}';" > /dev/null
  echo "User created"
fi
在你的剧本中:

- name: Run psql
  shell: createuser.sh
  register: result
  changed_when: "'User created' in result.stdout"

我的建议是编写一个脚本,查询数据库以检查其状态。这个脚本应该不能更改任何内容,应该设置为自己的任务,使用changed_when:false并打印一些智能输出。用Register:result注册该输出

进行所有更改的现有任务应具有条件when:result.stdout contains,以便仅当第一个任务发现数据库未处于正确状态时,它才会运行


更好的解决方案是只使用提供的Postgres模块进行此设置,但不知道.sql脚本中有什么,我不知道这是否可行。

我的建议是编写一个脚本,查询数据库以检查其状态。这个脚本应该不能更改任何内容,应该设置为自己的任务,使用changed_when:false并打印一些智能输出。用Register:result注册该输出

进行所有更改的现有任务应具有条件when:result.stdout contains,以便仅当第一个任务发现数据库未处于正确状态时,它才会运行


更好的解决方案是只使用提供的Postgres模块进行此设置,但不知道.sql脚本中有什么,我不知道这是否可行。

有人怎么知道?这完全取决于脚本内容。您需要创建预运行检查,最有可能的是为三个脚本中的每一个创建一个单独的脚本,并且仅当预检查返回的条件不满足时才运行真正的脚本。有人怎么知道?这完全取决于脚本内容。您需要为这三种检查中的每种检查创建一个单独的脚本,并且仅当预检查返回的条件不满足时才运行真正的脚本。1非幂等2命令行不是可行的方法3但它可以工作…1非幂等2命令行不是可行的方法3但它可以工作。。。