我使用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)
答案 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