はじめに
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 という名前の新しいファイルを作成します。
- WebIDE メニューの「File」をクリックします。
- 「New File」を選択します。
- 次の内容をコピーして貼り付けます。
---
- name: Basic sudo operation
hosts: localhost
become: true ## This enables sudo
tasks:
- name: Install htop
apt:
name: htop
state: present
update_cache: yes
- ファイルを
~/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 コマンドを使用しますが、su、pbrun、または pfexec などの他の方法を使用するように設定できます。
Ansible を実行しているユーザーが sudo を使用するためにパスワードを必要とする場合、Ansible はこのパスワードを知る必要があります。Ansible に sudo パスワードを提供する方法はいくつかあります。
- コマンドラインオプション:
-Kまたは--ask-become-pass - プレイブック変数:
become_password - 設定ファイル:
ansible.cfg - 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 パスワードを提供する必要があります。これを行う方法はいくつかあります。
--ask-vault-passオプションを使用する:
ansible-playbook -i inventory secure_sudo_playbook.yml --ask-vault-pass
プロンプトが表示されたら、Vault パスワード vaultpassword123 を入力します。
- 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 パスワードを管理する際に従うべきベストプラクティスを次に示します。
- 常に Ansible Vault を使用して機密情報を暗号化する
- Vault パスワードをバージョン管理に保存しない
- Vault パスワードを配布するための安全な方法を使用する (例:パスワードマネージャー)
- さまざまな環境 (開発、ステージング、本番) に Vault ID を使用することを検討する
- Vault パスワードを定期的にローテーションする
本番環境では、HashiCorp Vault や AWS Secrets Manager などのツールを使用して、さらに安全なシークレット管理を検討することもできます。
一般的な Sudo パスワード問題のトラブルシューティング
適切な設定を行っていても、Ansible で sudo パスワードに関する問題が発生する可能性があります。このステップでは、一般的な問題とその解決策を探ります。
一般的な Sudo パスワードの問題
Ansible で sudo を使用する際に発生する可能性のある一般的な問題は次のとおりです。
- Sudo パスワードの欠落: Ansible は、特権コマンドを実行するための sudo パスワードを見つけることができません。
- 誤った sudo パスワード: 提供された sudo パスワードが正しくありません。
- Sudo 設定の問題: ターゲットユーザーに適切な sudo 権限がありません。
- 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 パスワードの処理方法を学びました。達成した内容の概要は次のとおりです。
- Ansible をインストールし、sudo 権限を使用する基本的なプレイブックを作成しました
- Ansible プレイブックに sudo パスワードを提供するさまざまな方法を学びました
- Ansible Vault を使用して、機密情報を安全に保存および管理しました
- 一般的な sudo パスワードの問題を探り、そのトラブルシューティング方法を学びました
これらのスキルは、さまざまな環境でさまざまな sudo 設定を処理できる、より安全で信頼性の高い Ansible プレイブックを作成するのに役立ちます。
この実験からの主なポイント:
- 機密情報を保存するには、常に Ansible Vault のような安全な方法を使用する
- Ansible に sudo パスワードを提供するさまざまな方法を理解する
- 一般的な sudo パスワードの問題をトラブルシューティングする方法を知る
- Ansible での sudo パスワード管理に関するベストプラクティスに従う
これらのスキルにより、昇格された権限を必要とするタスクに Ansible を自信を持って使用し、自動化がスムーズかつ安全に実行されるようにすることができます。


