如何使用Ansible运行主管?

时间:2016-06-03 12:03:19

标签: linux ansible supervisord

我有一台Supervisord正在管理我的流程的服务器。我通常使用以下命令启动supervisord:

sudo /var/www/imd/venv/bin/supervisord -c /var/www/imd/deploy/supervisord.conf

我现在正试图用Ansible进行设置,但我不确定如何启动Ansible。我当然可以使用类似的东西来做:

- name: run supervisord
  command: "/var/www/imd/venv/bin/supervisord -c /var/www/imd/deploy/supervisord.conf"

这样可行,但只是第一次运行它。第二次运行相同的脚本时,supervisord当然已经在运行,这会导致以下错误:

  

TASK [run supervisord]   ************************************************** *****致命:[ansible-test1]:失败! => {“已更改”:true,“cmd”:   [“/ var / www / imd / venv / bin / supervisord”,“ - c”,   “/var/www/imd/deploy/supervisord.conf”],“delta”:“0:00:00.111700”,   “结束”:“2016-06-03 11:57:38.605804”,“失败”:真实,“rc”:2,“开始”:   “2016-06-03 11:57:38.494104”,“stderr”:“错误:另一个程序是   已经在端口上侦听我们的一个HTTP服务器已配置   使用。在开始之前首先关闭此程序   supervisord。\ n如需帮助,请使用/ var / www / imd / venv / bin / supervisord -h“,   “stdout”:“”,“stdout_lines”:[],“警告”:[]}

有人知道我怎么能正确地使用Ansible进行监督吗?欢迎所有提示!

[编辑]

因为mbarthelemy的回答中的解决方案不适用于套接字文件,所以我现在设法让它使用以下内容:

- name: run supervisord
  shell: if [ ! -S /var/run/supervisor.sock ]; then sudo /var/www/imd/venv/bin/supervisord -c /var/www/imd/deploy/supervisord.conf; fi

这当然不是很“可靠”。如果有人有一个真正受欢迎的基于Ansible的解决方案。

2 个答案:

答案 0 :(得分:1)

您的情况是特定的,因为您似乎不会使用常规Supervisor作为普通系统包安装;在这种情况下,您可以使用Ansible的service模块,像任何其他常规系统服务一样启动/停止/重新启动它。

默认情况下,启动时Supervisor会创建一个套接字来监听来自supervisorctl的管理命令。当它停止它它应该删除它。

尝试在特定设置中找到此套接字的创建位置(默认为/var/run/supervisor.sock)。 然后,让Ansible command模块知道如果Suopervisord进程已在运行,则套接字存在,使用creates选项(documentation)。这样,如果command已经在运行,它就不会尝试运行{\ n} {/ p>

- name: run supervisord
  command: "./venv/bin/supervisord -c ./deploy/supervisord.conf"
  args: 
    chdir=/var/www/imd
    creates=/var/run/supervisor.sock

修改:如果/var/run/supervisor.sock是一个文件,这将是正确答案,但它不会工作,因为它是套接字,而且是Ansible' s create参数无法正常工作。

我能想到的最可靠的解决方案是使用外部Ansible模块,例如其中一个,检查您的处理是否已经存在(test_process)或已经在监听(test_tcp)< / p>

答案 1 :(得分:0)

您可以使用主管模块

- supervisorctl:
    name: my_app
    state: restarted
    config: /var/opt/my_project/supervisord.conf

 - name: Restart my_app
   supervisorctl:
     name: my_app
     state: restarted
     config: /var/opt/my_project/supervisord.conf

关于https://docs.ansible.com/ansible/2.7/modules/supervisorctl_module.html#examples的完整文档