cogini.users
ユーザー
このAnsibleロールはユーザーアカウントを管理し、SSHキーを使用してアクセスを制御します。
サーバーにアプリケーションを1つまたは複数デプロイするために使用されます。アプリをデプロイおよび実行するためのアカウントや、システム管理者や開発者用のアカウントを作成することができます。
基本的には、Ansibleのユーザーモジュール に基づいたロールです。
ユーザータイプ
このロールは、以下のタイプのユーザーアカウントの作成をサポートします:
- グローバルシステム管理者 / オペレーションチーム
これらのユーザーは、sudo権限を持つ独自のログインを持ちます。wheel
または admin
グループに追加し、パスワードなしでsudoを実行できるようにします。
サーバーをプロビジョニングする際、プロジェクトに依存せずにシステム管理チーム用のアカウントを自動的に作成します。
- プロジェクト管理者 / パワーユーザー
これらのユーザーはグローバル管理者と同じ権利を持ちますが、プロジェクトまたはサーバーごとに設定され、インベントリのホスト/グループ変数で制御されます。通常、プロジェクトのテックリードが管理者になります。
- デプロイアカウント
このユーザーアカウントは、アプリケーションをサーバーにデプロイするために使用されます。アプリケーションソフトウェアファイルの所有者であり、デプロイおよび設定ディレクトリへの書き込み権限があります。
アプリとデプロイアカウントにはsudo権限はありませんが、/etc/sudoers.d/
ルールを作成して、例えば systemctl
を使用してアプリを再起動できるようにすることができます。これは、このロールではなく、アプリをインストールおよび構成するロールによって管理されます。
例えば、以下のようなファイルを作成します: /etc/sudoers.d/deploy-foo
:
deploy ALL=(ALL) NOPASSWD: /bin/systemctl start foo, /bin/systemctl stop foo, /bin/systemctl restart foo, /bin/systemctl status foo
- アプリアカウント
アプリケーションはこのユーザーアカウントの下で実行されます。
このアカウントは、実行時に必要なディレクトリへ書き込みアクセスを持ち、コードや設定ファイルには読み取り専用のアクセスを持ちます。
- 開発者
開発者は、ログを確認したりデバッグしたりするためにデプロイやアプリのユーザーアカウントにアクセスする必要があるかもしれません。開発者用のSSHキーをアカウントに追加し、SSHを介してログインできるようにします。
- プロジェクトユーザー
これらのユーザーは管理者のようですが、sudo権限は持っていません。例えば、顧客がログインしてDBに対してクエリを実行できるアカウントなどです。彼らは管理者権限を必要としません。logファイルなどへのアクセス権限を与えることができます。
設定
デフォルトでは、このロールは何もしません。動作させるためには、設定変数を追加する必要があります。通常、グループ変数を通じて行われます、例えば inventory/group_vars/app_servers
やプレイブックの vars
セクション、もしくはその組み合わせです。
ホストレベルやグループレベルで異なる設定を持つことができ、例えば開発環境では開発者にログインアクセスを与え、本番環境では与えないことができます。
アプリアカウント
アプリをデプロイするアカウントです。 オプションで、指定されていなければデプロイユーザーは作成されません。
users_deploy_user: deploy
users_deploy_group: deploy
アプリを実行するアカウントです。 オプションで、指定されていなければアプリユーザーは作成されません。
users_app_user: foo
users_app_group: foo
ユーザーアカウント
users_users
は、ユーザー用のUnixアカウント名とSSHキーを定義します。
これは、4つのフィールドを持つ辞書のリストです:
user
: Unixアカウントの名前name
: ユーザーの名前。オプション、ドキュメント用。key
: SSH公開鍵ファイル。プレイブックのfiles
ディレクトリに置きます。github
: ユーザーのGitHub ID。ロールはhttps://github.com/{{ github }}.keys
からユーザーのキーを取得します。
例:
users_users:
- user: jake
name: "Jake Morrison"
github: reachfh
- user: ci
name: "CIサーバー"
key: ci.pub
ユーザーリスト
users_users
でユーザーアカウントを定義した後、user
キーで使われるIDを指定してユーザーリストを構成します。デフォルトではこれらは空なので、ユーザーを指定しないと作成されません。
グローバル管理者は別のUnixアカウントとsudo権限を持ちます。
users_global_admin_users:
- jake
プロジェクトレベルの管理者は別のUnixアカウントとsudo権限を持ちます。
users_admin_users:
- fred
プロジェクトユーザーは別のUnixアカウントを持ちますが、sudo権限はありません。
users_regular_users:
- bob
デプロイアカウントにアクセスできるユーザー(SSHキー)。
users_deploy_users:
- ci
アプリアカウントにアクセスできるユーザー(SSHキー)。
users_app_users:
- fred
グループ設定
異なるタイプのユーザーが持つ追加のグループを指定できます。デフォルトではこれらのリストは空ですが、アプリへのアクセスを微調整するのに使用できます。
通常、SSHを設定して、ユーザーアカウントは sshusers
グループのメンバーでなければSSHでログインできないようにします。
/etc/ssh/sshd_config
に以下を追加します:
AllowGroups sshusers sftpusers
その後、users_admin_groups
に sshusers
を追加します。例えば:
users_admin_groups:
- sshusers
管理者ユーザーが持つべきUnixグループ
ロールは常に wheel
または admin
グループに追加されます。管理者ユーザーが定義されている場合、ロールは /etc/sudoers.d/00-admin
ファイルでsudoを設定し、管理者ユーザーがパスワードなしでsudoを実行できるようにします。
users_admin_groups:
- sshusers
通常ユーザーが持つべきUnixグループ:
users_regular_groups:
- sshusers
デプロイユーザーが持つべきUnixグループ:
users_deploy_groups:
- sshusers
アプリユーザーが持つべきUnixグループ:
users_app_groups:
- sshusers
ユーザーの削除
このロールは、作成するユーザーに対して "ansible-" というコメントを定義します。これにより、ユーザーがリストに追加または削除された際に追跡し、アカウントを削除することができます。
users_delete_users
リストにアカウントを指定すると、それらも削除されます。これは、レガシーアカウントをクリーンアップするのに役立ちます。
アカウントを削除するときにユーザーのホームディレクトリを削除するかどうかを users_delete_remove
および users_delete_force
変数で制御できます。詳細についてはAnsibleのドキュメントを参照してください。安全のため、これらの変数はデフォルトで no
ですが、このロールでシステムユーザーを管理している場合、yes
に設定することをお勧めします。
users_delete_remove: yes
users_delete_force: yes
ロールはオプションで 'root' や 'ubuntu' などのシステムユーザーから承認済みのキーを削除できます。これは、名付けられた管理者ユーザーを設定した後、バックアップ用のrootキーを避けるために有益です。
users_remove_system_authorized_keys: true
セットアップ
通常の手順として、新しいインスタンスで最初にこのロールを実行します。これにより、管理者ユーザーが作成され、他のロールを実行するためのキーが設定されます。プロジェクト特有のロールがアプリのためのサーバーの準備を担当し、ディレクトリを作成し、依存関係をインストールします。通常、デプロイユーザーアカウントを使用し、sudoなしでビルドまたはCIサーバーからアプリをデプロイします。
以下は典型的なプレイブックです:
- name: ユーザーを管理する
hosts: '*'
vars:
users_app_user: foo
users_app_group: foo
users_deploy_user: deploy
users_deploy_group: deploy
users_users:
- user: jake
name: "Jake Morrison"
github: reachfh
users_app_users:
- jake
users_deploy_users:
- jake
roles:
- { role: cogini.users, become: true }
ホストを inventory/hosts
ファイルに追加します。
[web-servers]
web-server-01
ホストを .ssh/config
またはプロジェクト特有の ssh.config
ファイルに追加します。
Host web-server-01
HostName 123.45.67.89
SSHキーなしでrootアカウントから始める物理サーバーでは、初めてサーバーをブートストラップする必要があります。パスワードを -k で指定します。
ansible-playbook -k -u root -v -l web-server-01 playbooks/manage-users.yml --extra-vars "ansible_host=123.45.67.89"
macOSでは -k コマンドにはaskpassユーティリティが必要であり、デフォルトではインストールされていないため、Paramikoにフォールバックします。Paramikoは .ssh/config
を理解しないため、ansible_host
を手動で指定します。
その後の実行では、管理者ユーザーが設定された後、以下のようにします:
ansible-playbook -u $USER -v -l web-server-01 playbooks/manage-users.yml
レガシーユーザーの削除
削除するレガシーユーザーアカウントを users_delete_users
リストで定義します。例えば:
ansible-playbook -u $USER -v -l web-servers playbooks/manage-users.yml --extra-vars "users_delete_users=[fred] users_delete_remove=yes users_delete_force=yes"
ライセンス
MIT
著者情報
Jake Morrison Cogini