Ansibleアドホックコマンドを使用して複数のサーバーを管理する方法
序章
Ansibleは、リモートサーバーのセットアップと保守のタスクを容易にする最新の構成管理ツールです。 ユーザーを迅速に稼働させることを目的としたミニマリスト設計により、プレイブックまたはアドホックコマンドを使用して中央の場所から1〜数百のシステムを制御できます。
再利用可能なタスクのコレクションで構成されるプレイブックとは異なり、アドホックコマンドは、サービスの再起動やAnsibleが管理するリモートシステムに関する情報の取得など、頻繁に実行しないタスクです。
このチートシートガイドでは、Ansibleアドホックコマンドを使用して、パッケージのインストール、ファイルのコピー、1つ以上のリモートサーバーでのサービスの再起動などの一般的なタスクをAnsibleコントロールノードから実行する方法を学習します。
前提条件
このガイドに従うには、次のものが必要です。
- 1つのAnsibleコントロールノード。 このガイドでは、コントロールノードがAnsibleがインストールされ、SSHキーを使用してAnsibleホストに接続するように構成されたUbuntu20.04マシンであると想定しています。 サーバーの初期設定ガイドで説明されているように、コントロールノードにsudo権限とファイアウォールが有効になっている通常のユーザーがいることを確認してください。 Ansibleをセットアップするには、 Ubuntu20.04にAnsibleをインストールして構成する方法に関するガイドに従ってください。
- 2つ以上のAnsibleホスト。 Ansibleホストは、Ansibleコントロールノードが自動化するように構成されている任意のマシンです。 このガイドでは、AnsibleホストがリモートUbuntu20.04サーバーであることを前提としています。 各Ansibleホストに次のものがあることを確認してください。 システムユーザーのauthorized_keysに追加されたAnsibleコントロールノードのSSH公開鍵。 このユーザーは、rootまたはsudo権限を持つ通常のユーザーのいずれかです。 これを設定するには、Ubuntu20.04でSSHキーを設定する方法のステップ2に従います。
- Ansibleコントロールノードに設定されたインベントリファイル。 すべてのAnsibleホストを含む有効なインベントリファイルがあることを確認してください。 これを設定するには、AnsibleInventoryの設定方法のガイドを参照してください。 次に、 Ansibleホストへの接続のテストで概説されている接続テストを実行して、ノードに接続できることを確認します。
Ansibleホストへの接続のテスト
次のコマンドは、AnsibleコントロールノードとすべてのAnsibleホスト間の接続をテストします。 このコマンドは、現在のシステムユーザーとそれに対応するSSHキーをリモートログインとして使用し、Ansibleにping
モジュールを実行するように指示する-m
オプションを含みます。 また、-i
フラグを備えており、指定されたinventory
ファイルにリストされているホストにpingを実行するようにAnsibleに指示します。
ansible all -i inventory -m ping
SSH経由でこれらのサーバーに接続するのが初めての場合は、Ansible経由で接続しているホストの信頼性を確認するように求められます。 プロンプトが表示されたら、yes
と入力し、ENTER
を押して確認します。
次のような出力が得られるはずです。
Outputserver1 | SUCCESS => { "changed": false, "ping": "pong" } server2 | SUCCESS => { "changed": false, "ping": "pong" }
ホストから"pong"
の応答が返ってきたら、接続がライブであり、そのサーバーでAnsibleコマンドを実行する準備ができていることを意味します。
接続オプションの調整
デフォルトでは、Ansibleは、対応するSSHキーペアを使用して、現在のシステムユーザーと同じ名前のリモートユーザーとしてノードに接続しようとします。
別のリモートユーザーとして接続するには、-u
フラグと目的のユーザーの名前を指定してコマンドを追加します。
ansible all -i inventory -m ping -u sammy
カスタムSSHキーを使用してリモートサーバーに接続している場合は、実行時に--private-key
オプションを使用して提供できます。
ansible all -i inventory -m ping --private-key=~/.ssh/custom_id
注:ノードへの接続方法の詳細については、 Ansibleの使用方法ガイドを参照してください。このガイドには、より多くの接続オプションが示されています。
適切なオプションを使用して接続できるようになったら、インベントリファイルを調整して、リモートユーザーと秘密鍵がAnsibleによって割り当てられたデフォルト値と異なる場合に、それらを自動的に設定できます。 そうすれば、コマンドラインでこれらのパラメーターを指定する必要はありません。
次のインベントリファイルの例では、server1
サーバーに対してのみansible_user
変数を設定します。
〜/ ansible / Inventory
server1 ansible_host=203.0.113.111 ansible_user=sammy server2 ansible_host=203.0.113.112
Ansibleは、server1
サーバーに接続するときに、デフォルトのリモートユーザーとしてsammyを使用するようになりました。
カスタムSSHキーを設定するには、次のようにansible_ssh_private_key_file
変数を含めます。
〜/ ansible / Inventory
server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id server2 ansible_host=203.0.113.112
どちらの場合も、server1
に対してのみカスタム値を設定しました。 複数のサーバーに同じ設定を使用する場合は、そのために子グループを使用できます。
〜/ ansible / Inventory
[group_a] 203.0.113.111 203.0.113.112 [group_b] 203.0.113.113 [group_a:vars] ansible_user=sammy ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id
この設定例では、group_a
にリストされているサーバーに接続するためにのみカスタムユーザーとSSHキーを割り当てます。
コマンド実行のターゲットの定義
Ansibleでアドホックコマンドを実行する場合、個々のホストだけでなく、グループ、ホスト、サブグループの任意の組み合わせをターゲットにすることができます。 たとえば、これはservers
という名前のグループ内のすべてのホストの接続を確認する方法です。
ansible servers -i inventory -m ping
複数のホストとグループをコロンで区切って指定することもできます。
ansible server1:server2:dbservers -i inventory -m ping
パターンに例外を含めるには、次のように、エスケープ文字\
で始まる感嘆符を使用します。 このコマンドは、server2
を除く、group1
のすべてのサーバーで実行されます。
ansible group1:\!server2 -i inventory -m ping
たとえば、group1
とgroup2
の両方の一部であるサーバーでのみコマンドを実行する場合は、代わりに&
を使用する必要があります。 \
エスケープ文字をプレフィックスとして付けることを忘れないでください。
ansible group1:\&group2 -i inventory -m ping
コマンド実行のターゲットを定義するときにパターンを使用する方法の詳細については、Ansibleインベントリの設定方法に関するガイドのステップ5を参照してください。
Ansibleモジュールの実行
Ansibleモジュールは、プレイブックやコマンドラインから呼び出すことができるコードの一部であり、リモートノードでのプロシージャの実行を容易にします。 例としては、Ubuntuでシステムパッケージを管理するために使用されるapt
モジュールや、システムユーザーを管理するために使用されるuser
モジュールがあります。 このガイド全体で使用されるping
コマンドもモジュールであり、通常、制御ノードからホストへの接続をテストするために使用されます。
Ansibleには、組み込みモジュールの広範なコレクションが付属しています。一部のモジュールでは、完全な機能を提供するために追加のソフトウェアをインストールする必要があります。 選択した言語を使用して、独自のカスタムモジュールを作成することもできます。
引数を指定してモジュールを実行するには、-a
フラグの後に、次のように適切なオプションを二重引用符で囲んで含めます。
ansible target -i inventory -m module -a "module options"
例として、これはapt
モジュールを使用して、パッケージtree
をserver1
にインストールします。
ansible server1 -i inventory -m apt -a "name=tree"
Bashコマンドの実行
-m
オプションでモジュールが提供されていない場合、デフォルトでコマンドモジュールを使用して、リモートサーバーで指定されたコマンドを実行します。
これにより、接続しているユーザーに十分な権限があり、対話型のプロンプトがない限り、SSH端末を介して通常実行できるほぼすべてのコマンドを実行できます。
この例では、指定されたインベントリのすべてのサーバーでuptime
コマンドを実行します。
ansible all -i inventory -a "uptime"
Outputserver1 | CHANGED | rc=0 >> 14:12:18 up 55 days, 2:15, 1 user, load average: 0.03, 0.01, 0.00 server2 | CHANGED | rc=0 >> 14:12:19 up 10 days, 6:38, 1 user, load average: 0.01, 0.02, 0.00
sudo
でコマンドを実行するための特権昇格の使用
リモートホストで実行するコマンドまたはモジュールに拡張システム特権または別のシステムユーザーが必要な場合は、Ansibleの特権昇格モジュールbecomeを使用する必要があります。 このモジュールは、sudo
と、さまざまなオペレーティングシステムでAnsibleがサポートするその他の特権昇格ソフトウェアを抽象化したものです。
たとえば、tail
コマンドを実行して、inventory
のserver1
という名前のサーバーでNginxのエラーログから最新のログメッセージを出力する場合は、 --become
オプションは次のとおりです。
ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become
これは、現在のローカルシステムユーザーまたはインベントリファイル内に設定されているリモートユーザーを使用して、リモートホストでsudo tail /var/log/nginx/error.log
コマンドを実行するのと同じです。
sudo
などの特権昇格システムでは、多くの場合、ユーザーのパスワードの入力を求めるプロンプトを表示して、資格情報を確認する必要があります。 これにより、Ansibleはコマンドまたはプレイブックの実行に失敗します。 次に、--ask-become-pass
または-K
オプションを使用して、Ansibleにそのsudo
パスワードの入力を求めるプロンプトを表示できます。
ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become -K
パッケージのインストールと削除
次の例では、apt
モジュールを使用して、提供されたインベントリファイルからすべてのノードにnginx
パッケージをインストールします。
ansible all -i inventory -m apt -a "name=nginx" --become -K
パッケージを削除するには、state
引数を含め、absent
に設定します。
ansible all -i inventory -m apt -a "name=nginx state=absent" --become -K
ファイルのコピー
file
モジュールを使用すると、制御ノードと管理対象ノードの間で、どちらの方向にもファイルをコピーできます。 次のコマンドは、ローカルテキストファイルを、指定されたインベントリファイル内のすべてのリモートホストにコピーします。
ansible all -i inventory -m copy -a "src=./file.txt dest=~/myfile.txt"
リモートサーバーからコントロールノードにファイルをコピーするには、remote_src
オプションを含めます。
ansible all -i inventory -m copy -a "src=~/myfile.txt remote_src=yes dest=./file.txt"
ファイルのアクセス許可の変更
リモートノード上のファイルとディレクトリのアクセス許可を変更するには、file
モジュールを使用できます。
次のコマンドは、リモートホストの/var/www
にあるfile.txt
という名前のファイルのアクセス許可を調整します。 ファイルのumaskを600
に設定します。これにより、現在のファイル所有者に対してのみ読み取りおよび書き込み権限が有効になります。 さらに、そのファイルの所有権をsammy
というユーザーとグループに設定します。
ansible all -i inventory -m file -a "dest=/var/www/file.txt mode=600 owner=sammy group=sammy" --become -K
ファイルは通常root
が所有するディレクトリにあるため、そのプロパティを変更するにはsudo
権限が必要になる場合があります。 そのため、--become
および-K
オプションが含まれています。 これらはAnsibleの特権昇格システムを使用して拡張特権でコマンドを実行し、リモートユーザーにsudo
パスワードを入力するように求めます。
サービスの再開
service
モジュールを使用して、Ansibleによって管理されるリモートノードで実行されているサービスを管理できます。 これには拡張システム権限が必要になるため、リモートユーザーがsudo権限を持っていることを確認し、Ansibleの権限昇格システムを使用するための--become
オプションを含めてください。 -K
を使用すると、接続しているユーザーのsudo
パスワードを入力するように求められます。
たとえば、webservers
というグループ内のすべてのホストでnginx
サービスを再起動するには、次のコマンドを実行します。
ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become -K
サーバーの再起動
Ansibleにはサーバーを再起動するための専用モジュールはありませんが、リモートホストで/sbin/reboot
コマンドを呼び出すbashコマンドを発行できます。
サーバーを再起動するには拡張システム権限が必要になるため、リモートユーザーにsudo権限があることを確認し、Ansibleの権限昇格システムを使用するための--become
オプションを含めます。 -K
を使用すると、接続しているユーザーのsudo
パスワードを入力するように求められます。
警告:次のコマンドは、Ansibleの対象となるサーバーを完全に再起動します。 これにより、これらのサーバーに依存するアプリケーションが一時的に中断する可能性があります。
たとえば、webservers
グループ内のすべてのサーバーを再起動するには、次のコマンドを実行します。
ansible webservers -i inventory -a "/sbin/reboot" --become -K
リモートノードに関する情報の収集
setup
モジュールは、Ansibleによって管理されているリモートシステムに関する詳細情報を返します。これは、システムファクトとも呼ばれます。
server1
のシステムファクトを取得するには、次のコマンドを実行します。
ansible server1 -i inventory -m setup
これにより、リモートサーバー環境に関する詳細を含む大量のJSONデータが出力されます。 最も関連性の高い情報のみを出力するには、次のように"gather_subset=min"
引数を含めます。
ansible server1 -i inventory -m setup -a "gather_subset=min"
JSONの特定のアイテムのみを印刷するには、filter
引数を使用できます。 これは、 fnmatch と同様に、文字列の照合に使用されるワイルドカードパターンを受け入れます。 たとえば、ipv4とipv6の両方のネットワークインターフェイスに関する情報を取得するには、*ipv*
をフィルターとして使用できます。
ansible server1 -i inventory -m setup -a "filter=*ipv*"
Outputserver1 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "203.0.113.111", "10.0.0.1" ], "ansible_all_ipv6_addresses": [ "fe80::a4f5:16ff:fe75:e758" ], "ansible_default_ipv4": { "address": "203.0.113.111", "alias": "eth0", "broadcast": "203.0.113.111", "gateway": "203.0.113.1", "interface": "eth0", "macaddress": "a6:f5:16:75:e7:58", "mtu": 1500, "netmask": "255.255.240.0", "network": "203.0.113.0", "type": "ether" }, "ansible_default_ipv6": {} }, "changed": false }
ディスク使用量を確認したい場合は、次のようにdf
ユーティリティを呼び出してBashコマンドを実行できます。
ansible all -i inventory -a "df -h"
Output server1 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 798M 624K 798M 1% /run /dev/vda1 155G 2.3G 153G 2% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/vda15 105M 3.6M 101M 4% /boot/efi tmpfs 798M 0 798M 0% /run/user/0 server2 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on udev 2.0G 0 2.0G 0% /dev tmpfs 395M 608K 394M 1% /run /dev/vda1 78G 2.2G 76G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/vda15 105M 3.6M 101M 4% /boot/efi tmpfs 395M 0 395M 0% /run/user/0
結論
このガイドでは、Ansibleアドホックコマンドを使用してリモートサーバーを管理する方法を示しました。これには、サービスの再起動や、コントロールノードからAnsibleが管理するリモートサーバーへのファイルのコピーなどの一般的なタスクの実行方法も含まれます。 また、制限パラメータとフィルタリングパラメータを使用してリモートノードから情報を収集する方法についても説明しました。
追加のリソースとして、アドホックコマンドに関するAnsibleの公式ドキュメントを確認できます。