インベントリーファイルを作る
Ansible で制御したいホストは、インベントリーファイル (inventory file) に列挙しておく必要があります。
これは、想定外のホストを操作してしまうのを防ぐための安全策です。
デフォルトでは、インベントーリファイルとして /etc/ansible/hosts
というファイルが読み込まれます。
コマンドラインオプション (-i
) などで、読み込むファイルを指定する こともできます。
インベントリーファイル内では、上記のように「ホスト名」や「IP アドレス」で制御対象のホスト (managed node) を列挙します。
ここでは、3 つのホストを Ansible のコマンド(ansible
や ansible-playbook
)で制御できるようにしています。
localhost
以外のホストは、SSH で接続できる状態になっている必要があります(参考: SSH 関連記事)。
ansible コマンドで ping モジュールを実行してみる
最初のステップとして、ansible
コマンドで ping
モジュールを実行してみます。
ping
モジュールは Ansible の組み込みモジュールとして提供されており、ターゲットホストへの接続確認のために使われます。
いわゆる Linux の ping
コマンド (ICMP ping) ではないことに注意してください。
準備として、次のようなインベントリーファイル (hosts.ini
) をカレントディレクトリに作成しておきます。
ローカルホストを制御する
まずは、localhost
に対して(自分自身を制御対象として)、ping
モジュールを実行してみます。
ansible
コマンドを実行するときは、第 1 パラメータで制御対象とするホスト名を指定します。
前述の通り、指定するホスト名はインベントリーファイル内に列挙されているものの中から選びます。
次のように実行して SUCCESS 表示が出れば成功です(python
コマンドのパスに関する警告が出るかもしれませんが、ひとまず無視しておいて大丈夫です)。
ansible
コマンドの各オプションは次のような意味を持っています。
-i hosts.ini
… インベントリーファイルとして、カレントディレクトリのhosts.ini
を使用します。-m ping
… 組み込みのping
モジュールを使用してタスクを実行します。-c local
… ローカルホストを制御対象とするときはこのオプションを指定します。Ansible はデフォルトで SSH 接続しようとするので、その振る舞いを抑制するためのオプションです。
イベントリーファイル内で、ホスト名 (localhost
) の後ろに ansible_connection=local
と記述しておくと、ansible
コマンド実行時の -c local
オプションの指定を省略できます。
ちなみに、このようにホスト名の後ろに指定したもの「ホスト変数」と呼びます。
インベントリーファイルに定義されていないホスト名を指定すると、ansible
コマンドは次のような警告メッセージを出力して終了します。
SSH 経由で制御する
次に、SSH で接続可能なターゲットホストに対して ping
モジュールを実行してみます。
あらかじめターゲットホストには SSH 鍵による接続ができることを確認しておいてください。
パスワード認証でも Ansible による制御は可能ですが、追加で sshpass
パッケージをインストールするなどの対応が必要になります。
SSH 鍵による公開鍵認証方式で接続できるようになっていれば、次のように ansible
コマンドで制御できるはずです。
SSH での接続ユーザー名は maku
だと仮定しています。
上の例では、接続ユーザー名を -u
オプションで指定していますが、インベントリーファイルの中で次のようにユーザー名を設定しておくこともできます。
これらのホスト変数設定により、ansible
コマンド実行時にはほとんどのオプションを省略できます。
$ ansible localhost -m ping
$ ansible 192.168.1.20 -m ping
すべてのターゲットホストをまとめて制御する
ansible
コマンドの第 1 引数(ターゲット名)として all
を指定すると、インベントリーファイルに記述したすべてのターゲットホストを一度に制御することができます。
$ ansible all -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Enter passphrase for key '/Users/maku/.ssh/id_rsa': (SSH鍵のパスワードを入力)
192.168.1.20 | SUCCESS => {
"changed": false,
"ping": "pong"
}
接続方法 (local or ssh) や接続ユーザー名は、インベントリーファイルなどで指定しておく必要があります。
トラブルシューティング: Python interpreter の警告が出る場合
Ansible のバージョンによっては、ansible
コマンドの実行時に次のような警告が出ることがあります。
[WARNING]: Platform darwin on host localhost is using the discovered Python interpreter at /Library/Frameworks/Python.framework/Versions/3.10/bin/python3.10, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.12/reference_appendices/interpreter_discovery.html for more information.
これは、ターゲットホスト上の Python 実行環境としてどれを使えばよいか判別できないということを示しています。 Ansible の設定ファイル に次のような感じで Python の実行ファイルパスを指定すれば警告は消えます。