インベントリーファイルを作る
Ansible で制御したいホストは、インベントリーファイル (inventory file) に列挙しておく必要があります。
これは、想定外のホストを操作してしまうのを防ぐための安全策です。
デフォルトでは、インベントーリファイルとして /etc/ansible/hosts
というファイルが読み込まれます。
コマンドラインオプション (-i
) などで、読み込むファイルを指定する こともできます。
localhost
192.168.1.20
host.example.com
インベントリーファイル内では、上記のように「ホスト名」や「IP アドレス」で制御対象のホスト (managed node) を列挙します。
ここでは、3 つのホストを Ansible のコマンド(ansible
や ansible-playbook
)で制御できるようにしています。
localhost
以外のホストは、SSH で接続できる状態になっている必要があります。
ansible コマンドで ping モジュールを実行してみる
インベントリーファイルを用意したら、まずは制御対象のホストに ping
を実行してみます。
ping
は Ansible の組み込みモジュールとして提供されており、ターゲットホストへの接続確認のために使われます。
いわゆる Linux の ping
コマンド (ICMP ping) ではないことに注意してください。
ローカルホストを制御する
まずは、localhost
に対して(自分自身を制御対象として)、ping
を実行してみます。
制御対象とするホスト名は、ansible
コマンドの第 1 パラメータで指定します。
次のように SUCCESS 表示が出れば成功です。
$ ansible localhost -c local -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ansible はデフォルトで SSH 接続しようとするので、ローカルホストを制御対象とするときは -c local
オプションを指定します。
-m ping
オプションは、ping モジュールを使用してタスクを実行することを示しています。
イベントリーファイルで、ホスト変数として ansible_connection=local
を指定しておくと、ansible
コマンド実行時の -c local
の指定を省略できます。
localhost ansible_connection=local
192.168.1.20
インベントリーファイルに定義されていないホスト名を指定すると、ansible
コマンドは次のような警告メッセージを出力して終了します。
$ ansible unknown-host -m ping
[WARNING]: Could not match supplied host pattern, ignoring: unknown-host
[WARNING]: No hosts matched, nothing to do
SSH 経由で制御する
次に、SSH で接続可能なターゲットホストに対して ping
モジュールを実行してみます。
あらかじめターゲットホストには SSH 鍵による接続ができることを確認しておいてください。
パスワード認証でも Ansible による制御は可能ですが、追加で sshpass
パッケージをインストールするなどの対応が必要になります。
SSH 鍵による公開鍵認証方式で接続できるようになっていれば、次のように ansible
コマンドで制御できるはずです。
SSH での接続ユーザー名は maku
だと仮定しています。
$ ansible 192.168.1.20 -u maku -m ping
Enter passphrase for key '/Users/maku/.ssh/id_rsa': (SSH鍵のパスワードを入力)
192.168.1.20 | SUCCESS => {
"changed": false,
"ping": "pong"
}
上の例では、接続ユーザー名を -u
オプションで指定していますが、インベントリーファイルの中で次のようにユーザー名を設定しておくこともできます。
localhost ansible_connection=local
192.168.1.20 ansible_ssh_user=maku
これらのホスト変数設定により、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) や接続ユーザー名は、インベントリーファイルなどで指定しておく必要があります。
localhost ansible_connection=local
192.168.1.20 ansible_ssh_user=maku
トラブルシューティング: 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 の実行ファイルパスを指定すれば警告は消えます。
[defaults]
interpreter_python = /usr/bin/python3
# 次のようにパスを自動解決させることもできます
# interpreter_python = auto_silent