我创建了一个启动/停止我的应用程序的脚本。现在我想将它添加为centos系统服务。首先,我创建了一个任务来创建从我的脚本到/etc/init.d/service_name的链接,如下所示。
---
- name: create startup link
file: src={{ cooltoo_service_script }} dest={{ cooltoo_service_init }} state=link
创建服务后,我想将其添加到系统服务中。用于执行此操作的命令是" chkconfig --add service_name"。我想知道是否有一个ansible模块来做,而不是在ansible-playbook文件中硬编码命令。我查看了此页面http://docs.ansible.com/ansible/service_module.html,但它只显示了如何管理服务而不是创建新服务。
答案 0 :(得分:34)
以下代码段将在CentOS 7中创建服务。
/tasks/main.yml
- name: TeamCity | Create environment file
template: src=teamcity.env.j2 dest=/etc/sysconfig/teamcity
- name: TeamCity | Create Unit file
template: src=teamcity.service.j2 dest=/lib/systemd/system/teamcity.service mode=644
notify:
- reload systemctl
- name: TeamCity | Start teamcity
service: name=teamcity.service state=started enabled=yes
/templates/teamcity.service.j2
[Unit]
Description=JetBrains TeamCity
Requires=network.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/teamcity
ExecStart={{teamcity.installation_path}}/bin/teamcity-server.sh start
ExecStop={{teamcity.installation_path}}/bin/teamcity-server.sh stop
User=teamcity
PIDFile={{teamcity.installation_path}}/teamcity.pid
Environment="TEAMCITY_PID_FILE_PATH={{teamcity.installation_path}}/teamcity.pid"
[Install]
WantedBy=multi-user.target
\模板\ teamcity.env.j2
TEAMCITY_DATA_PATH="{{ teamcity.data_path }}"
\处理程序\ main.yml
- name: reload systemctl
command: systemctl daemon-reload
答案 1 :(得分:15)
'服务'模块支持启用'参数。
这是剧本的一个示例部分,我将自由承认这看起来像是一个新手尝试。假设RHEL / CentOS 6.x使用SysV,而不是systemd。
- name: install rhel sysv supervisord init script
copy: src=etc/rc.d/init.d/supervisord dest=/etc/rc.d/init.d/supervisord owner=root group=root mode=0755
- name: install rhel sysv supervisord sysconfig
copy: src=etc/sysconfig/supervisord dest=/etc/sysconfig/supervisord owner=root group=root mode=0640
- name: enable sysv supervisord service
service: name=supervisord enabled=yes
- name: start supervisord
service: name=supervisord state=started
重要许多自定义初始化脚本将使用Ansible和SysV init失败;原因在于'状态' option(service supervisord status)需要返回符合LSB的返回码。否则,Ansible将不知道服务是启动还是关闭,并且幂等性将失败(重启仍然有效,因为这是无条件的)
这是脚本的一部分,我只是为了利用“状态”而重写的脚本。 /etc/init.d/functions中的函数(你会注意到/etc/init.d /
中其他Red Hat提供的init-scripts中的相同模式status)
/usr/bin/supervisorctl $OPTIONS status
status -p $PIDFILE supervisord
# The 'status' option should return one of the LSB-defined return-codes,
# in particular, return-code 3 should mean that the service is not
# currently running. This is particularly important for Ansible's 'service'
# module, as without this behaviour it won't know if a service is up or down.
RETVAL=$?
;;
参考:http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
如果请求了状态操作,init脚本将返回 以下退出状态代码。
0程序正在运行或服务正常1程序已死并且/ var / run pid文件存在2程序已死并且/ var / lock锁定文件存在 3程序未运行4程序或服务状态未知 5-99保留供将来LSB使用100-149保留供分发使用 150-199保留申请使用200-254保留
答案 2 :(得分:2)
对于RedHat / CentOS 7(使用systemd / systemctl
),相当于chkconfig --add ${SERVICE_NAME}
为systemctl daemon-reload
[via fedoraproject.org]。
然后,使用Ansible 2.2或更高版本的systemd
模块,您可以使用之前的systemctl daemon-reload
启动服务,如此[via docs.ansible.com]:
# Example action to restart service cron on centos, in all cases, also issue daemon-reload to pick up config changes
- systemd:
state: restarted
daemon_reload: yes
name: crond
根据我的经验,daemon_reload
参数也可以在通用service
模块中使用,虽然它没有记录,并且可能在非系统系统上失败:< / p>
- service:
state: restarted
daemon_reload: yes
name: crond
答案 3 :(得分:1)
事实上,service
模块只管理您已经注意到的已注册服务。据我所知,没有注册服务的模块。
您是否知道可以使用some modifications跳过此步骤到init.d脚本?如果脚本遵循这些规则,您只需使用service
模块启用/启动服务。