Ansible:与docker相关的命令在playbook中不起作用,但是一旦直接运行就起作用

用户名

我的剧本中有以下任务:

- name: install pg_stat_statements extension in the postgres container
  shell: docker exec octopus_postgres_{{ group_id }} /bin/bash -c 'psql -h localhost -U postgres -p 5433 -c "CREATE EXTENSION pg_stat_statements;"' #  && service postgres restart')"
  async: 10
  poll: 0

一旦我运行了剧本,该任务似乎就成功完成了,但是如果我检查了postgres数据库-则没有任何更改。该任务实际上没有起作用。

如果我通过bash在主机上手动运行上述命令,则一切正常,并且数据库已更新,如下所示:

docker exec octopus_postgres_iaa /bin/bash -c 'psql -h localhost -U postgres -p 5433 -c "CREATE EXTENSION pg_stat_statements;"'

在尝试检查任务出了什么问题时,我尝试了以下操作:

- name: install pg_stat_statements extension in the postgres container
  shell: docker exec octopus_postgres_{{ group_id }} /bin/bash -c 'touch /1 && psql -h localhost -U postgres -p 5433 -c "CREATE EXTENSION pg_stat_statements;" && touch /2' #  && service postgres restart')"
  async: 10
  poll: 0

我注意到该文件/1确实已在容器内部创建,但是该文件/2尚未...

命令有什么问题?

大卫·迷兹

docker exec这里根本不使用通常,对于这样的任务,您要避免使用它:如果删除并重新创建了容器,则您所做的任何本地设置都docker exec将丢失。当您尝试使用其API对某种服务器进行更改时,通常只需调用其API,而不是在服务器主机上获取root shell然后执行操作即可,但这是后一步docker exec

标准的postgres图像支持把SQL片段在容器端/docker-entrypoint-initdb.d目录,这将得到处理的第一次容器启动(只)。一个非常典型的用途是将带有初始化脚本的主机系统目录挂载到该目录上。在Ansible中,它可能类似于:

- name: create pg_stat_statements extension file
  copy:
    dest: /docker/postgres/initdb/create-stat-statements.sql
    content: |-
      CREATE EXTENSION pg_stat_statements;

- name: start postgres container
  docker_container:
    image: 'postgres:11'
    name: octopus_postgres_{{ group_id }}
    published_ports: ['5433:5432']
    volumes:
      - '/docker/postgres/initdb:/docker-entrypoint-initdb.d'
      - '/docker/postgres/data:/var/lib/postgresql/data'

另外,您可以使用Ansible的内置工具像其他任何PostgreSQL数据库一样管理该数据库(本地,云托管,远程等等)。在这种情况下,postgresql_ext用于创建扩展模块。

- name: enable pg_stat_statements PostgreSQL extension
  postgresql_ext:
    name: pg_stat_statements
    port: 5433

就您的原始陈述而言,可能有两件事正在发生。首先,如果您确实使用该docker exec路径与容器进行交互,则始终需要使用服务器认为正在运行的端口,而不要使用该docker run -p选项或等效项中的任何重新映射的端口:在您的语句中,您需要使用默认端口5432而不是5433。其次,由于您使用来运行任务async: 10, poll: 0,因此Ansible将启动任务并立即继续执行下一个任务,而无需检查它是否成功(请参见“异步操作和轮询”),因此您实际上并不知道docker exec任务是否成功。我的猜测是什么也没发生,因为它无法连接到数据库,但是您永远不会看到此错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一旦触发,javascript中的函数不起作用?

getBBox()和getComputedTextLength()一旦起作用,一次就不起作用

总是Verilog RTL文件中的模块不起作用,但是一旦包含在测试台中就可以工作

Docker 运行命令在 bash 脚本中不起作用

Cloud Dataflow:一旦触发器不起作用

laravel,mysql 事务一旦回滚就不起作用

函数不返回任何错误,但一旦我编辑了代码就不起作用

“ sudo -s <命令>”在外壳程序中运行命令,但是通配符或元字符不起作用

Git 命令在 jenkins 管道中不起作用 - 但是当我在本地运行它时它起作用

Ansible 临时命令后台不起作用

Jar不起作用,但是程序在IDE中起作用

Docker:简单的ls命令在docker build中不起作用

在inotifywait中运行的chmod命令不起作用

在 php 中运行 gcloud 命令不起作用

运行命令不起作用C#

Laravel Schedule:运行命令不起作用

Dockerfile运行python命令不起作用

从终端运行MySql命令不起作用

grails 3 运行命令不起作用

Java 命令在 docker 容器中不起作用

docker命令在PowerShell(Windows 10 Home)中不起作用?

ps命令在docker容器中不起作用

apt-get命令在Docker容器中不起作用

Docker Compose Bash命令在YAML中不起作用,但在容器中起作用

Docker 命令选项 --format 不起作用

Ansible 设置模块的过滤器在与 playbook 一起使用时不起作用

拆分变量在Ansible中不起作用

一些命令在Vim中不起作用

一些命令在bash脚本中不起作用