【发布时间】:2021-11-15 13:33:28
【问题描述】:
我的环境:
- ansible/AWX 版本 16 和 ansible 2.9 在 Ubuntu 18 机器上的 Docker 容器中运行。
- ansible 2.9 在多台 Ubuntu 机器上运行
我有一本剧本,我在其中调用了以下插件:
- name: "Run the sql script"
postgresql_query:
db: "{{db_name}}"
login_host: "{{db_host}}"
login_user: "{{db_user}}"
login_password: "{{db_password}}"
path_to_script: "{{playbook_dir}}/some/path/some_script.sql"
当我直接从命令行 (ansible_playbook playbook.yml) 在任何 Ubuntu 机器上调用此 playbook 时,一切正常,插件会找到 sql 脚本并运行它。
当我从 AWX 管理控制台运行相同的剧本时,我收到一些错误消息,告诉我它找不到 sql 脚本。我在我的剧本中添加了以下附加任务,以等待文件被拉取(认为它可能在调用时尚未被拉取):
- name: sleep for 30 seconds and continue with play
wait_for:
timeout: 30
path: "{{playbook_dir}}/some/path/some_script.sql"
state: present
但 30 秒后我收到以下错误:
TASK [export_db : sleep for 30 seconds and continue with play] ****************
fatal: [my_host]: FAILED! => {"changed": false, "elapsed": 30, "msg": "Timeout when waiting for file /tmp/awx_4414_8__3jkl_/project/some/path/some_script.sql"}
在这 30 秒内,我 ssh 进入 docker 容器(名为 awx_task),我可以注意到文件 /tmp/awx_4414_8__3jkl_/project/some/path/some_script.sql 在那里。之后所有文件夹 /tmp/awx_4414_8__3jkl_/ 都会被删除,但在 playbook 运行时它就在那里。
这让我觉得文件实际上是在其他地方搜索的,我不明白如何指定文件的路径。
结语
我终于找到了一个解决方案,通过像这样调用 local_action 在本地而不是在远程主机上运行 postgresql_query 插件:
- name: "Run the sql script"
local_action:
module: postgresql_query
db: "{{db_name}}"
login_host: "{{db_host}}"
login_user: "{{db_user}}"
login_password: "{{db_password}}"
path_to_script: "{{playbook_dir}}/some/path/some_script.sql"
这样,在本地找到了sql脚本,一切顺利。
【问题讨论】:
-
您能否详细说明“我在我的剧本中添加了以下附加任务,以等待文件被拉取(认为它可能在调用时尚未被拉取)" 因为插件没有拉文件,所以它期望文件已经在远程主机上。
-
@U880D 虽然我对 Ansible 有一些经验,但我对 AWX 还是很陌生。据我所知,当我从 AWX 运行作业时,AWX 在
awx_tasks容器中创建一个临时文件夹,命名为/tmp/awx_4414_8__3jkl_,将项目(库存)拉到那里,运行我指定的剧本,然后删除该文件夹.每次调用时文件夹名称都不同。我要运行的 sql 文件包含在拉取的项目中。但是当我在path_to_script中指定它时,它不会在那个临时文件夹中搜索,而是在其他地方搜索。具体在哪里,我不知道。我如何从本地调用它?
标签: docker ansible ansible-awx