ryandaniels.create_users
ansible-role-create-users
Linux上のユーザーを管理するための役割です。
ユーザーリストの設定ファイル(リストはファイル vars/secret にあります)でユーザーを管理します。
特定のUIDでユーザーを追加し、パスワードを変更し、ユーザーアカウントをロック/ロック解除し、sudoアクセスを管理し(ユーザーごと)、SSHキーを使った認証のためにSSHキーを追加し、ユーザーの主グループとGIDを設定し、ユーザーをグループに追加します。グループが存在しない場合は作成されます。
これは、設定ファイルで設定されている「グループ」単位(Ansibleのグループ変数)で行われます。グループは、インベントリファイルでサーバーに設定されたAnsibleグループから来ます。all
は、インベントリファイル内のすべてのホストに適用するためにもサポートされています。
詳細な例は、ブログ投稿「Ansibleによるユーザー管理」で見つかります。
注意:ユーザーを削除することは意図的に行っていません。
テストされたディストリビューション
- Ubuntu 22.04, 20.04, 18.04, 16.04
- CentOS / RHEL: 9.1, 8.x, 7.x, 6.5, 5.9
依存関係
Ansible 2.6が必要です(以前のバグ20096のため)。
ansible-vault
ansible-vaultを使用して、gitから機密情報を暗号化します。
cat vars/secret
#平文の場合は暗号化します(git commit/pushの前に)
ansible-vault encrypt vars/secret
#暗号化されたファイルを編集する:
ansible-vault edit vars/secret
vi .vaultpass
- パスワードマネージャーからAnsible Vaultのパスワードを入力
chmod 600 .vaultpass
vi ansible.cfg
#以下の行を挿入
[defaults]
vault_password_file = ./.vaultpass
.gitignore
vi .gitignore
#以下の行を挿入
.vaultpass
.retry
secret
*.secret
パスワード生成方法
- Ubuntu - "whois"パッケージをインストール
mkpasswd --method=SHA-512
- RedHat - Pythonを使用
python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'
デフォルト設定
---
# 注意: 'debug_enabled_default: true'を設定すると、ハッシュ化されたパスワードが出力に表示されます。
debug_enabled_default: false
default_update_password: on_create
default_shell: /bin/bash
default_generate_ssh_key_comment: "{{ item.username }}@{{ ansible_hostname }}"
ユーザー設定
ファイル位置: vars/secret
- username: ユーザー名 - スペースなし (必須)
- uid: ユーザーのIDの数値(オプション)
- user_state: present|lock (必須)
- password: sha512で暗号化されたパスワード(オプション)。設定しない場合、パスワードは"!"に設定されます。
- update_password: always|on_create(オプション、デフォルトはon_create)
警告: 'always'の場合、パスワードが設定された値に変更されます。
既存のユーザーに対して'always'を使用する場合は、必ずパスワードが設定されていることを確認してください。 - comment: フルネームおよび部門またはアプリケーションの説明(オプション)(設定することをお勧めします)
- primarygroup: プライマリグループ名(オプション)
- primarygid: プライマリグループID(オプション)。サーバー上で同じGIDを再使用すると、プレイブックは失敗します。異なるGIDを持つ同じ重複グループが指定された場合、最後の設定が使用されます。 警告: 既存のユーザーのプライマリグループやプライマリGIDを変更しても、そのユーザーに属する既存のファイルの権限は変更されません。また、古いエントリは/etc/groupに残ります。注意して使用してください。
- groups: ユーザーが追加されるグループのカンマ区切りリスト(追加されます)。グループが存在しない場合、特定のサーバー上で作成されます。これはプライマリグループではありません(プライマリグループは変更されません)
- shell: シェルへのパス(オプション、デフォルトは/bin/bash)
- ssh_key: SSHキーを使った認証のために認可されたSSHキーを追加します(オプション)
注意: 1つのキーは単一の行に入りますが、複数のキーがある場合は、最初の例にあるフォーマットを使用してください。 - exclusive_ssh_key: yes|no(オプション、デフォルト: no)
警告: exclusive_ssh_key: yes - ここで定義されていないSSHキーをすべて削除します! no - 指定したすべてのキーを追加します。 - generate_ssh_key: 対象ユーザーのSSHキーを生成するかどうか(オプション、デフォルトは'no')
注意: これにより、既存のSSHキーは上書きされません。 - ssh_key_bits: 作成するSSHキーのビット数をオプションで指定します(オプション、デフォルトはssh-keygenによって設定されます)。
- ssh_key_passphrase: SSHキーのためのパスフレーズを設定します。パスフレーズが提供されない場合、SSHキーはパスフレーズなしでデフォルト設定されます。
- generate_ssh_key_comment: 生成されたSSHキーのコメントを指定します(オプション)。指定しない場合は、デフォルトのコメントが使用されます。
- use_sudo: yes|no(オプション、デフォルトはno)
- use_sudo_nopass: yes|no(オプション、デフォルトはno)。yes = パスワードなしのsudo。
- system: yes|no(オプション、デフォルトはno)。yes = システムアカウントを作成(UID < 1000)。既存のユーザーには機能しません。
- servers: 変更が行われるサーバーのサブ要素リスト。 (必須)
これらは、AnsibleインベントリファイルからのAnsibleグループです。以下の例では、webserver
はwebserver1
、webserver2
、webserver3
の3つのサーバーになります。
注意:
異なる設定を持つ異なるサーバー上で同じユーザー名を持つことができます。以下の例では、testuser102
がインベントリのwebserver
グループに定義されているサーバーにsudo権限を持つ一方、database
グループにはsudo権限がありません。
サンプルAnsibleインベントリファイル
[webserver]
webserver1
webserver2
webserver3
[database]
db1
db2
db3
[monitoring]
monitor1
サンプル設定ファイル (vars/secret)
---
users:
- username: testuser101
password: $6$/y5RGZnFaD3f$96xVdOAnldEtSxivDY02h.DwPTrJgGQl8/MTRRrFAwKTYbFymeKH/1Rxd3k.RQfpgebM6amLK3xAaycybdc.60
update_password: on_create
comment: Test User 100
shell: /bin/bash
ssh_key: |
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8crAHG/a9QBD4zO0ZHIjdRXy+ySKviXVCMIJ3/NMIAAzDyIsPKToUJmIApHHHF1/hBllqzBSkPEMwgFbXjyqTeVPHF8V0iq41n0kgbulJG testuser101@server1
ssh-rsa AAAA.... testuser101@server2
exclusive_ssh_key: yes
use_sudo: no
use_sudo_nopass: no
user_state: present
servers:
- webserver
- database
- monitoring
- username: testuser102
password: $6$F/KXFzMa$ZIDqtYtM6sOC3UmRntVsTcy1rnsvw.6tBquOhX7Sb26jxskXpve8l6DYsQyI1FT8N5I5cL0YkzW7bLbSCMtUw1
update_password: always
comment: Test User 101
groups: testcommon, testgroup102web
shell: /bin/sh
use_sudo: yes
user_state: present
servers:
- webserver
- all
- username: testuser102
password: $6$F/KXFzMa$ZIDqtYtM6sOC3UmRntVsTcy1rnsvw.6tBquOhX7Sb26jxskXpve8l6DYsQyI1FT8N5I5cL0YkzW7bLbSCMtUw1
update_password: always
comment: Test User 101
groups: testcommon, testgroup102db
shell: /bin/sh
user_state: present
servers:
- database
- username: testuser103
password: $6$wBxBAqRmG6O$gPbg9hYShkuIe3YKMFujwiKsPKZHNFwoK4yCyTOlploljz53YSoPdCn9P5k8Qm0z062Q.8hvJ6DnnQQjwtrnS0
user_state: present
servers:
- webserver
- username: testuser104
primarygroup: testgroup104primary
ssh_key: ssh-rsa AAAB.... test103@server
exclusive_ssh_key: no
generate_ssh_key: yes
generate_ssh_key_comment: 生成されたSSHキーのためのカスタムコメント
use_sudo: no
user_state: present
servers:
- webserver
- monitoring
- username: testuser105
uid: 1099
password: $6$XEnyI5UYSw$Rlc6tXtECtqdJ3uFitrbBlec1/8Fx2obfgFST419ntJqaX8sfPQ9xR7vj7dGhQsfX8zcSX3tumzR7/vwlIH6p/
primarygroup: testgroup105primary
primarygid: 2222
ssh_key: ssh-rsa AAAB.... test107@server
generate_ssh_key: yes
ssh_key_bits: 4096
use_sudo: no
user_state: lock
servers:
- webserver
- database
サンプルプレイブック create-users.yml
---
- hosts: '{{inventory}}'
vars_files:
- vars/secret
become: yes
roles:
- create-users
準備
- ansibleをインストール
- 鍵を作成
- クライアントにSSHで接続し、known_hostsファイルにエントリを追加
- クライアントサーバーのauthorized_keysを設定
- ansibleコマンドを実行
使用方法
すべてのユーザーを作成する
ansible-playbook create-users.yml --ask-vault-pass --extra-vars "inventory=all-dev" -i hosts