- name: Execute commands in docker postgres container
command: docker exec -i postgres bash -c 'psql -U postgres -c "create user gitlab with password '000000b';"'
此模块向我发送大约000000b(语法)错误,但是当我使用命令时:
psql -U postgres -c "create user gitlab with password '000000b';"
在终端上运行正常。
为什么Ansible会以其他方式解释我的命令?
答案 0 :(得分:1)
它失败是因为您的命令对于ansibles命令模块太复杂(通过3个不同的命令行解释器以及所有;传递转义的序列)。您可能可以通过许多巧妙地转义的序列来解决它,但是我不建议您尝试这样做,主要是因为它打破了幂等性,其次是因为它确实难以理解和维护,其次是因为这样做的年龄要快2.34倍。
如果您想要使用ansible快速而肮脏地创建gitlab用户,则可以执行以下操作(仍然会破坏幂等性,这意味着您必须多次运行时才能捕获错误):
确保将容器postgres端口公开给localhost:
docker run -d --name postgres -p 5432:5432 postgres
将您的剧本任务更改为以下内容:
- command: psql -h localhost -U postgres -c "create user gitlab with password '000000b';"
ignore_errors: yes
但是,我认为这样做的正确方法是利用ansibles postgres_user模块:
对于此示例,我使用上述命令在docker-container中运行了一个postgresql。
playbook.yml :
---
- hosts: localhost
tasks:
- name: create gitlab user
postgresql_user:
login_host: localhost
login_user: postgres
name: gitlab
password: '000000b'
这要求将psycopg2
安装在系统上,可以从发行版存储库或pypi中获得。另外,您可能希望提供哈希密码,而不是使用明文形式。链接的模块文档也解决了这个问题。