![使用 ansible 模板创建实例服务文件](https://linux22.com/image/714290/%E4%BD%BF%E7%94%A8%20ansible%20%E6%A8%A1%E6%9D%BF%E5%88%9B%E5%BB%BA%E5%AE%9E%E4%BE%8B%E6%9C%8D%E5%8A%A1%E6%96%87%E4%BB%B6.png)
我已经使用 ansible 一段时间来安装和配置多个服务,但这是我第一次尝试设置可以同时运行多个实例的服务。我正在使用服务文件的模板,如下所示:
[Unit]
Description=My Service
[Service]
WorkingDirectory=/var/lib/service/api
ExecStart=/usr/bin/python -O /var/lib/service/api/main.py -f /var/lib/service/api/cfg/service_api.cfg -p {{ port }}
Type=simple
然后,我安装和配置此服务的角色包含如下任务:
- name: Configure api.service
template: src=api.service.j2 dest=/etc/systemd/system/api@{{port}}.service
- name: Start service
systemd: name=api@{{port}} state=restarted enabled=yes
目前,这对于 port = 80 之类的情况有效,但我认为我做得不够通用。我不完全了解如何创建这些实例服务。我如何修改服务文件和角色,以便每个侦听端口都可以拥有自己的服务文件?我应该使用“Wants”关键字,还是使用“WantedBy=multi-user.target”之类的关键字?
答案1
将本地文件重命名为[email protected]
(不是api.service.j2
) — 我们将使用 systemd 模板,而不是 ansible 的 Jinja2 模板。然后像下面这样更改它:
[Unit]
Description=My Service on port %i
[Service]
...
ExecStart=... -p %i
...
[Install]
WantedBy=multi-user.target
然后,您应该能够使用类似以下的剧本将它与 ansible 一起使用:
- name: Deploy [email protected]
copy: [email protected] dest=/etc/systemd/system/
- name: Start service
systemd: name=api@{{item}} state=restarted enabled=yes
with_items:
- 80
(虽然我不确定在这里使用systemd
或service
模块是否更好;我对 ansible 还是一个新手。)