Ansible服务重启不起作用

时间:2017-11-21 18:38:53

标签: docker nginx service vagrant ansible

我使用Ansible来为Docker容器配置Vagrant。

My Ansible文件包含以下部分以启动nginx:

- name: nginx started
  service:
    name: nginx
    state: restarted

根据我的理解,本节应该在所有情况下重新启动nginx,但是当我通过SSH连接到容器时,nginx没有运行(整个Ansible供应过程成功,nginx没有日志) /var/log/nginx/error.log)。当我手动输入以下命令时,它会正确启动:sudo service nginx start

但是,当我将以上部分替换为:

时,它会起作用
- name: nginx restarted
  command: service nginx restart

似乎问题不仅限于nginx,也适用于syslog-ng等其他服务。

任何想法为什么使用Ansible service不起作用? (docker 17.10.0,Vagrant 2.0.1,Ansible 2.4.0)

2 个答案:

答案 0 :(得分:2)

Ansible service模块try to guess the underlying init system 对于phusion/baseimage泊坞窗图片it finds /sbin/initctl的情况,模块只需在does nothing容器内启动/sbin/initctl stop nginx; /sbin/initctl start nginx,因为此图像中的init系统已更改my_init 3}})。

所以问题是ansible没有正确检测到的图像的init系统状态不一致。

解决方案是:

  • 写一个my_init ansible模块(服务模块首先尝试使用{{ ansible_service_mgr }}模块[code])
  • 从图像中删除initctl,因此ansible将不会检测到任何init系统并将使用service命令(可能在phusion/baseimage-docker中引发问题)
  • 使用command模块显式使用service命令,因为你最终做了

答案 1 :(得分:0)

请查看this ansible issue我认为这可能是相关的。

据他们说:

  

...这不是特定于服务的。重新启动/重新加载的选项是   目前调用底层init系统的简单选项   脚本,(如果成功)返回成功......

所以,也许这就是为什么即使在Ansible documentation你也可以找到你想要实现的目标的例子:

# Example action to restart service httpd, in all cases
- service:
    name: httpd
    state: restarted

nginx 不起作用,因为它可能不受支持。

来自您的解决方案的公寓:

- name: nginx restarted
  command: service nginx restart

您可以通过以下方式实现:

- name: restart nginx
  service: name=nginx state=restarted
相关问题