Ansible不会按原样解释命令

时间:2018-10-19 07:45:46

标签: ansible

- 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会以其他方式解释我的命令?

1 个答案:

答案 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中获得。另外,您可能希望提供哈希密码,而不是使用明文形式。链接的模块文档也解决了这个问题。

相关问题