django celery 执行 ansible playbook yaml 问题

2020-04-26 16:25:22 +08:00
 fanne

1 、封装 ansible playbook api 后,直接脚本调用,可以执行 yaml 任务。

https://i.imgur.com/cgCNruu.png

2 、在 django celery 进行异步任务时候,无法执行 yaml 任务

task 内容

https://i.imgur.com/MBi3goA.png

views.py 进行 task 调用

https://i.imgur.com/1lj6OUW.png

执行结果,为空

https://i.imgur.com/7k27yRN.png

现在无法定位到哪里问题,望各位大老指点。

5017 次点击
所在节点    Django
21 条回复
defunct9
2020-04-26 16:40:37 +08:00
开 ssh,让我上去看看
话说回来,貌似我都用 awx
fanne
2020-04-26 16:51:17 +08:00
@defunct9 #1 awx 是 aws 云主机的吧,我这个就公司内网的机器
defunct9
2020-04-26 20:36:23 +08:00
defunct9
2020-04-26 20:36:42 +08:00
@fanne AWX 是一个开源的 web 应用,并为 ansible 的任务引擎提供用户接口和 REST API 。它是 ansible Tower 的开源版本。
honmaple
2020-04-26 21:25:02 +08:00
@fanne ansible 使用的是多进程模式,celery 里执行 ansible 需要设置 PYTHONOPTIMIZE=1,以前有遇到过,不知道是不是一样的问题
zhoudaiyu
2020-04-26 21:32:30 +08:00

我当时也是 celery+ ansible,后台任务执行有些问题,加上这个就好了,仅供参考
fanne
2020-04-26 22:47:09 +08:00
@honmaple #5 是的,后面采用了这个环境变量后就 OK 了
fanne
2020-04-26 22:47:52 +08:00
@zhoudaiyu #6 好的,我研究下看看
fanne
2020-04-26 22:52:42 +08:00
@defunct9 #4 好吧,涨知识了
helloZwq
2020-04-27 08:47:20 +08:00
@zhoudaiyu
# 非常神奇的一句话
current_process()._config = {'semprefix': '/mp'}
我也是这么解决的 有大佬能分析下原因么
zhoudaiyu
2020-04-27 09:46:36 +08:00
@helloZwq 好像是 celery 用的 multiprocess 和 ansible 里的一些东西有啥冲突
fanne
2020-04-27 09:47:57 +08:00
@helloZwq #10
@zhoudaiyu #6 current_process()._config = {'semprefix': '/mp'}
固定语句么,哪里引入的这个函数的 current_process ()
zhoudaiyu
2020-04-27 09:50:18 +08:00
@fanne from multiprocessing import current_process
wampyl
2020-04-27 10:34:00 +08:00
问大家一个问题,如果想让 ansible 按照顺序执行任务(根据上一个任务的返回值来判断是否执行下一个任务)的话,是不是可以用 celery chain 啊
fanne
2020-04-27 10:49:58 +08:00
@honmaple #5
@zhoudaiyu #6

另外请教大佬们一个问题,ansible 2.8 的 playbook api 关于 extra_vars

我按照 2.7 的方式传递,

```bash
def playbookrun(self,playbook_path,extra_vars=None):
context.CLIARGS = ImmutableDict(self.options)
if extra_vars:self.variable_manager.extra_vars = extra_vars ##<<===在这里传入
pbex = PlaybookExecutor(playbooks=playbook_path,
inventory=self.inventory,
variable_manager=self.variable_manager,
loader=self.loader,
passwords=self.passwords)
pbex._tqm._stdout_callback = self.pb_results_callback
pbex.run()
```


提示错误,找了一圈,没看到怎么传的

```
if extra_vars:self.variable_manager.extra_vars = extra_vars
AttributeError: can't set attribute
```
zhoudaiyu
2020-04-27 10:58:40 +08:00
@fanne 我用的 2.6 版本的 ansible

from ansible.inventory.manager import InventoryManager

variable_manager = VariableManager(loader=loader, inventory=inventory)
variable_manager.extra_vars = self._evars #这里传入其他参数
fanne
2020-04-27 11:16:45 +08:00
@zhoudaiyu #16
ansible 2.8 的
self.variable_manager._extra_vars = extra_vars
这样 OK 了

ansible 2.4 2.6 2.7 2.8,每一个版本都在改 api,也是醉了
fanne
2020-04-27 11:42:06 +08:00
再咨询各位大佬一个问题,celery 进行异步执行时候,当改了 task 任务内容后,怎么使得 celery 自动生效的
当前都是需要重启一下 celery 才生效的。

@zhoudaiyu #6
@honmaple #5
@defunct9 #4
zhoudaiyu
2020-04-27 12:02:09 +08:00
@fanne 改代码?
fanne
2020-04-27 14:25:06 +08:00
@zhoudaiyu #19
修改 @task 里面的内容。修改后要重启下 celery 方可生效。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX