Ansibleアドホックコマンドを使用して複数のサーバーを管理する方法

提供:Dev Guides
移動先:案内検索

序章

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

たとえば、group1group2の両方の一部であるサーバーでのみコマンドを実行する場合は、代わりに&を使用する必要があります。 \エスケープ文字をプレフィックスとして付けることを忘れないでください。

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モジュールを使用して、パッケージtreeserver1にインストールします。

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コマンドを実行して、inventoryserver1という名前のサーバーで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という名前のファイルのアクセス許可を調整します。 ファイルのumask600に設定します。これにより、現在のファイル所有者に対してのみ読み取りおよび書き込み権限が有効になります。 さらに、そのファイルの所有権を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の公式ドキュメントを確認できます。