使用Ansible在PostgreSQL服务器执行SQL命令时psql任务挂起如何解决
故障根因
- 你使用的
scl enable rh-postgresql96 bash命令会启动一个常驻的交互式bash子进程,Ansible的shell模块执行任务时会等待进程退出才会进入下一个步骤,因此会永久卡在该任务无响应。 - 即使该任务能正常结束,两个独立的shell任务分属不同的系统会话,第二个任务无法继承第一个任务加载的SCL环境变量,依然会找不到psql命令导致执行失败。
修复方案
无需拆分两个任务,直接把SCL环境加载和psql执行命令合并到同一个shell任务中即可。SCL原生支持在enable参数后直接传入要执行的业务命令,不需要单独启动bash子进程,修改后的Ansible任务如下:
- name: Setup database become_user: postgres become: yes block: - name: Create user1 role shell: scl enable rh-postgresql96 -- psql -c "CREATE ROLE user1 WITH LOGIN PASSWORD 'pass!123' VALID UNTIL 'infinity';"
语法说明:命令中的
--是分隔符,用于明确区分SCL的控制参数和后续要执行的业务命令,避免特殊参数解析冲突。如果需要执行多条SQL语句,也可以把所有psql命令都放到--之后,或者通过管道批量传入SQL文本。
内容的提问来源于stack exchange,提问作者Hazed 2.0
相关产品推荐
相关产品推荐

