Ansible 接続のデフォルト SSH ユーザー設定方法

AnsibleBeginner
オンラインで実践に進む

はじめに

Ansible は、リモートサーバーの管理を簡素化する強力な自動化ツールです。Ansible の重要な側面の 1 つは、これらのサーバーへの安全な SSH 接続を確立する能力です。このチュートリアルでは、Ansible 接続のデフォルト SSH ユーザーを設定する方法を探求し、サーバー管理タスクのスムーズで効率的なワークフローを確保します。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 中級 レベルの実験の完了率は 71%です。学習者から 100% の好評価を得ています。

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 ユーザーを決定するために、設定ソースの階層を使用します。

  1. コマンドラインオプション (最優先)
  2. プレイブック内のタスク固有のオプション
  3. インベントリ内のホストおよびグループ変数
  4. Ansible 設定ファイル
  5. デフォルト値 (最下位)

これをよりよく理解するために、基本的な 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 でのユーザーの優先順位

これらのさまざまな方法の優先順位を理解することが重要です。

  1. コマンドラインオプション (-u フラグ) が最も高い優先順位を持ちます
  2. プレイブック内のタスクレベルの設定
  3. プレイブック内のプレイレベルの設定
  4. インベントリ内のホスト変数
  5. インベントリ内のグループ変数
  6. 設定ファイルの設定 (ansible.cfgremote_user)
  7. デフォルトのシステムユーザー (最も低い優先順位)

これは、より具体的なユーザー設定が、より一般的な設定をオーバーライドすることを意味します。

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_user SSH ユーザーを使用します。
  • production グループのホストは、prod_user SSH ユーザーと特定の SSH キーを使用します。
  • その他のすべてのホストは、default_user SSH ユーザーを使用します。

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 ユーザーを設定する方法を学習しました。次のことが理解できるようになりました。

  1. 基本的な設定で Ansible をインストールしてセットアップする
  2. Ansible 設定ファイルを使用してデフォルト SSH ユーザーを設定する
  3. インベントリ、プレイブック、コマンドラインなど、さまざまなレベルで SSH ユーザーを設定する
  4. SSH ユーザー設定を検証およびテストする
  5. 一般的な SSH 接続の問題をトラブルシューティングする

これらのスキルにより、Ansible を使用してインフラストラクチャをより効果的に管理し、リモートサーバーへの安全で信頼性の高い接続を確保できます。Ansible 接続の SSH ユーザーを適切に設定することで、適切なセキュリティプラクティスを維持しながら、さまざまな環境で一貫した自動化ワークフローを実装できます。