Ansible で Sudo パスワードが見つからない問題を解決

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

はじめに

Ansible は、手動での介入を必要とせずにサーバーを管理および設定するのに役立つ強力な自動化ツールです。しかし、多くの Ansible タスクは、適切に実行するために昇格された権限を必要とします。管理者権限が必要なコマンドを実行する場合、Ansible は sudo メカニズムを使用します。これにより、パスワードの入力を求められる場合があります。

この実験(Lab)では、Ansible プレイブックで sudo パスワード設定を適切に構成する方法、一般的な sudo 関連の問題を理解する方法、および必要な権限で自動化がスムーズに実行されるようにするためのベストプラクティスを実装する方法を学びます。

Ansible のインストールと基本的なプレイブックの作成

この最初のステップでは、Ansible をインストールし、sudo 権限を必要とするシンプルなプレイブックを作成します。これにより、昇格された権限で Ansible タスクを実行するための基本的な要件を理解するのに役立ちます。

Ansible のインストール

まず、システムに Ansible をインストールすることから始めましょう。ターミナルを開き、次のコマンドを実行します。

sudo apt update
sudo apt install -y ansible

インストールが完了したら、Ansible が正しくインストールされたことを確認します。

ansible --version

Ansible のバージョンと設定情報を示す、次のような出力が表示されるはずです。

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, linux/x86_64)
  jinja version = 3.0.3
  libyaml = True

基本的な Ansible プレイブックの作成

次に、sudo 権限を必要とするシンプルな Ansible プレイブックを作成しましょう。このプレイブックは、ローカルシステムに htop パッケージをインストールします。

Ansible プロジェクト用の新しいディレクトリを作成します。

mkdir -p ~/project/ansible-sudo-lab
cd ~/project/ansible-sudo-lab

次に、Ansible が管理するホストを定義するインベントリファイルを作成します。この実験(Lab)では、localhost を使用します。

echo "localhost ansible_connection=local" > inventory

次に、sudo 権限を必要とする基本的なプレイブックを作成します。VSCode エディターを開き、basic_playbook.yml という名前の新しいファイルを作成します。

  1. WebIDE メニューの「File」をクリックします。
  2. 「New File」を選択します。
  3. 次の内容をコピーして貼り付けます。
---
- name: Basic sudo operation
  hosts: localhost
  become: true ## This enables sudo

  tasks:
    - name: Install htop
      apt:
        name: htop
        state: present
        update_cache: yes
  1. ファイルを ~/project/ansible-sudo-lab/basic_playbook.yml として保存します。

このプレイブックには、タスクを実行するために Ansible に sudo を使用するように指示する become: true ディレクティブがあります。タスク自体は、apt モジュールを使用して htop パッケージをインストールしようとします。

プレイブックの実行

次に、プレイブックを実行して何が起こるか観察しましょう。

cd ~/project/ansible-sudo-lab
ansible-playbook -i inventory basic_playbook.yml

labex ユーザーはパスワードなしの sudo アクセスを持っているため、プレイブックはパスワードを要求することなく正常に実行されるはずです。次のような出力が表示されるはずです。

PLAY [Basic sudo operation] ******************************************

TASK [Gathering Facts] **********************************************
ok: [localhost]

TASK [Install htop] ************************************************
ok: [localhost]

PLAY RECAP *********************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

現在のユーザー (labex) はすでにパスワードなしの sudo アクセスで構成されているため、プレイブックは正常に実行されました。次のステップでは、sudo パスワードが必要なシナリオを処理する方法を検討します。

Ansible での sudo パスワード設定の理解

前のステップでは、パスワードを必要とせずに sudo 権限を使用する基本的なプレイブックを作成しました。ただし、多くの現実的なシナリオでは、特権コマンドを実行するために sudo パスワードを提供する必要があります。Ansible で sudo パスワードを処理する方法を見てみましょう。

Ansible が sudo パスワードを処理する方法

Ansible がリモートシステムで昇格された権限でコマンドを実行する必要がある場合、become 機能を使用します。デフォルトでは、Ansible は特権昇格に sudo コマンドを使用しますが、supbrun、または pfexec などの他の方法を使用するように設定できます。

Ansible を実行しているユーザーが sudo を使用するためにパスワードを必要とする場合、Ansible はこのパスワードを知る必要があります。Ansible に sudo パスワードを提供する方法はいくつかあります。

  1. コマンドラインオプション:-K または --ask-become-pass
  2. プレイブック変数:become_password
  3. 設定ファイル:ansible.cfg
  4. Ansible Vault: パスワードを安全に保存するため

Sudo パスワード要件を持つテストユーザーの作成

sudo パスワードを処理する方法を説明するために、sudo 操作にパスワードを必要とするテストユーザーを作成しましょう。

sudo adduser ansible_test

プロンプトが表示されたら、パスワード ansible123 を入力し、ユーザー作成プロセスを完了します。

次に、このユーザーに sudo 権限を与えますが、パスワードを要求します。

echo "ansible_test ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/ansible_test

この設定により、ansible_test ユーザーは sudo を使用できますが、毎回ユーザーのパスワードが必要になります。

Sudo パスワード処理を含むプレイブックの作成

次に、sudo パスワードを処理する方法を示すプレイブックを作成しましょう。WebIDE で sudo_password_playbook.yml という名前の新しいファイルを作成します。

---
- name: Playbook with sudo password handling
  hosts: localhost
  become: true
  ## We'll provide the become_password when running the playbook

  tasks:
    - name: Get current user
      command: whoami
      register: current_user
      become: false ## This task doesn't need sudo

    - name: Print current user
      debug:
        msg: "Current user is {{ current_user.stdout }}"
      become: false ## This task doesn't need sudo

    - name: Run a command with sudo
      command: apt update
      register: sudo_output

    - name: Print sudo command result
      debug:
        msg: "Command ran with sudo: {{ sudo_output.rc == 0 }}"

このファイルを ~/project/ansible-sudo-lab/sudo_password_playbook.yml として保存します。

パスワード入力でプレイブックを実行する

sudo パスワードを必要とするユーザーとしてプレイブックを実行する場合は、-K (または --ask-become-pass) オプションを使用して、パスワードの入力を求めることができます。

ansible-playbook -i inventory sudo_password_playbook.yml -K

パスワードなしの sudo を持つ labex ユーザーとして実行しているため、実際にはパスワードの入力を求められることはありません。ただし、パスワードなしの sudo が設定されていない本番環境では、Ansible は sudo パスワードの入力を求めます。

このシナリオをテストユーザーでシミュレートするには、次のコマンドを実行できます (ただし、この実験(Lab)環境では SSH の設定が不足しているため、完全には機能しません)。

ansible-playbook -i inventory sudo_password_playbook.yml -u ansible_test -K

BECOME パスワードの入力を求められたら、ansible123 を入力します。

Ansible 変数での sudo パスワードの指定

パスワードを対話的に入力する代わりに、プレイブックの実行時に sudo パスワードを変数として提供できます。

ansible-playbook -i inventory sudo_password_playbook.yml -e "ansible_become_password=ansible123"

このアプローチは、対話的な入力が不可能な自動化されたスクリプトに役立ちます。ただし、コマンドライン履歴にパスワードが公開されるため、セキュリティリスクがあります。本番環境では、Ansible Vault を使用して機密情報を安全に保存する必要があります。

安全なパスワード管理のための Ansible Vault の使用

前のステップでは、Ansible プレイブックに sudo パスワードを提供するさまざまな方法を検討しました。ただし、パスワードをプレーンテキストファイルに保存したり、コマンドラインで渡したりすることは安全ではありません。このステップでは、Ansible Vault を使用して、sudo パスワードなどの機密情報を安全に管理する方法を学びます。

Ansible Vault とは?

Ansible Vault は、パスワード、API キー、または証明書などの機密データを暗号化できる機能です。暗号化されたファイルは、機密情報を公開することなく、バージョン管理システムに安全に保存できます。Ansible は、プレイブックの実行中にこれらのファイルを自動的に復号化できます。

暗号化された Vault ファイルの作成

sudo パスワードを保存するための暗号化されたファイルを作成しましょう。

cd ~/project/ansible-sudo-lab
ansible-vault create vault.yml

新しい Vault パスワードを作成するように求められます。 vaultpassword123 を入力し、確認します。

Vault パスワードを設定すると、エディターが開きます。エディターに次の内容を入力します。

---
vault_sudo_password: ansible123

ファイルを保存してエディターを終了します。

次に、Vault ファイルの内容を表示しようとすると、暗号化されていることがわかります。

cat vault.yml

次のような出力が表示されるはずです。

$ANSIBLE_VAULT;1.1;AES256
32623438613466396238613731623338376461653866353031313632316237613561393639613131
3562626166616332386265373761653835356134613561380a363761333362323238663136633439
32343032333832313562353261333530666639643239303436643363393630643639316232303564
3962356162356361370a313038333432353162333462323035323262396233333039326535356662
31363539613432656362326565613232336535393232653939323466323131393362

プレイブックでの Vault 変数の使用

次に、暗号化された sudo パスワードを使用するプレイブックを作成しましょう。 secure_sudo_playbook.yml という名前の新しいファイルを作成します。

---
- name: Playbook with secure sudo password
  hosts: localhost
  become: true
  become_password: "{{ vault_sudo_password }}"
  vars_files:
    - vault.yml

  tasks:
    - name: Get sudo user
      command: whoami
      register: sudo_user

    - name: Print sudo user
      debug:
        msg: "Running as {{ sudo_user.stdout }}"

    - name: Check sudo access
      command: apt update
      register: apt_result
      failed_when: false

    - name: Print result
      debug:
        msg: "Sudo access successful: {{ apt_result.rc == 0 }}"

このファイルを ~/project/ansible-sudo-lab/secure_sudo_playbook.yml として保存します。

Vault を使用したプレイブックの実行

暗号化された Vault ファイルを含むプレイブックを実行する場合は、Vault パスワードを提供する必要があります。これを行う方法はいくつかあります。

  1. --ask-vault-pass オプションを使用する:
ansible-playbook -i inventory secure_sudo_playbook.yml --ask-vault-pass

プロンプトが表示されたら、Vault パスワード vaultpassword123 を入力します。

  1. Vault パスワードファイルを使用する:

まず、Vault パスワードを含むファイルを作成します。

echo "vaultpassword123" > vault_password_file
chmod 600 vault_password_file

次に、パスワードファイルを使用してプレイブックを実行します。

ansible-playbook -i inventory secure_sudo_playbook.yml --vault-password-file vault_password_file

次のような出力が表示されるはずです。

PLAY [Playbook with secure sudo password] ***************************

TASK [Gathering Facts] **********************************************
ok: [localhost]

TASK [Get sudo user] ***********************************************
changed: [localhost]

TASK [Print sudo user] *********************************************
ok: [localhost] => {
    "msg": "Running as root"
}

TASK [Check sudo access] *******************************************
changed: [localhost]

TASK [Print result] ************************************************
ok: [localhost] => {
    "msg": "Sudo access successful: True"
}

PLAY RECAP *********************************************************
localhost                  : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Sudo パスワード管理のベストプラクティス

Ansible で sudo パスワードを管理する際に従うべきベストプラクティスを次に示します。

  1. 常に Ansible Vault を使用して機密情報を暗号化する
  2. Vault パスワードをバージョン管理に保存しない
  3. Vault パスワードを配布するための安全な方法を使用する (例:パスワードマネージャー)
  4. さまざまな環境 (開発、ステージング、本番) に Vault ID を使用することを検討する
  5. Vault パスワードを定期的にローテーションする

本番環境では、HashiCorp Vault や AWS Secrets Manager などのツールを使用して、さらに安全なシークレット管理を検討することもできます。

一般的な Sudo パスワード問題のトラブルシューティング

適切な設定を行っていても、Ansible で sudo パスワードに関する問題が発生する可能性があります。このステップでは、一般的な問題とその解決策を探ります。

一般的な Sudo パスワードの問題

Ansible で sudo を使用する際に発生する可能性のある一般的な問題は次のとおりです。

  1. Sudo パスワードの欠落: Ansible は、特権コマンドを実行するための sudo パスワードを見つけることができません。
  2. 誤った sudo パスワード: 提供された sudo パスワードが正しくありません。
  3. Sudo 設定の問題: ターゲットユーザーに適切な sudo 権限がありません。
  4. Sudo に TTY が必要: 一部のシステムでは、sudo コマンドに TTY を割り当てる必要があります。

これらの各問題とその解決策を見ていきましょう。

問題のあるテスト環境の作成

これらの問題をよりよく理解するために、sudo に TTY が必要なシナリオを作成しましょう。テストユーザーの sudoers ファイルを編集します。

sudo cp /etc/sudoers.d/ansible_test /etc/sudoers.d/ansible_test.bak
echo 'Defaults:ansible_test requiretty' | sudo tee -a /etc/sudoers.d/ansible_test

この設定により、ansible_test ユーザーが sudo コマンドを実行するときに sudo に TTY が必要になり、Ansible で問題が発生する可能性があります。

トラブルシューティングプレイブックの作成

一般的な sudo トラブルシューティング手法を含む、troubleshoot_sudo.yml という名前の新しいプレイブックを作成します。

---
- name: Troubleshoot sudo issues
  hosts: localhost
  become: true
  become_method: sudo
  ## We'll provide the become_password when running the playbook

  tasks:
    - name: Check sudo version
      command: sudo --version
      register: sudo_version
      become: false

    - name: Print sudo version
      debug:
        msg: "{{ sudo_version.stdout_lines[0] }}"
      become: false

    - name: Check sudo configuration
      command: sudo -l
      register: sudo_config
      become: false
      failed_when: false

    - name: Print sudo configuration
      debug:
        msg: "{{ sudo_config.stdout_lines }}"
      become: false
      when: sudo_config.rc == 0

    - name: Test sudo command with pty
      command: apt update
      register: sudo_test
      failed_when: false
      vars:
        ansible_become_flags: "-H"

    - name: Print sudo test result
      debug:
        msg: "Sudo command {{ 'succeeded' if sudo_test.rc == 0 else 'failed' }}"

このファイルを ~/project/ansible-sudo-lab/troubleshoot_sudo.yml として保存します。

トラブルシューティングプレイブックの実行

トラブルシューティングプレイブックを実行します。

ansible-playbook -i inventory troubleshoot_sudo.yml -K

パスワードなしの sudo を持つ labex ユーザーとして実行しているため、プレイブックは正常に実行されるはずです。

Sudo パスワードに関する問題の一般的な解決策

Sudo パスワードに関する一般的な問題に対する解決策を次に示します。

1. Sudo パスワードの欠落

Ansible が「Missing sudo password」のようなメッセージで失敗した場合、次のことができます。

  • -K オプションを使用して、sudo パスワードの入力を求める
  • インベントリまたはプレイブックで ansible_become_password 変数を設定する
  • Ansible Vault を使用して、sudo パスワードを安全に保存して提供する

2. 誤った sudo パスワード

sudo パスワードが正しくない場合:

  • 提供しているパスワードを再確認する
  • ユーザーのパスワードが期限切れになっていないか、変更されていないかを確認する
  • ターゲットシステムで sudo 設定が変更されていないか確認する

3. Sudo 設定の問題

ユーザーに適切な sudo 権限がない場合:

  • ターゲットシステムの sudoers ファイルを確認する
  • ユーザーが適切なグループに属していることを確認する
  • sudo -l を使用して、ユーザーの sudo 権限を確認する

4. Sudo に TTY が必要

sudo に TTY が必要な場合:

  • プレイブックまたはインベントリに ansible_become_flags: "-H" を追加する
  • sudoers ファイルを変更して、requiretty オプションを削除する
  • タスクで pty: true オプションを使用する

元の Sudo 設定の復元

テストユーザーの元の sudo 設定を復元しましょう。

sudo cp /etc/sudoers.d/ansible_test.bak /etc/sudoers.d/ansible_test
sudo rm /etc/sudoers.d/ansible_test.bak

これにより、先ほど追加した requiretty オプションが削除されます。

まとめ

この実験では、多くの管理者や DevOps エンジニアにとって一般的な課題である、Ansible プレイブックでの sudo パスワードの処理方法を学びました。達成した内容の概要は次のとおりです。

  1. Ansible をインストールし、sudo 権限を使用する基本的なプレイブックを作成しました
  2. Ansible プレイブックに sudo パスワードを提供するさまざまな方法を学びました
  3. Ansible Vault を使用して、機密情報を安全に保存および管理しました
  4. 一般的な sudo パスワードの問題を探り、そのトラブルシューティング方法を学びました

これらのスキルは、さまざまな環境でさまざまな sudo 設定を処理できる、より安全で信頼性の高い Ansible プレイブックを作成するのに役立ちます。

この実験からの主なポイント:

  • 機密情報を保存するには、常に Ansible Vault のような安全な方法を使用する
  • Ansible に sudo パスワードを提供するさまざまな方法を理解する
  • 一般的な sudo パスワードの問題をトラブルシューティングする方法を知る
  • Ansible での sudo パスワード管理に関するベストプラクティスに従う

これらのスキルにより、昇格された権限を必要とするタスクに Ansible を自信を持って使用し、自動化がスムーズかつ安全に実行されるようにすることができます。