まくろぐ
更新: / 作成:

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

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 で接続できる状態になっている必要があります(参考: SSH 関連記事)。

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

最初のステップとして、ansible コマンドで ping モジュールを実行してみます。 ping モジュールは Ansible の組み込みモジュールとして提供されており、ターゲットホストへの接続確認のために使われます。 いわゆる Linux の ping コマンド (ICMP ping) ではないことに注意してください。

準備として、次のようなインベントリーファイル (hosts.ini) をカレントディレクトリに作成しておきます。

hosts.ini(インベントリーファイル)
localhost
192.168.1.20

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

まずは、localhost に対して(自分自身を制御対象として)、ping モジュールを実行してみます。 ansible コマンドを実行するときは、第 1 パラメータで制御対象とするホスト名を指定します。 前述の通り、指定するホスト名はインベントリーファイル内に列挙されているものの中から選びます。 次のように実行して SUCCESS 表示が出れば成功です(python コマンドのパスに関する警告が出るかもしれませんが、ひとまず無視しておいて大丈夫です)。

例: localhost に対して ping を実行
$ ansible localhost -i hosts.ini -m ping -c local
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ansible コマンドの各オプションは次のような意味を持っています。

  • -i hosts.ini … インベントリーファイルとして、カレントディレクトリの hosts.ini を使用します。
  • -m ping … 組み込みの ping モジュールを使用してタスクを実行します。
  • -c local … ローカルホストを制御対象とするときはこのオプションを指定します。Ansible はデフォルトで SSH 接続しようとするので、その振る舞いを抑制するためのオプションです。
☝️ -c local オプションを省略したいとき

イベントリーファイル内で、ホスト名 (localhost) の後ろに ansible_connection=local と記述しておくと、ansible コマンド実行時の -c local オプションの指定を省略できます。

hosts.ini(接続方式の指定)
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 オプションで指定していますが、インベントリーファイルの中で次のようにユーザー名を設定しておくこともできます。

hosts.ini
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

関連記事

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