问题标签 [ansible-runner]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4110 浏览

python - 如何以编程方式和同时驱动 Ansible?

我想使用 Ansible 在多个远程节点上同时执行一个简单的作业。实际的工作涉及 grepping 一些日志文件,然后在我的本地主机上对结果进行后处理(远程节点上没有可用的软件)。

命令行 ansible 工具似乎不太适合这个用例,因为它们将 ansible 生成的格式与远程执行命令的输出混合在一起。Python API 似乎应该能够做到这一点,因为它公开了未修改的输出(除了一些在此处不相关的潜在 unicode 修改)。

我想出的 Python 程序的简化版本如下所示:

在这里,sleep 10代表实际的日志 grepping 命令——这个想法只是模拟一个不会立即完成的命令。

但是,在运行此程序时,我观察到所花费的时间似乎与我的清单中的主机数量成正比。以下是分别针对 2、5 和 9 台主机的清单的计时结果:

其他一些随机观察:

  • ansible all --forks=10 -i five-hosts.inventory -m command -a "sleep 10"表现出相同的行为
  • ansible all -c local --forks=10 -i five-hosts.inventory -m command -a "sleep 10"似乎是同时执行的事情(但只适用于本地连接,当然)
  • ansible all -c paramiko --forks=10 -i five-hosts.inventory -m command -a "sleep 10"似乎同时执行的事情

也许这表明问题出在 ssh 传输上,与通过 Python API 而非命令行使用 ansible 无关。

无论我的清单中的主机数量如何,这有什么问题会阻止默认传输仅花费大约 10 秒?

0 投票
6 回答
80628 浏览

python - 使用 Python API 运行 ansible-playbook

如何在 python 脚本中运行剧本?在 python 中使用 ansible 模块相当于以下内容:

我在http://docs.ansible.com/developing_api.html查看他们的文档,但他们的例子非常有限。

0 投票
1 回答
1463 浏览

python - 如何在仍然使用本地文件作为我的游戏的同时以编程方式运行 ansible 游戏?

设置/约束

我想运行一个位于 /tmp/run_tests.yml 的 ansible 游戏,并且我想在 python 脚本中执行运行,而不是命令行(这些是对我正在处理的问题的一般限制)。我已经尝试了几种不同的方法,这些方法都感觉像是对 Runner 类进行逆向工程的猜测工作,但都没有成功。我希望找出这是否可能以及代码的外观。

如果我想运行一个命令,我可以简单地使用 Ansible API 的运行器:

works.py(一个简单的使用 Runner 和一个模块的例子)

doesnotwork.py (尝试使用 runner 来玩)

产生的错误

从源头来看,该错误表明缺少 shebang,并且由于我是 ansible 的新手,因此我推测传递 yml 文件不是 module_name 的合适文件。为了运行我的 python 游戏,runner 命令必须是什么样子?

0 投票
2 回答
1666 浏览

python - 无法制作 dir /$HOME/.ansible/cp: [Errno 13] Permission denied: '/$HOME

我有一个 python 脚本,它使用ansible包来 ping 一些远程服务器。手动执行时(python devmanager.py)它工作正常,但是当脚本由主管管理时,它会引发以下错误:

ansible 命令非常简单:

源系统和目标系统中的相同用户。我检查了 $HOME 文件夹的权限,没有发现任何奇怪的东西。

知道发生了什么吗?它不知道翻译 $HOME 变量吗?

0 投票
1 回答
199 浏览

python - ansible runner 跑到很长

当我使用 ansible 的 python API 在远程机器(数千)上运行脚本时,代码是:

然后,我用

这需要太长时间。我想将数据结构标准输出插入 MySQL。我想要的是,如果一旦机器返回数据,只需将数据插入 MySQL,然后下一个,直到所有机器都返回。

这是一个好主意,还是有更好的方法?

0 投票
1 回答
306 浏览

python - 如何使用 Ansible 1.x API 列出主机

Ansible-playbook 有一个--list-hostscli 开关,它只输出受 playbook 中每个 play 影响的主机。我正在寻找一种通过 python API 访问相同信息的方法。

我现在用来测试的(非常)基本脚本是

我只是不知道要添加什么以ansible.runner.Runner()使其输出受影响的主机并退出。

0 投票
1 回答
483 浏览

python - 在 ansible_runner python 库中,是否可以使用 runner 从剧本中检索注册变量?

我开始使用 ansible_runner python 库,我真的很喜欢它。

唯一的事情是我需要检索一个注册的变量。我就是找不到方法。

现在,在我创建了基础设施之后,我想检索在我的 create.yml 中注册的 IP

有可能吗?我查看了runner.events,但我没有找到它。

谢谢

0 投票
0 回答
797 浏览

python - 如何以编程方式从 ansible runner 读取事件

我使用ansible runner从 django 应用程序触发 ansible-playbook,它运行良好。请参阅以下代码。

我正在尝试做的是在他的项目上发生部署时向用户提供实时更新(在该剧本中运行的每个 ansible 任务的标准输出)。

截至目前,我可以在控制台中立即看到标准输出。但我无法弄清楚如何从 ansible runner 交互式/即时读取标准输出。

我可以等待任务完成,最后读取最终的标准输出并将其显示给用户,我认为这不是更好的用户体验。我想提供用户正在发生的游戏的实时更新。类似于您在 travis-ci 构建中看到的。到目前为止,我无法从 ansible-runner 的文档中找出任何东西。

我尝试检查r.events如下的输出

所以基本上这r[1]是一个生成器对象,但是当循环运行时,它只从起点打印几行,我认为这是因为任务尚未完成,所以生成器也没有填充。

您有哪些建议或链接可以为我指明正确的方向?随时要求任何澄清。非常感谢您的帮助:)

0 投票
1 回答
805 浏览

ansible - 将嵌套字典作为 extra_vars 传递给 ansible-playbooks

我想将一个巨大的嵌套字典作为 anextra_vars传递给 Ansible playbook。我想在我的剧本中使用该字典中的值。

我想传递这个字典,因为extra_var我想使用它的值。我无法使用jinja模板访问字典中的单独值。

示例:如果我想在 an 中使用标记的值,ansible-playbook我该如何访问它?

我正在使用python3.5并且ansible 2.8.正在使用ansible-runner模块来运行剧本。

0 投票
1 回答
2563 浏览

python - 使用 Ansible 启用 Apache 站点

我正在从 python 脚本运行剧本。我正在关注此代码

以下命令完美运行。

但是当我尝试通过从 python 脚本执行剧本来做同样的事情时。它说该网站不存在。以下是剧本。

它给出了以下错误。

致命:[token_server]:失败!=> {“ansible_facts”:{“discovered_interpreter_python”:“/usr/bin/python”},“已更改”:true,“cmd”:“a2ensite token_server”,“delta”:“0:00:00.054682”,“ end”:“2019-12-11 01:03:10.546478”,“msg”:“非零返回码”,“rc”:1,“start”:“2019-12-11 01:03:10.491796” ,“stderr”:“错误:站点 token_server 不存在!”,“stderr_lines”:[“错误:站点 token_server 不存在!”],“stdout”:“”,“stdout_lines”:[]}

更新 我尝试运行这个剧本。该剧本显示“/etc/apache2/sites-available”目录的内容。

它显示了我本地的 /etc/apache2/sites-available 目录的内容。这意味着该命令实际上是在我的本地而不是远程服务器上执行的。

这是我的“主机清单文件”。