この記事では、2つの重要なAnsibleの概念に焦点を当てます。最初の概念は、SSHキーベースおよびパスワードベースの認証がAnsibleでどのように機能するかです。 2番目の概念は、アドホックコマンドやプレイブックを操作するときに特権を上げる方法です。
VirtualBoxとVagrantを使用してUbuntu20.04LTSマシンを実行する3ノードのラボセットアップがあります。以下のリンクから読むことができるラボのセットアップに関する詳細な記事があります。
- LinuxでのVagrantとVirtualboxによる自動化されたAnsibleラボのセットアップ
Ansibleでのキーベースの認証
ansibleを学習するときに最初に理解する必要があるのは、コントローラーと管理対象ノードの間で通信がどのように行われているかです。 AnsibleはSSHプロトコルを使用します 管理対象ノードに接続してタスクを実行します。
プレイブックまたはアドホックコマンドを実行するたびに、SSH経由で管理対象ノードに対して認証できるようにするためのSSHパスワードを提供する必要があります。
これを排除するには、SSHキーペアを作成し、公開キーをすべてのノードと共有して、ansibleがキーペアを使用して通信できるようにすることをお勧めします。
first_keyという名前の2つのキーペアを作成しました およびsecond_key 以下のスクリプトを使用してデモンストレーションを行います。
create_keypair.sh
というテキストファイルを作成します 以下の内容で。
#!/usr/bin/env bash # THIS SCRIPT WILL CREATE SSH KEY PAIR AND DISTRIBUTE ACROSS ALL NODES read -p "Enter the name for the key : " KEY_NAME ssh-keygen -b 2048 -t rsa -f /home/vagrant/.ssh/${KEY_NAME} -q -N "" # LOOPING THROUGH AND DISTRIBUTING THE KEY for val in controller managed1 managed2; do echo "-------------------- COPYING KEY TO ${val^^} NODE ------------------------------" sshpass -p 'vagrant' ssh-copy-id -f -i /home/vagrant/.ssh/${KEY_NAME}.pub -o "StrictHostKeyChecking=no" [email protected]$val done
スクリプトに実行権限を与えて実行します。
$ chmod +x path/to/create_keypair.sh
$ ./create_keypair.sh
ラボのセットアップ用にこのスクリプトを作成しました。 forループセクションを編集し、それに応じて管理対象ノード名を追加できます。
$ tree .ssh/
.ssh/
├── authorized_keys
├── first_key
├── first_key.pub
├── known_hosts
├── second_key
└── second_key.pub
デフォルト名(id_rsa)以外の異なる名前で作成されたキーがある場合、sshはデフォルトのキー名を見つけようとし、見つからない場合は、パスワードベースの認証を求めるプロンプトを表示します。
debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey,password debug1: Next authentication method: publickey debug1: Trying private key: /home/vagrant/.ssh/id_rsa debug1: Trying private key: /home/vagrant/.ssh/id_dsa debug1: Trying private key: /home/vagrant/.ssh/id_ecdsa debug1: Trying private key: /home/vagrant/.ssh/id_ecdsa_sk debug1: Trying private key: /home/vagrant/.ssh/id_ed25519 debug1: Trying private key: /home/vagrant/.ssh/id_ed25519_sk debug1: Trying private key: /home/vagrant/.ssh/id_xmss debug1: Next authentication method: password [email protected]'s password:
この場合、-i
を使用して秘密鍵ファイルに明示的に言及する必要があります フラグ。
$ ssh -v -i /home/vagrant/.ssh/first_key [email protected]
アドホックコマンドまたはプレイブックを実行するときは、--key-file
を使用できます。 または--private-key
フラグを立てて、秘密鍵ファイルを引数として渡します。以下の例では、両方のキー(first_keyとsecond_key)を使用して管理対象ノードと正常に通信したことがわかります。
# USING --key-file FLAG $ ansible managed1 -m ping --key-file /home/vagrant/.ssh/second_key managed1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
# USING --private-key FLAG $ ansible managed1 -m ping --private-key /home/vagrant/.ssh/first_key managed1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
パラメータ「private_key_file
」を追加することもできます "ansible.cfg
内 アドホックコマンドとすべてのプレイブックタスクに適用される構成ファイル。
$ vim ansible.cfg
Private_key_file = /home/vagrant/.ssh/first_key
/home/vagrant/.ssh/first_key
を置き換えます 自分で。
"ansible_ssh_private_key"を追加することもできます ansible.cfg
よりも優先されるインベントリファイルのパラメータ ファイル。以下は私の在庫がどのように設定されているかです。ノードmanaged1 "first_key"を使用します およびmanaged2 "second_key"を使用します 。
[ubuntu1] managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key [ubuntu2] managed2 ansible_ssh_private_key_file=/home/vagrant/.ssh/second_key
これで、アドホックコマンドまたはプレイブックを再度実行すると、両方のキーが正常に認証されることがわかります。冗長性を高めて、入力に従って適切なキーが使用されているかどうかを確認できます。
$ ansible -vvv all -m ping
これで、キーベースの認証がansibleでどのように機能するかを十分に理解する必要があります。異なるファイルにパラメータを追加するときは、優先順位を理解することが重要です。コマンドラインオプションの優先順位が高くなり、インベントリファイルとansible.cfg
がそれに続きます 構成ファイル。
AnsibleでのSSHパスワードベースの認証
タスクを実行すると、ansibleはコントローラーノードの現在のユーザーを使用して、SSHを介して管理対象ノードと通信します。シェルモジュールを使用して、「whoami
」を実行できます "管理対象ノードのユーザー名を確認するコマンド。私の場合、ユーザー名は" vagrant " 。放浪者のユーザーは、前のセクションで設定したキーを使用して認証しています。
$ whoami
vagrant
$ ansible all -m shell -a "whoami" managed2 | CHANGED | rc=0 >> vagrant managed1 | CHANGED | rc=0 >> vagrant
別のユーザーとして管理対象ノードに接続する場合は、--u
を使用できます。 または--user
フラグを立て、引数としてユーザー名を渡します。下の画像を見ると、SSHキーが設定されておらず、管理対象ノードにキーが配布されていないため、接続に失敗しているユーザー「karthick」を使用しようとしています。
$ ansible all -m shell -a "whoami" -u karthick
$ ansible all -m shell -a "whoami" --user karthick
パスワードベースの認証を使用するには、-k
を使用できます または--ask-pass
国旗。ユーザー(karthick)のSSHパスワードを入力するように求められます。パスワードがユーザーのすべてのノードで同じであることを確認してください。
$ ansible all -m shell -a "whoami" -u karthick -k
$ ansible all -m shell -a "whoami" -u karthick --ask-pass
パスワードをファイルに保存し、ファイル名を引数として--connection-password-file
に渡すこともできます。 または--conn-pass-file
国旗。パスワードをプレーンテキストファイルに保存しているため、これは推奨される方法ではありません。 Ansible Vaultを使用してパスワードファイルを暗号化できますが、これは別のトピックです。
$ ansible all -m shell -a "whoami" -u karthick --connection-password-file pass.txt
$ ansible all -m shell -a "whoami" -u karthick --conn-pass-file pass.txt
ユーザー名とパスワードをインベントリファイルのパラメータとして渡すこともできます。繰り返しますが、これはパスワードを保存するための最良の方法ではありません。以下は、インベントリファイルの設定方法です。
[ubuntu1] managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key ansible_user=vagrant [ubuntu2] managed2 ansible_user=karthick ansible_ssh_pass=password
$ ansible all -m shell -a "whoami" -u karthick managed1 | CHANGED | rc=0 >> vagrant managed2 | CHANGED | rc=0 >> karthick
ヘッズアップ: アドホックコマンドを使用して例を実行している可能性がありますが、同じフラグがプレイブックにも適用されます。
Ansibleでの特権昇格
タスクを正常に実行するには、昇格された特権(root)が必要な場合があります。たとえば、パッケージ管理。パッケージのインストール、削除、またはアップグレードは、root
としてのみ可能です。 ユーザーまたはsudo
特権。
ansibleまたはansible-playbookと一緒にヘルプフラグを実行すると、画像に示すように特権昇格セクションが表示されます。
$ ansible --help
$ ansible-playbook --help
root
を使用してタスクを実行する場合 特権、-b
を使用する必要があります または--become
フラグ。
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -b managed1 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": true, "name": "sshd", "state": "started",
デフォルトでは、sudo
特権昇格方法として使用されます。 --become-method
を設定することで、メソッドを変更できます 国旗。次のコマンドを実行すると、サポートされているメソッドのリストを取得できます。
$ ansible-doc -t become -l ansible.netcommon.enable Switch to elevated permissions on a network device community.general.doas Do As user community.general.dzdo Centrify's Direct Authorize community.general.ksu Kerberos substitute user community.general.machinectl Systemd's machinectl privilege escalation community.general.pbrun PowerBroker run community.general.pfexec profile based execution community.general.pmrun Privilege Manager run community.general.sesu CA Privileged Access Manager community.general.sudosu Run tasks using sudo su - runas Run As user su Substitute User sudo Substitute User DO
sudo
を与える場合と与えない場合があります ユーザーの設定方法に応じた管理対象ノードのパスワード。私の場合、ユーザーを vagrantに設定しました sudo
を実行するには パスワードの入力を求めずに。
sudo
の場合 ユーザーが機能するにはパスワードが必要です。その場合は、-K
を使用する必要があります または--ask-become-pass
sudo
の入力を求めるフラグ パスワード。
以下のエラーからわかるように、sudo
を指定せずに実行しようとすると ユーザー「karthick」のパスワード、「sudoパスワードがありません」というエラーが表示されます 。
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b SSH password: managed1 | FAILED! => { "msg": "Missing sudo password" }
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b -K
Sudoパスワードはファイルに保存して、引数として--become-password-file
に渡すことができます。 または--become-pass-file
国旗。 Ansibleボールトを使用してこのファイルを暗号化できますが、推奨される方法ではありません。
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b --become-password-file pass.txt $ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b --become-pass-file pass.txt
「なる」を含めることもできます タスクレベルまたはプレイレベルでのプレイブックのディレクティブ。
下の画像は、「になる」の様子を表しています。 ディレクティブは再生レベルで使用されます 。
下の画像は、「になる」の様子を表しています。 ディレクティブはタスクレベルで使用されます 。
出力からわかるように、ssh
managed1でサービスが正常に再起動されます ノード。
$ ansible-playbook restart_service.yml PLAY [Restart SSHD service] *************************************************************************** TASK [Restart SSHD in managed1.anslab.com] ************************************************************ changed: [managed1] PLAY RECAP ******************************************************************************************** managed1 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
「become」ディレクティブは、 ansible.cfgでも設定できます。 構成ファイルとインベントリファイル。ただし、ハンドブックでディレクティブを設定することをお勧めします。 ansible.cfg
のさまざまなパラメーターを取得できます 以下のリンクからファイルしてください。
- ディレクティブになる
管理対象ノードに接続した後、別のユーザーとしてタスクを実行する場合は、--become-user
を使用する必要があります。 国旗。デフォルトでは、root
に設定されています ユーザー。
結論
この記事では、キーベースの認証とパスワード認証がAnsibleでどのように機能するか、および認証でサポートされているさまざまなフラグについて説明しました。また、Ansibleで特権昇格がどのように機能するかを見てきました。
深く掘り下げるには、さまざまな特権昇格方法がどのように機能するかを公正に理解し、ニーズに応じてセキュリティを損なうことなく環境を設定する必要があります。
次を読む:
- Ansibleアドホックコマンドの使用を開始する