devoinc.systemd_service
Ansible systemd サービスロール
systemd サービスユニット
ファイルを作成し、設定するための Ansible ロールです。このロールを使用すると、特定のサービスをバックグラウンドで自動的に実行したり、特定のイベントのために有効化または無効化したり、プロセスのグループを管理したり、他のユニットへの依存関係を設定したりすることができます。
このロールには以下のタスクが含まれています:
- 指定された名前
service_name
.service の systemd サービスファイルを/etc/systemd/system/
に作成します。 - 重要なユニット、サービスおよびインストールセクションのオプションを設定します。
- 新しいサービスファイルが存在することを systemd に通知します。サービスを再起動します。
- 必要に応じて、起動時にサービスを自動的に実行するように設定します。
このロールはすべてのバージョンの Ubuntu で実行できます。
要件
このロールは root アクセスを必要とします。そのため、プレイブックでグローバルな become: yes
パラメータを使用して実行するか、以下のようにプレイブック内でロールを呼び出します:
- hosts: apps
roles:
- role: systemd-service
become: yes
ロール変数
必要なサービスは systemd_service
辞書変数で指定できます(defaults/main.yml
を参照):
systemd_service: {}
各サービスについて service_name
と必要なパラメータ値を設定する必要があります。たとえば、サービスを起動時に開始するかどうかを指定するには enabled
パラメータを使用します。
systemd_service:
service_name:
enabled:
特定の service_name
キーに指定するべき他のパラメータは以下です。
ユニットセクションのオプション
このパラメータグループにはユニットに関する一般的な情報が含まれます。
description: # ユニットを説明する自由形式の文字列
次の2つのパラメータは他のユニットへの依存関係を設定します。サービスがアクティブになった場合、ここにリストされたユニットもアクティブになります。もし requires
にリストされたユニットが実行できなかったり、突然失敗した場合、サービスも停止します。wants
リストのユニットが無効になった場合でもサービスは停止しません。これらのパラメータは空白で区切られた複数のユニット名を含むことができます。
requires: # サービスと一緒に開始する必要があるユニット
wants: # サービスと一緒に開始するべきユニット
サービスの開始または停止の順序を設定するには、次のパラメータを使用します。ユニット間に順序依存関係がない場合、同時にシャットダウンまたは起動されます。両方のパラメータは空白で区切られたユニットのリストで設定します。
after: # サービスの後に開始する必要があるユニット
before: # サービスの前に開始する必要があるユニット
サービスセクションのオプション
このセクションにはサービスとそれが監視するプロセスに関する情報が含まれます。パラメータ type
はこのサービスユニットのプロセス起動タイプを設定します。
type:
取ることができる値:
simple
- このタイプはサービスが即座に起動されることを想定しています。プロセスは分岐してはいけません。サービス起動に依存する他のサービスがある場合は、このタイプを使用しないでください。サービスが他のプロセスに機能を提供する場合、その通信チャネルはデーモンが起動される前にインストールされる必要があります。forking
- サービスが一度起動し、親プロセスが完了することでプロセスが分岐することを想定しています。このタイプはクラシックなデーモンを起動するために使用されます。このモードを使用する場合、systemd がデーモンのメインプロセスを識別できるようにするために、pid_file
パラメータも使用することをお勧めします。
他の値の動作は simple
と似ていますが、いくつかの違いがあります:
oneshot
- サービスが終了することが期待されており、systemd は次のユニットを開始します;dbus
- デーモンがD-Bus
バスで名前を取得します;notify
- デーモンが起動を終えたときにsd_notify(3)
や類似の呼び出しを通じて通知メッセージを送信します;idle
- 実際のサービスバイナリの実行は、すべてのアクティブなジョブが処理されるまで遅延します。このタイプはコンソール出力を改善するためにのみ便利であり、一般的なユニットの順序管理ツールとしては有用ではありません。
forking
起動タイプを使用するために PID ファイルのパスを設定します。
pid_file: # このデーモンの PID ファイルを指す絶対ファイル名
サービスを実行するユーザーとグループを指定できます。パラメータは単一のユーザーまたはグループ名、または数値 ID を値として取ります。システムサービスおよび root ユーザーのユーザーサービスのデフォルトは root
ですが、他のユーザーに切り替えることもできます。他のユーザーのユーザーサービスのためにユーザーアイデンティティを切り替えることは許可されていません。したがって、唯一許可される値は、ユーザーサービスマネージャが実行されているユーザーと同じユーザーです。グループを設定しない場合は、デフォルトのユーザーグループが使用されます。
user:
group:
次のパラメータでユニットのスケジューリング優先度を設定します。この値は -20(最高優先度)から 19(最低優先度)の整数を取ります。
nice: # 服务のデフォルトのナイスレベル
プロセスに対するメモリ不足キラーの調整レベルは次のオプションで指定されます。この値は -1000(OOM キリングを無効にする)から 1000(OOM キリングが好ましい)までの整数値を取ります。
oom_score_adjust:
次のパラメータでは、サービスの状態に応じて実行されるコマンドを指定できます。これらのパラメータは複数回使用可能であったり、複数のコマンドを含む値を取ったりできます。複数のコマンドラインはセミコロンで区切って単一の指令に連結できます。実行するコマンドは絶対パス名である必要があります。スペースを含むことができますが、制御文字は許可されません。各コマンドの最初の引数は実行可能ファイルへの絶対パスである必要があります。空の文字列を指定すると、以前に指定したコマンドのリストがリセットされます。
# このサービスが開始されたときに実行されるコマンド
# `type` が `oneshot` でない限り、正確に1つのコマンドをここに指定する必要があります
exec_start:
# `exec_start` コマンドの前に実行されるコマンド
exec_start_pre:
# `exec_start` コマンドの後に実行されるコマンド
exec_start_post:
# `exec_start` を通じて開始されたサービスを停止するためのコマンド
exec_stop:
# サービスが停止した後に実行されるコマンド
exec_stop_post:
# サービスの構成を再読み込みするために実行されるコマンド
exec_reload:
サービスプロセス(メインサービスプロセスまたは exec_start_pre
、exec_start_post
、exec_stop
、exec_stop_post
または exec_reload
パラメータによって指定されたプロセス)が終了したり、キルされたり、タイムアウトが発生した場合、サービスを再起動するかどうかを設定します。restart
パラメータは次のいずれかの値を取ります:
no
(デフォルト) - サービスは再起動されません;on-success
- サービスプロセスが正常に終了したとき(終了コード0またはSIGHUP、SIGINT、SIGTERM、SIGPIPE シグナルのいずれか)がたときのみ再起動されます;on-failure
- プロセスが非ゼロの終了コードで終了した場合、シグナルによって終了した場合、操作がタイムアウトした場合、および構成されたウオッチドッグタイムアウトが発生した場合に再起動されます;on-abnormal
- プロセスがシグナルによって終了した場合、操作がタイムアウトした場合、またはウオッチドッグタイムアウトが発生した場合に再起動されます;on-watchdog
- サービスプロセスがクリーンな終了状態として指定されていない捕捉されないシグナルによって終了した場合にのみ再起動されます;on-abort
- サービスのウオッチドッグタイムアウトが期限切れになった場合にのみ再起動されます;always
- どんな場合でもサービスは再起動されます。
# サービスが再起動されるべきとき
restart:
上記のコマンドに対して時間の遅延を指定できる次のパラメータもあります。これらは秒単位または 5min 20s
のような時間間隔の値を取ります。restart_sec
パラメータはサービスを再起動する前にスリープする時間を設定します(restart
で構成された通り)。timeout_sec
オプションは開始/停止コマンドの処理を待つ時間を定義します。
restart_sec:
timeout_sec:
environment
パラメータを使用して、実行されたプロセスの環境変数のリストを設定します。これは、空白で区切られた変数とその値のリストです。このパラメータは複数回使用できます。空の文字列をこのオプションに割り当てると、環境変数のリストはリセットされます。スペースを含む値がある場合は、割り当てに二重引用符を使用します。
また、環境変数をテキストファイルから読み取ることもできます。そのためには、environment_file
パラメータ値としてファイルパスを設定します。
environment: # 変数代入の空白で区切られたリスト
environment_file: # 環境変数を含むファイルのパス
作業ディレクトリは次のパラメータで指定されます。これは、起動コマンドが起動される前のカレントディレクトリとして設定されます。
working_directory:
次のパラメータは、実行されたプロセスのファイルディスクリプタ(STDIN、STDOUT、STDERR)がどこに接続されるべきかを選択できます。standard_input
パラメータは "null"、"tty"、"tty-force"、"tty-fail"、"socket" または "fd" のいずれかの値を取ります。standard_output
パラメータは "inherit"、"null"、"tty"、"journal"、"syslog"、"kmsg"、"journal+console"、"syslog+console"、"kmsg+console"、"socket" または "fd" と等しくすることができます。standard_error
の利用可能な値は standard_output
と同じです。
standard_input:
standard_output:
standard_error:
インストールセクションのオプション
このセクションの変数はユニットのインストール情報を担います。次の2つのパラメータは複数回使用できますまたは、空白で区切られたユニット名のリストを指定することも可能です。リストには、このサービスを requires
および wants
フィールドから参照するユニットが含まれます。
wanted_by:
required_by:
依存関係
なし
例プレイブック
- hosts: app
roles:
- role: systemd-service
systemd_service:
# サービス名
railsapp:
# サービスを起動時に開始
enabled: Yes
# サービスが開始されたときに指定された引数でコマンドを実行
exec_start: "/bin/bash -lc 'puma -C config/puma.rb'"
# 指定されたディレクトリをカレントに使用
working_directory: "/var/www/myapp"
# このユーザーとグループでプロセスを実行
user: "deploy"
group: "deploy"
# クリーンな終了コードまたはシグナルが得られなかった場合のみサービスを再起動
restart: "on-failure"
# 可能であれば 'redis' をアクティブにしようとする
wants: "redis.service"
# 'postgresql' をアクティブにするか、失敗した場合は停止
requires: "postgresql.service"
# multi-user.target ユニットはサービスの実行を好む
wanted_by: "multi-user.target"
ライセンス
MITライセンスの下でライセンスされています。