前回の記事では、ansibleインベントリと構成ファイルとは何かについて説明しました。 これは、ansibleを学ぶための基礎を築きます。この記事では、いくつかの例を使用して、ansibleアドホックコマンドについて説明します。
はじめに
Ansible Ad hocコマンドは、クイックタスクや頻繁に繰り返されないタスクを実行する場合に最適です。通常、これらのアドホックコマンドは、ターミナルから直接実行することも、シェルスクリプトから実行することもできるワンライナーコマンドです。
アドホックコマンドの操作方法を理解する前に、べき等とは何かを理解する必要があります。 Ansibleはべき等です 本質的には、オブジェクトの状態がすでに変更されている場合に同じタスクを実行する回数に関係なく、ansibleはそのオブジェクトに同じ変更を再度加えようとはしません。
アドホックコマンドは、/usr/bin/ansible
を介して送信されます プログラム。次のコマンドを実行して、ansibleコマンドでサポートされているオプションのリストを取得できます。
$ ansible --help
練習するansibleラボがない場合は、手動でansibleを設定する方法と、VagrantとVirtualboxを使用する方法に関するガイドをご覧ください。
- LinuxでのAnsibleのインストールと構成
- LinuxでのVagrantとVirtualboxによる自動化されたAnsibleラボのセットアップ
ターゲットを知る
アドホックコマンドを使用したり、プレイブックを作成したりする前に、ビジネス要件と使用するターゲット環境について明確に理解しておく必要があります。
ターゲット環境は、サーバー、ネットワークデバイス、コンテナー、クラウドソリューションなど、ansibleがサポートするものであれば何でもかまいません。ここでは、Ubuntu20.04を実行している2つの管理対象ノードを使用しています。
次のコマンドを実行して、アドホックコマンドまたはプレイブックを実行するときに使用されるホストのリストを確認できます。
#SYNTAX $ ansible --list-hosts
グループ名はデフォルトにすることができます (すべて 、グループ化されていない )またはユーザー定義グループ 。
グループについて詳しく知りたい場合は、次のリンクを参照してください。
- Ansibleインベントリおよび構成ファイル
すべてのグループのホストのリストを取得します。
$ ansible all --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
ユーザー定義グループのホストのリストを取得します。ここで私のグループ名はubuntu 。
$ ansible ubuntu --list-hosts hosts (2): managed1.anslab.com managed2.anslab.com
インベントリファイル
インベントリファイルは、管理対象ノードのリストを保持します。インベントリファイルの場所は、ansible.cfg
で構成されます ファイル。 -i
を使用して、インベントリファイルの場所を上書きできます または--inventory
アドホックコマンドを実行するときにフラグを立てます。
2つのインベントリファイルがあり、デフォルトのファイルの名前はhostsです。 host2ファイルを使用するには、-i
を使用する必要があります フラグを立てて、ファイルを引数として渡します。
$ ansible all -i host2 --list-hosts hosts (1): managed2.anslab.com
ヘッズアップ: インベントリファイルが別の場所にある場合は、絶対パスを指定する必要があります。次のリンクを参照して、インベントリファイルの優先順位を確認できます。
- Ansibleインベントリおよび構成ファイル
Ansibleモジュール
Ansibleはバッテリーに含まれるツールであり、大量のモジュールが同梱されています。モジュールは、 Pythonで記述されたプログラムです。 これは、タスクを実行するために管理対象ノードで実行するためにansibleによって使用されます。 Ansibleはプラグアンドプレイアプローチに従います。つまり、独自のモジュールを作成して、ansibleで実行できます。
Ansibleは、オープンソースコミュニティやさまざまな製品ベンダーによって作成された多くのパッケージをサポートしています。マシンにインストールされているすべてのモジュールのリストを取得するには、次のコマンドを実行します。
$ ansible-doc -l # LIST ALL MODULES AVAILABLE $ ansible-doc -l | grep -i -w ^apt # GREP PARTICULAR MODULE(APT) MODULE
モジュールのドキュメントを表示するには、次のコマンドを実行できます。ここでは、Debian/Ubuntuベースのディストリビューションのパッケージマネージャーモジュールであるaptモジュールのドキュメントを表示しています。
$ ansible-doc apt
以下の画像は、ansibleaptモジュールのドキュメントを示しています。

アドホックコマンド構文
アドホックコマンドを実行するときに提供する必要のある入力がいくつかあります。
- ターゲット(管理対象ノード)を指定する必要があります。デフォルトの「すべて/グループ化されていない」グループまたはユーザー定義のグループのいずれかを使用できます。
- モジュール名を引数として
-m
に渡す必要があります フラグ。 - すべてのモジュールは一連のオプションを受け入れます。これらのオプションは、引数として-aフラグに渡す必要があります。複数のオプションがある場合は、引用符で囲む必要があります。
$ ansible [group] -m [module] -a [module arguments]
前のセクションで見た他の引数をアドホックコマンドに組み合わせることができます。
Pingモジュールを使用して接続を確認する
ansibleを設定した後に実行する最初のモジュールは、「ping」です。 モジュール。 pingモジュールは、コントローラーおよび管理対象ノードとの接続に問題がないかどうかを確認するために使用されます。接続が成功すると、 "ping:pong"として応答が返されます。 。
$ ansible all -m ping

-o
を使用して出力を凝縮することもできます フラグ。
$ ansible all -m ping -o

シェルモジュールを介してコマンドを実行する
シェルモジュール ターミナル上で実行できるコマンドを実行するために使用されます。 Linux端末でコマンドを実行するようなものです。
-a
を使用する必要があります フラグを立てて、コマンドを引数としてシェルモジュールに渡します。
$ ansible all -m shell -a "arguments"
以下は、ansibleシェルモジュールで実行したコマンドの一部です。
$ ansible all -m shell -a "echo $USER"
$ ansible all -m shell -a "uptime"
$ ansible all -m shell -a "cat /etc/os-release | grep -i PRETTY_NAME"
$ ansible all -m shell -a "touch /tmp/abc.txt"
$ ansible all -m shell -a "ls -l /tmp/abc.txt"

シェルモジュールの代わりに、ansibleのデフォルトモジュールであるコマンドモジュールを使用することもできます。 -a
を直接使用できます コマンドモジュールはデフォルトのモジュールであるため、フラグを立ててコマンドを引数として渡します。
$ ansible all -m command -a "uptime" # EXCLUSIVELY PASSING COMMAND MODULE $ ansible all -a "uptime" # NOT USING -m TO PASS MODULE

シェルとコマンドモジュールの違いは、コマンドモジュールを使用すると、いくつかの特別な変数にアクセスでき、パイプ、リダイレクト、および論理AND演算子を使用できないことです。
次のコマンドを実行すると、エラーが発生します。
$ ansible all -m command -a "test -f /etc/hosts && echo 'hosts file present'"
シェルモジュールを介して同じコマンドを実行でき、正常に実行されます。
$ ansible all -m shell -a "test -f /etc/hosts && echo 'hosts file present'"

スクリプトモジュールを介してスクリプトを実行する
スクリプト(Python、シェルなど)を実行する場合は、スクリプトモジュールを使用して、コントローラーマシンからすべての管理対象ノードにスクリプトをコピーしてからスクリプトを実行できます。
/tmp
に次のPythonコードがあります ディレクトリ。
import sys,os print("CURRENT PYTHON VERSION = ", sys.version_info) print("HOSTNAME = ", os.uname()[1]) print("CURRENT DIRECTORY = ", os.getcwd())
次のコマンドを実行して、スクリプトモジュールを使用してスクリプトを実行します。スクリプトモジュールは、スクリプトの実行方法に応じて、追加の引数をサポートします。私の場合、Pythonスクリプトを実行しているので、追加の引数 "executable =python3"を渡そうとしています。 スクリプトパスとともに。
$ ansible all -m script -a "/tmp/get_host_details.py executable=python3"

パッケージ管理モジュール
dnf
のようなOSパッケージマネージャーと連携するモジュールがあります 、apt
、pacman
、など。ここではapt
を使用しています 私はUbuntuを実行しているので。ただし、構文は、パラメーターが異なるすべてのパッケージマネージャーで同じになります。詳細については、それぞれのドキュメントをご覧ください。
パッケージをインストールするには、次のコマンドを実行して、状態を "present"に設定します。 。 -b
を選択する必要があります または-become
sudo
でモジュールを実行するためのフラグ 管理対象ノードの特権。 sudoユーザーのパスワードを設定している場合は、-K
を渡す必要があります -b
と一緒に になるを求めるフラグ パスワード。
$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=present" -b -K

特権の昇格がどのように機能するかについては、以下のリンクを使用して記事をご覧ください。
- AnsibleSSH認証と特権昇格
パッケージを削除するには、次のコマンドを実行して、状態を "absent"に設定します。 。
$ ansible all -m apt -a "name=cowsay,vim,cmatrix state=absent" -b -K

これまで、さまざまなタスクにさまざまなモジュールを使用する方法を示してきました。これにより、アドホックコマンドを実行したときにどのように機能するかを十分に理解できた可能性があります。
他にもたくさんのモジュールがあり、この記事ではすべてを説明するのに十分ではありません。したがって、ユースケースに応じてモジュールを選択し、アドホックコマンドを使用して練習を開始することをお勧めします。
出力色
アドホックコマンドを実行すると、3つの異なる色で出力が表示されるはずです。それぞれの色には意味があります。
RED - Failure YELLOW - Success With Changes happened GREEN - Success but no changes happened
赤-失敗
タスクが失敗した場合は、赤色で印刷されます。

YELLOW-変更による成功
状態が変化するように設定されている場合、出力は黄色になります。

緑-成功だが変化なし
オブジェクトの状態が変更されていない場合、出力は緑色になります。

結論
この記事では、アドホックコマンドとは何か、およびAnsibleでアドホックコマンドを使用する方法について説明しました。初心者の場合、アドホックコマンドを使用すると、ansibleがモジュールを使用してタスクを実行する方法をよく理解できます。次のレベルでは、YAML形式でプレイブックを書き始めます。これについては、別の記事で詳しく説明します。
次を読む:
- Ansibleプレイブックの操作
リソース:
- https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html
- https://www.redhat.com/sysadmin/ansible-ad-hoc-commands