しばらくの間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」のようなものを使用する必要がありますか?
ローカルファイルの名前を[email protected]
に変更します(api.service.j2
ではありません)— ansibleのJinja2テンプレートではなくsystemdテンプレートを使用します。次に、以下のように変更します。
[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
モジュールを使用する方が良いかどうかはわかりませんが、私はまだ初心者であり、不可能なのです。)
以下も参照してください: https://serverfault.com/a/730339/74509