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ホストに次のものがあることを確認してください。
- AnsibleコントロールノードのSSH公開鍵がに追加されました
authorized_keys
システムユーザーの。 このユーザーは、rootまたはsudo権限を持つ通常のユーザーのいずれかです。 これを設定するには、 Ubuntu20.04でSSHキーを設定する方法のステップ2に従います。
- AnsibleコントロールノードのSSH公開鍵がに追加されました
- Ansibleコントロールノードに設定されたインベントリファイル。 すべてのAnsibleホストを含む有効なインベントリファイルがあることを確認してください。 これを設定するには、AnsibleInventoryの設定方法のガイドを参照してください。 次に、 Ansibleホストへの接続のテストで概説されている接続テストを実行して、ノードに接続できることを確認します。
Ansibleホストへの接続のテスト
次のコマンドは、AnsibleコントロールノードとすべてのAnsibleホスト間の接続をテストします。 このコマンドは、現在のシステムユーザーとそれに対応するSSHキーをリモートログインとして使用し、 -m
Ansibleに実行するように指示するオプション ping
モジュール。 また、 -i
フラグ。指定されたリストにリストされているホストにpingを実行するようにAnsibleに指示します inventory
ファイル
- 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によって割り当てられたデフォルト値と異なる場合に、それらを自動的に設定できます。 そうすれば、コマンドラインでこれらのパラメーターを指定する必要はありません。
次のインベントリファイルの例では、 ansible_user
のみの変数 server1
サーバ:
server1 ansible_host=203.0.113.111 ansible_user=sammy
server2 ansible_host=203.0.113.112
Ansibleは、接続時にデフォルトのリモートユーザーとしてsammyを使用するようになりました。 server1
サーバ。
カスタムSSHキーを設定するには、 ansible_ssh_private_key_file
次のように変数:
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
. 複数のサーバーに同じ設定を使用する場合は、そのために子グループを使用できます。
[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
この設定例では、にリストされているサーバーに接続する場合にのみ、カスタムユーザーとSSHキーを割り当てます。 group_a
.
コマンド実行のターゲットの定義
Ansibleでアドホックコマンドを実行する場合、個々のホストだけでなく、グループ、ホスト、サブグループの任意の組み合わせをターゲットにすることができます。 たとえば、これは、という名前のグループ内のすべてのホストの接続を確認する方法です。 servers
:
- ansible servers -i inventory -m ping
複数のホストとグループをコロンで区切って指定することもできます。
- ansible server1:server2:dbservers -i inventory -m ping
パターンに例外を含めるには、エスケープ文字を前に付けた感嘆符を使用します \
、 次のように。 このコマンドは、からのすべてのサーバーで実行されます group1
、 を除外する server2
:
- ansible group1:\!server2 -i inventory -m ping
両方の一部であるサーバーでのみコマンドを実行したい場合 group1
と group2
たとえば、次を使用する必要があります &
代わりは。 接頭辞として \
エスケープ文字:
- ansible group1:\&group2 -i inventory -m ping
コマンド実行のターゲットを定義するときにパターンを使用する方法の詳細については、Ansibleインベントリの設定方法に関するガイドのステップ5を参照してください。
Ansibleモジュールの実行
Ansibleモジュールは、プレイブックやコマンドラインから呼び出すことができるコードの一部であり、リモートノードでのプロシージャの実行を容易にします。 例には、 apt
Ubuntuでシステムパッケージを管理するために使用されるモジュール、および user
モジュール、システムユーザーの管理に使用されます。 The 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
Nginxのエラーログから最新のログメッセージを次の名前のサーバーに出力するコマンド server1
から inventory
、を含める必要があります --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
モジュール。
次のコマンドは、という名前のファイルのアクセス許可を調整します file.txt
にあります /var/www
リモートホスト上。 ファイルの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権限を持っていることを確認し、 --become
Ansibleの特権昇格システムを使用するオプション。 使用する -K
を提供するように求められます sudo
接続しているユーザーのパスワード。
再起動するには nginx
と呼ばれるグループ内のすべてのホストのサービス webservers
たとえば、次のように実行します。
- ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become -K
サーバーの再起動
Ansibleにはサーバーを再起動するための専用モジュールはありませんが、bashコマンドを発行してサーバーを呼び出すことができます。 /sbin/reboot
リモートホストのコマンド。
サーバーを再起動するには拡張システム権限が必要になるため、リモートユーザーがsudo権限を持っていることを確認し、 --become
Ansibleの特権昇格システムを使用するオプション。 使用する -K
を提供するように求められます sudo
接続しているユーザーのパスワード。
警告:次のコマンドは、Ansibleの対象となるサーバーを完全に再起動します。 これにより、これらのサーバーに依存するアプリケーションが一時的に中断する可能性があります。
内のすべてのサーバーを再起動するには webservers
たとえば、グループは次のように実行します。
- ansible webservers -i inventory -a "/sbin/reboot" --become -K
リモートノードに関する情報の収集
The 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
}
ディスク使用量を確認したい場合は、Bashコマンドを実行して df
次のようなユーティリティ:
- 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の公式ドキュメントを確認できます。