web-dev-qa-db-ja.com

ansibleテンプレートを使用してインスタンスサービスファイルを作成する

しばらくの間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」のようなものを使用する必要がありますか?

3
user3270760

ローカルファイルの名前を[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

8
akavel