はじめに
Ansible は、リモートサーバーの管理を簡素化する強力な自動化ツールです。Ansible の重要な側面の 1 つは、これらのサーバーへの安全な SSH 接続を確立する能力です。このチュートリアルでは、Ansible 接続のデフォルト SSH ユーザーを設定する方法を探求し、サーバー管理タスクのスムーズで効率的なワークフローを確保します。
Ansible のインストールとセットアップ
Ansible の SSH ユーザーを設定する前に、Ansible がシステムに正しくインストールされ、セットアップされていることを確認する必要があります。
Ansible のインストール
まず、Ansible をインストールすることから始めましょう。ターミナルを開き、次のコマンドを実行します。
sudo apt update
sudo apt install -y ansible
インストールが完了したら、Ansible のバージョンを確認して、正しくインストールされていることを確認します。
ansible --version
次のような出力が表示されるはずです。
ansible [core 2.12.x]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (main, Ubuntu, x86_64)
jinja version = 3.0.3
libyaml = True
Ansible 作業ディレクトリの作成
次に、Ansible プロジェクトのディレクトリ構造を作成しましょう。これにより、ファイルを整理しやすくなります。
mkdir -p ~/project/ansible/inventory
cd ~/project/ansible
基本的なインベントリファイルの作成
Ansible は、管理するホストを定義するためにインベントリファイルを使用します。簡単なインベントリファイルを作成しましょう。
echo "[webservers]
localhost ansible_connection=local" > ~/project/ansible/inventory/hosts
このインベントリファイルは、webservers というグループを定義し、localhost という 1 つのホストのみを含み、このホストに対して SSH ではなくローカル接続を使用するように Ansible に指示します。
次に、インベントリを確認しましょう。
ansible -i inventory/hosts --list-hosts all
次のような出力が表示されるはずです。
hosts (1):
localhost
これは、Ansible がインベントリとその中で定義されたホストを認識していることを示しています。
Ansible SSH 接続と設定の理解
Ansible は、主に SSH を使用してリモートホストに接続し、コマンドを実行します。Ansible がどのように SSH 接続を確立し、デフォルトの SSH ユーザーを設定できるかを探ってみましょう。
Ansible が SSH を使用する方法
デフォルトでは、Ansible は現在のシステムユーザーを使用して SSH 接続を確立しようとします。つまり、labex ユーザーとしてログインし、Ansible コマンドを実行すると、Ansible はリモートホストに labex ユーザーとして接続しようとします。
このデフォルトの動作が、常に望ましいとは限りません。例えば:
- リモートサーバーがアクセスに別のユーザーを必要とする場合
- 自動化タスクに専用のユーザーを使用したい場合
- 異なるサーバーが異なるユーザーを必要とする場合
Ansible 設定階層
Ansible は、使用する SSH ユーザーを決定するために、設定ソースの階層を使用します。
- コマンドラインオプション (最優先)
- プレイブック内のタスク固有のオプション
- インベントリ内のホストおよびグループ変数
- Ansible 設定ファイル
- デフォルト値 (最下位)
これをよりよく理解するために、基本的な Ansible 設定ファイルを作成しましょう。
cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF
この設定ファイルは、Ansible に以下のように指示します。
- デフォルトでインベントリファイルを使用する
- ホストキーチェックを無効にする (実験環境でのテストに役立ちます)
作成したファイルをレビューしましょう。
cat ~/project/ansible/ansible.cfg
先ほどファイルに追加した内容が表示されるはずです。
基本的な Ansible コマンドのテスト
現在のユーザーを確認するために、基本的な Ansible コマンドを実行してみましょう。
cd ~/project/ansible
ansible localhost -m command -a "whoami"
出力は次のようになるはずです。
localhost | CHANGED | rc=0 >>
labex
これにより、Ansible が現在のユーザー (labex) としてコマンドを実行していることが確認できます。
Ansible のデフォルト SSH ユーザーの設定
Ansible が SSH をどのように使用するかを理解したので、接続のデフォルト SSH ユーザーを設定するさまざまな方法を探ってみましょう。
方法 1: Ansible 設定ファイルの使用
グローバルなデフォルト SSH ユーザーを設定する最も簡単な方法は、Ansible 設定ファイルを使用することです。 ansible.cfg ファイルを変更しましょう。
cat > ~/project/ansible/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
remote_user = ansible_user
EOF
この設定では、remote_user パラメータを追加しました。これにより、Ansible はすべての接続で ansible_user をデフォルトの SSH ユーザーとして使用するように指示されます。
方法 2: インベントリファイルでのユーザー設定
別の方法は、インベントリファイルで SSH ユーザーを定義することです。この方法では、異なるホストまたはグループに対して異なるユーザーを設定できます。
インベントリファイルを変更しましょう。
cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local
[dbservers]
db.example.com ansible_user=db_admin
[all:vars]
ansible_user=default_user
EOF
この例では、
dbserversという新しいグループを追加し、ホストdb.example.comを追加し、Ansible がこのホストに接続する際にdb_adminユーザーを使用するように指定しました。- また、すべてのホストに適用されるグループ変数
ansible_user=default_userを追加しました (オーバーライドされない限り)。
方法 3: コマンドラインオプションの使用
Ansible コマンドを実行する際に、コマンドラインで SSH ユーザーを直接指定することもできます。
ansible localhost -m command -a "whoami" -u specific_user
-u オプションは、この特定のコマンドに対して specific_user を使用するように Ansible に指示し、設定ファイルまたはインベントリで定義されたユーザーをオーバーライドします。
方法 4: プレイブックでのユーザー設定
Ansible プレイブックを使用する場合、プレイレベルで SSH ユーザーを指定できます。
これを示すために、簡単なプレイブックを作成しましょう。
cat > ~/project/ansible/user_demo.yml << 'EOF'
---
- name: Demonstrate user configuration
hosts: localhost
remote_user: playbook_user
tasks:
- name: Show current user
command: whoami
register: current_user
- name: Display current user
debug:
msg: "Current user is {{ current_user.stdout }}"
EOF
このプレイブックでは、remote_user パラメータは、このプレイのすべてのタスクに対して SSH ユーザーを playbook_user に設定します。
Ansible でのユーザーの優先順位
これらのさまざまな方法の優先順位を理解することが重要です。
- コマンドラインオプション (
-uフラグ) が最も高い優先順位を持ちます - プレイブック内のタスクレベルの設定
- プレイブック内のプレイレベルの設定
- インベントリ内のホスト変数
- インベントリ内のグループ変数
- 設定ファイルの設定 (
ansible.cfgのremote_user) - デフォルトのシステムユーザー (最も低い優先順位)
これは、より具体的なユーザー設定が、より一般的な設定をオーバーライドすることを意味します。
SSH ユーザー設定のテストと検証
さまざまな方法でデフォルトの SSH ユーザーを設定したので、設定をテストして検証しましょう。
設定ファイル設定のテスト
まず、設定ファイルの設定が適用されているかどうかを確認するために、簡単な Ansible コマンドを実行してみましょう。
cd ~/project/ansible
ansible localhost -m command -a "whoami"
ansible_connection=local で localhost に接続しているため、Ansible は remote_user 設定に関係なく、現在のユーザーとしてコマンドを実行します。ただし、これがリモート接続の場合、Ansible は設定で指定した ansible_user ユーザーを使用しようとします。
ansible-inventory を使用したユーザー設定の確認
Ansible には、インベントリの解釈方法 (SSH ユーザー設定を含む) を確認できる ansible-inventory というコマンドが用意されています。
ansible-inventory --list
このコマンドは、インベントリの JSON 表現を出力し、SSH ユーザー設定を含む、各ホストに関連付けられたすべての変数を表示します。
プレイブックを使用したユーザー設定のテスト
前の手順で作成したプレイブックを実行しましょう。
ansible-playbook user_demo.yml
出力は次のようになります。
PLAY [Demonstrate user configuration] ******************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Show current user] *******************************************************
changed: [localhost]
TASK [Display current user] ****************************************************
ok: [localhost] => {
"msg": "Current user is labex"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
出力は、コマンドが引き続き labex ユーザーとして実行されていることを示しています。これは、ansible_connection=local で localhost に接続しているため、予想される動作です。
実際の SSH ユーザー設定の例の作成
リモートホストの SSH ユーザー設定を設定する方法を示す、より現実的な例を作成しましょう。新しいプレイブックを作成します。
cat > ~/project/ansible/remote_user_example.yml << 'EOF'
---
- name: Example of remote user configuration
hosts: all
remote_user: admin_user
tasks:
- name: This task uses the play-level user (admin_user)
debug:
msg: "This would run as admin_user"
- name: This task uses a specific user
debug:
msg: "This would run as operator_user"
remote_user: operator_user
- name: This task uses become to elevate privileges
debug:
msg: "This would run as the root user"
become: true
become_user: root
EOF
このプレイブックでは、
- プレイレベルで
remote_user: admin_userを設定します。これは、デフォルトですべてのタスクに適用されます。 - 2 番目のタスクは、これを
remote_user: operator_userでオーバーライドします。 - 3 番目のタスクは、
become: trueを使用して権限をrootユーザーに昇格させます。
この例は、Ansible で SSH ユーザーを設定できるさまざまなレベルを示しています。
高度な SSH ユーザー設定とトラブルシューティング
Ansible のデフォルト SSH ユーザーの設定の基本を説明したので、高度なテクニックとトラブルシューティングの手順を探ってみましょう。
Ansible での SSH キーの使用
リモートホストに接続する際は、パスワードの代わりに SSH キー認証を使用することがベストプラクティスです。Ansible で SSH キー認証を設定する方法を見てみましょう。
cat > ~/project/ansible/ssh_key_example.yml << 'EOF'
---
- name: Example using SSH key authentication
hosts: all
remote_user: secure_user
vars:
ansible_ssh_private_key_file: ~/.ssh/id_rsa
tasks:
- name: Show SSH connection details
debug:
msg: "Connecting as {{ ansible_user }} using key {{ ansible_ssh_private_key_file }}"
EOF
この例では、
remote_user: secure_userをデフォルトの SSH ユーザーとして設定します。ansible_ssh_private_key_fileで使用する SSH 秘密鍵ファイルを指定します。
環境ごとに異なるユーザーの設定
実際のシナリオでは、異なる環境 (開発、ステージング、本番) に対して異なる SSH ユーザーを使用したい場合があります。これを実現する方法を見てみましょう。
mkdir -p ~/project/ansible/group_vars
次に、さまざまな環境のグループ変数ファイルを作成しましょう。
cat > ~/project/ansible/group_vars/development << 'EOF'
---
ansible_user: dev_user
EOF
cat > ~/project/ansible/group_vars/production << 'EOF'
---
ansible_user: prod_user
ansible_ssh_private_key_file: ~/.ssh/prod_key
EOF
これらの環境グループを含めるようにインベントリファイルを更新します。
cat > ~/project/ansible/inventory/hosts << 'EOF'
[webservers]
localhost ansible_connection=local
[development]
dev.example.com
[production]
prod1.example.com
prod2.example.com
[all:vars]
ansible_user=default_user
EOF
この設定では、
developmentグループのホストは、dev_userSSH ユーザーを使用します。productionグループのホストは、prod_userSSH ユーザーと特定の SSH キーを使用します。- その他のすべてのホストは、
default_userSSH ユーザーを使用します。
SSH ユーザー設定のトラブルシューティング
Ansible で SSH ユーザー設定に関する問題が発生した場合は、次のトラブルシューティング手順を実行してください。
1. Ansible が解釈したインベントリを確認する
Ansible がインベントリをどのように解釈しているか (すべての変数値を含む) を確認するには、次のようにします。
ansible-inventory --list
2. 詳細表示で Ansible を実行する
詳細表示で Ansible を実行すると、接続の問題の特定に役立ちます。
ansible localhost -m ping -vvv
-vvv フラグは詳細レベルを上げ、SSH 接続プロセスの詳細情報を表示します。
3. SSH 接続を手動でテストする
SSH 接続を手動でテストして、ユーザーとキーが機能していることを確認できます。
ssh -i ~/.ssh/id_rsa username@hostname
4. SSH 接続エラーを確認する
一般的な SSH 接続エラーには、次のようなものがあります。
- Permission denied (publickey): これは、SSH キー認証に関する問題を示しています。
- Host key verification failed: これは、ホストキーが変更された場合に発生します。
- Connection refused: これは、SSH サービスが実行されていないか、ファイアウォールによってブロックされていることを示しています。
5. Ansible 設定テストプレイブックを作成する
SSH ユーザー設定をテストするための簡単なプレイブックを作成しましょう。
cat > ~/project/ansible/test_ssh_config.yml << 'EOF'
---
- name: Test SSH user configuration
hosts: all
gather_facts: no
tasks:
- name: Display connection information
debug:
msg: |
Connected to: {{ inventory_hostname }}
User: {{ ansible_user | default('not set') }}
SSH Key: {{ ansible_ssh_private_key_file | default('not set') }}
EOF
このプレイブックを実行して、各ホストの接続情報を確認します。
ansible-playbook -i inventory/hosts test_ssh_config.yml
このプレイブックは、Ansible が各ホストに使用している SSH ユーザーとキーを表示し、設定の問題の特定に役立ちます。
まとめ
この実験では、さまざまな方法を使用して Ansible 接続のデフォルト SSH ユーザーを設定する方法を学習しました。次のことが理解できるようになりました。
- 基本的な設定で Ansible をインストールしてセットアップする
- Ansible 設定ファイルを使用してデフォルト SSH ユーザーを設定する
- インベントリ、プレイブック、コマンドラインなど、さまざまなレベルで SSH ユーザーを設定する
- SSH ユーザー設定を検証およびテストする
- 一般的な SSH 接続の問題をトラブルシューティングする
これらのスキルにより、Ansible を使用してインフラストラクチャをより効果的に管理し、リモートサーバーへの安全で信頼性の高い接続を確保できます。Ansible 接続の SSH ユーザーを適切に設定することで、適切なセキュリティプラクティスを維持しながら、さまざまな環境で一貫した自動化ワークフローを実装できます。


