Некоторое время я использую 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»?
Переименуйте локальный файл в api@.service
(не api.service.j2
) - мы будем использовать шаблоны systemd вместо шаблонов ansible Jinja2. Затем измените его, как показано ниже:
[Unit]
Description=My Service on port %i
[Service]
...
ExecStart=... -p %i
...
[Install]
WantedBy=multi-user.target
Тогда вы сможете использовать его вместе с доступным сценарием, подобным следующему:
- name: Deploy api@.service
copy: src=api@.service dest=/etc/systemd/system/
- name: Start service
systemd: name=api@{{item}} state=restarted enabled=yes
with_items:
- 80
(Хотя я не уверен, что лучше использовать systemd
или service
модуль здесь; Я все еще новичок в ансибле.)
Смотрите также: https://serverfault.com/a/730339/74509