ikke_t.podman_container_systemd
ポッドマンコンテナ-systemd
注意: これがまだ機能することを願っていますが、さらなる開発は新しいLinuxシステムロールポッドマンプロジェクトで行われています。ぜひ試してみてください、これは活発に開発されています。 BR Ikke、長年にわたるすべての貢献者に感謝します!
この役割は、systemdの助けを借りてホスト上で実行されるコンテナを設定します。Podmanはコンテナイベントを実装していますが、ライフサイクルを制御したり追跡したりすることはできません。それはクラスター内のKubernetesや、ローカルインストールのsystemdの仕事です。
私はこの役割を、自分のパーソナルサーバーでポッドマンコンテナのライフサイクルを管理するために書きました。このサーバーはクラスターではないため、再起動後も常に有効で実行されるようにsystemdを使いたいと思っています。
この役割がすること:
- Podmanをインストールします
- 必要なイメージをプルします
- 連続実行時にイメージを再度プルし、イメージが変更された場合はコンテナを再起動します(まだポッドには対応していません)
- コンテナやポッドのsystemdファイルを作成します
- ポッドのためにKubernetes YAMLを作成します
- コンテナのためのボリュームディレクトリを存在しない場合に作成します(ポッドにはDirectoryOrCreateを使用)
- コンテナが死んだ場合は自動的に再起動するように設定します
- システムブート時にコンテナまたはポッドを実行状態にします
- コンテナの公開ポートをファイアウォールに追加または削除します
- 指定したユーザーの下でrootlessコンテナを実行するためのパラメータを取ります
参考までに、この役割に関する2つのブログをご覧ください:
ブログでは、このモジュールを使用して、単一のコンテナまたは複数のコンテナを一つのポッドとして実行する方法が説明されています。
Rootlessコンテナを実行する際の注意点:
- この役割を実行する前にユーザーを作成しておく必要があります。
- ユーザーは、名前空間範囲のために/etc/sub[gu]idファイルにエントリが必要です。 そうでない場合、この役割は何かを進めるためにいくつかの変数を追加しますが、できれば確認してください。
- メモリや他のリソースの制限などの制御はユーザーとしては機能しません。
systemd_TimeoutStartSec
を大きく設定することをお勧めします。なぜなら、systemdユニットの開始前にイメージを事前取得できないからです。したがって、systemdはコンテナを開始する前にポッドマンがイメージをプルするのを待つ必要があります。ネットワーク接続やコンテナイメージのサイズによっては、数分かかることがあります。
要件
ポッドマンを実行できるシステムが必要で、パッケージリポジトリからポッドマンが見つかる必要があります。役割はポッドマンをインストールします。また、ユーザーがcontainer_firewall_ports
変数を定義している場合、firewalldもインストールします。container_pod_yaml_template_validation: true
の場合、ポッドのためにkubevalをインストールします。
役割変数
役割は、インクルード時に渡す必要のある変数を使用します。一つのコンテナを単独で実行するオプションや複数のコンテナをポッド内で実行するオプションがあるため、一部のオプションは他の方法には適用されないことに注意してください。
container_image_list
- 実行するコンテナイメージのリスト。 1つ以上のイメージが定義されている場合、コンテナはポッド内で実行されます。 認証情報をイメージごとに含めるために辞書として定義することもできます。
container_image_list:
- image: docker.io/imagename
user: exampleuser
password: examplepw
- image: docker.io/imagename2
container_image_user
- リモートレジストリへの認証時に使用するデフォルトのユーザー名(オプション)container_image_password
- リモートレジストリへの認証時に使用するデフォルトのパスワード(オプション)container_name
- systemdとポッドマンのコマンドでコンテナを識別します。 systemdサービスファイルは container_name--container-pod.service という名前になります。これはservice_nameで上書き可能です。container_run_args
- 単一のコンテナを実行する際にポッドマンに渡す任意の引数。ただしポッドには使用されません。文字列または文字列のリストとして指定できます。container_cmd_args
- イメージ名を指定した後にpodman-runに渡される任意のコマンドと引数。ポッドには使用されません。container_run_as_user
- systemdがコンテナをどのユーザーとして実行するか。デフォルトはrootです。container_run_as_group
- systemdがコンテナをどのグループとして実行するか。デフォルトはrootです。container_dir_owner
- ボリュームディレクトリの所有者。デフォルトはcontainer_run_as_userです。:U
をボリュームオプションとして使用すると、podmanは自動的にコンテナ内部のユーザーのための権限を設定します。 引用::U
サフィックスは、PodmanにホストUIDとGIDを使用させ、ソースボリュームの所有者とグループを再帰的に変更します。この操作はホストファイルシステムを変更するので注意して使用してください。container_dir_group
- ボリュームディレクトリが持つべきグループ。デフォルトはcontainer_run_as_groupです。container_dir_mode
- ボリュームディレクトリが持つべき権限。デフォルトは「0755」です。container_state
- コンテナがインストールされ、状態がrunning
である場合は実行され、absent
の場合は停止し、systemdファイルが削除されます。container_firewall_ports
- コンテナから公開したポートのリストと、それをファイアウォールで開けたいポート。container_stateがabsentの場合、ファイアウォールポートが閉じられます。firewalldをインストールしたくない場合は、これを定義しないでください。systemd_TimeoutStartSec
- systemdがコンテナの起動を待つ時間。systemd_tempdir
- 単一のコンテナのためにconmon-pidfileとcidfileをどこに保存するか。デフォルトはこの指定子をサポートするシステムでは%T
(man 5 systemd.unitを参照)です。それ以外では/tmp
です。service_name
- systemdサービスファイルの名前の付け方。デフォルトは"{{ container_name }}-container-pod-{{ container_run_as_user }}.service"
です。service_files_dir
- systemdサービスファイルを保存する場所。rootの場合はデフォルトで/usr/local/lib/systemd/system
、rootlessユーザーの場合は"{{ user_info.home }}/.config/systemd/user"
です。service_files_owner
- systemdサービスファイルの所有者。デフォルトはrootです。service_files_group
- systemdサービスファイルのグループ。デフォルトはrootです。service_files_mode
- systemdサービスファイルの権限。デフォルトは0644です。container_pod_yaml
- ポッドYAMLファイルへのパス。ポッドに必須です。container_pod_yaml_deploy
- ポッドYAMLファイルをデプロイするかどうか。デフォルトはfalse
です。container_pod_yaml_template
- ポッドYAMLデプロイに使用するテンプレート。テンプレートにはすべての可能な構成オプションが含まれていないため、自分のテンプレートで上書きすることができます。デフォルトはtemplates/container-pod-yaml.j2
です。container_pod_yaml_template_validation
- デプロイされたポッドYAMLファイルを検証するかどうか。デフォルトはfalse
です。container_pod_labels
-container_pod_yaml_deploy
用のラベルを定義します。container_pod_volumes
-container_pod_yaml_deploy
用のボリュームを定義します。container_pod_containers
-container_pod_yaml_deploy
用のコンテナを定義します。
このプレイブックには、podmanコマンドのパラメータを解析するためのPythonモジュールはありません。したがって、その間、podmanをコマンドラインから使用するかのようにすべてのパラメータを渡す必要があります。情報についてはman podman
またはpodmanチュートリアルを参照してください。
自動でイメージを更新したい場合は、container_cmd_argsに以下のラベルを追加します: --label "io.containers.autoupdate=image"
この役割をプレイブック内で1回以上実行する予定がある場合は、ansible.builtin.import_role
を使用しないでください。そうしないと、このアンチパターンに陥ります。
依存関係
- containers.podman(コレクション)
- ansible.posix(コレクション)
例プレイブック
サンプルについてはtests/main.ymlをご覧ください。簡単に言うと、変数を指定して役割を含めます。
Rootコンテナ:
- name: tests container
vars:
container_image_list:
- sebp/lighttpd:latest
container_name: lighttpd
container_run_args: >-
--rm
-v /tmp/podman-container-systemd:/var/www/localhost/htdocs:Z,U
--label "io.containers.autoupdate=image"
-p 8080:80
#container_state: absent
container_state: running
container_firewall_ports:
- 8080/tcp
- 8443/tcp
ansible.builtin.include_role:
name: podman-container-systemd
Rootlessコンテナ:
- name: ensure user
user:
name: rootless_user
comment: I run sample container
- name: tests container
vars:
container_run_as_user: rootless_user
container_run_as_group: rootless_user
container_image_list:
- sebp/lighttpd:latest
container_name: lighttpd
container_run_args: >-
--rm
-v /tmp/podman-container-systemd:/var/www/localhost/htdocs:Z,U
-p 8080:80
#container_state: absent
container_state: running
container_firewall_ports:
- 8080/tcp
- 8443/tcp
ansible.builtin.include_role:
name: podman-container-systemd
Rootlessポッド:
- name: ensure user
user:
name: rootless_user
comment: I run sample container
- name: tests pod
vars:
container_run_as_user: rootless_user
container_run_as_group: rootless_user
container_image_list:
- sebp/lighttpd:latest
container_name: lighttpd-pod
container_pod_yaml: /home/rootless_user/lighttpd-pod.yml
container_pod_yaml_deploy: true
container_pod_yaml_template_validation: true
container_pod_labels:
app: "{{ container_name }}"
io.containers.autoupdate: 'image(1)'
container_pod_volumes:
- name: htdocs
hostPath:
path: /tmp/podman-container-systemd
type: DirectoryOrCreate
container_pod_containers:
- name: lighttpd
image: sebp/lighttpd:latest
volumeMounts:
- name: htdocs
mountPath: /var/www/localhost/htdocs:Z
ports:
- containerPort: 80
hostPort: 8080
container_state: running
container_firewall_ports:
- 8080/tcp
- 8443/tcp
ansible.builtin.include_role:
name: podman-container-systemd
ライセンス
GPLv3
著者情報
Ilkka Tengvall ilkka.tengvall@iki.fi
Role sets up container(s) to run on host with help of systemd.
ansible-galaxy install ikke_t.podman_container_systemd