まくろぐ
更新:
作成:

インベントリーファイルを作る

Ansible で制御したいホストは、インベントリーファイル (inventory file) に列挙しておく必要があります。 これは、想定外のホストを操作してしまうのを防ぐための安全策です。 デフォルトでは、インベントーリファイルとして /etc/ansible/hosts というファイルが読み込まれます。 コマンドラインオプション (-i) などで、読み込むファイルを指定する こともできます。

/etc/ansible/hosts(記述例)
localhost
192.168.1.20
host.example.com

インベントリーファイル内では、上記のように「ホスト名」や「IP アドレス」で制御対象のホスト (managed node) を列挙します。 ここでは、3 つのホストを Ansible のコマンド(ansibleansible-playbook)で制御できるようにしています。 localhost 以外のホストは、SSH で接続できる状態になっている必要があります。

ansible コマンドで ping モジュールを実行してみる

インベントリーファイルを用意したら、まずは制御対象のホストに ping を実行してみます。 ping は Ansible の組み込みモジュールとして提供されており、ターゲットホストへの接続確認のために使われます。 いわゆる Linux の ping コマンド (ICMP ping) ではないことに注意してください。

ローカルホストを制御する

まずは、localhost に対して(自分自身を制御対象として)、ping を実行してみます。 制御対象とするホスト名は、ansible コマンドの第 1 パラメータで指定します。 次のように SUCCESS 表示が出れば成功です。

例: localhost に対して ping を実行
$ 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 の指定を省略できます。

/etc/ansible/hosts(接続方式をホスト変数で指定)
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 だと仮定しています。

例: SSH 接続で ping を実行
$ 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 オプションで指定していますが、インベントリーファイルの中で次のようにユーザー名を設定しておくこともできます。

/etc/ansible/hosts
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) や接続ユーザー名は、インベントリーファイルなどで指定しておく必要があります。

/etc/ansible/hosts
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 の実行ファイルパスを指定すれば警告は消えます。

ansible.cfg
[defaults]
interpreter_python = /usr/bin/python3

# 次のようにパスを自動解決させることもできます
# interpreter_python = auto_silent

関連記事

まくろぐ
サイトマップまくへのメッセージ