Ansibleにて、他のサーバを操作する方法をまとめます。おそらく、このサイトを訪れる方はネットワーク系の方が多いかと思われますが、ネットワーク機器をAnsibleで操作するのは比較的ハードルが高い操作です。まずはサーバの操作を覚えてからネットワークを覚えた方が近道かと思われます。
他サーバへのping確認
pingモジュール概要
まずはAnsibleのpingモジュールを実行できるようになりましょう。pingとは疎通確認を行うモジュールですが、ICMPによる疎通確認ではなく、「pongと標準出力するpythonスクリプトを他の機器に転送できるかどうか」を確かめるモジュールです。
Pythonは基本的にスクリプトを他機器に転送して、それを実行する挙動になります。
パスワード認証
Ansibleは基本的に鍵認証と相性が良い自動化ツールです。しかし、やや手間ですが、パスワード認証にも対応しています。パスワード認証を行うためには、sshpassと呼ばれるRPMパッケージが必要です。このパッケージをインストールしていない場合は以下のようなエラーメッセージが出力されます。
# ansible-playbook -i inventory.ini ping_centos.yml PLAY [centos] ****************************************************************** TASK [ping] ******************************************************************** fatal: [centos70]: FAILED! => {"msg": "to use the 'ssh' connection type with passwords, you must install the sshpass program"} PLAY RECAP ********************************************************************* centos70 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
sshpassはEPELリポジトリに格納されています。以下のコマンドでsshpassをインストールしましょう。
dnf install epel-release dnf install sshpass
インベントリファイルの作成
Ansibleはインベントリファイルを呼ばれる操作対象の一覧を記述したファイルが必要になります。作例例は以下の通りです。
cat << EOF > inventory.ini [centos:vars] ansible_user = 'root' ansible_password = 'P@ssw0rd' [centos] centos80 ansible_host=192.168.9.80 centos81 ansible_host=192.168.9.81 EOF
centos:vars配下が「centos」というグループに対する変数の定義です。ansible_userとansible_passwordという2つの変数を定義すれば、sshパスワード認証でログインする時の情報を定義する事ができます。
centos配下がグループに所属するホストの定義です。
プレイブックの作成
プレイブックは作業対象のホスト一覧やタスク一覧をまとめて記述したファイルです。以下はcentosというグループに対して、pingというモジュールを実行する例です。
cat << EOF > ping_centos.yml --- - hosts: centos tasks: - ping: EOF
プレイブックの実行
プレイブックの実行コマンド例は以下の通りです。「-i」でインベントリファイルを指定し、さらに末尾にプレイブックを指定します。
# ansible-playbook -i inventory.ini ping_centos.yml
場合によっては以下のようなエラーメッセージが出力されるかもしれません。
# ansible-playbook -i inventory.ini ping_centos.yml PLAY [centos] ****************************************************************** TASK [Gathering Facts] ********************************************************* fatal: [centos80]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."} fatal: [centos81]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."} PLAY RECAP ********************************************************************* centos80 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 centos81 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
known_hostsに登録されていないホストの場合、このようなエラーが発生します。一度、sshログインを試みて、know_hostsに必要なエントリを登録しましょう。
(venv-ans28) [root@ansible70 ansible]# ssh 192.168.9.80 The authenticity of host '192.168.9.80 (192.168.9.80)' can't be established. ECDSA key fingerprint is SHA256:MDvzCjl9vcaGEJ09aNDaokkAf7yCn9BppyQI8JvCSkE. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.9.80' (ECDSA) to the list of known hosts. root@192.168.9.80's password: (venv-ans28) [root@ansible70 ansible]# (venv-ans28) [root@ansible70 ansible]# ssh 192.168.9.81 The authenticity of host '192.168.9.81 (192.168.9.81)' can't be established. ECDSA key fingerprint is SHA256:MDvzCjl9vcaGEJ09aNDaokkAf7yCn9BppyQI8JvCSkE. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.9.81' (ECDSA) to the list of known hosts. root@192.168.9.81's password: (venv-ans28) [root@ansible70 ansible]# (venv-ans28) [root@ansible70 ansible]# cat ~/.ssh/known_hosts 192.168.9.80 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG6HoxRDwXPPhpM6qz5FXWaBkIiS95RnLf9AG0nO8+FuSpUTRURvaR9HUhMlKYjy5msC3YVmLQO/lPNAZUArCbo= 192.168.9.81 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG6HoxRDwXPPhpM6qz5FXWaBkIiS95RnLf9AG0nO8+FuSpUTRURvaR9HUhMlKYjy5msC3YVmLQO/lPNAZUArCbo= (venv-ans28) [root@ansible70 ansible]#
know_hostsをメンテナンスするのも良いですが、もしメンテナンスをする人員を確保できないならば、エラーを無視するのも一覧です。エラーを無視する/etc/ssh/ssh_configの設定例は以下の通りです。
# vi /etc/ssh/ssh_config (末尾に加筆) host * StrictHostKeyChecking no
know_hostsのエラーを解除し、プレイブックが成功した場合は以下のような出力になります。
# ansible-playbook -i inventory.ini ping_centos.yml PLAY [centos] ****************************************************************** TASK [Gathering Facts] ********************************************************* ok: [centos81] ok: [centos80] TASK [ping] ******************************************************************** ok: [centos80] ok: [centos81] PLAY RECAP ********************************************************************* centos80 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 centos81 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
apacheインストールの設定例
apacheインストールを実施するプレイブックの例を紹介します。詳細の説明は割愛しますが、Ansibleの最大の特徴である、勉強しなくても「読めば何となく意味が分かる」というのが体感できるかと思います。
cat << EOF > install_apache.yml --- - hosts: centos gather_facts: no vars: - apache_port: 80 tasks: - name: Install Apache yum: name: httpd state: installed - name: Enable Apache service: name: httpd state: started enabled: true - name: Open Firewall Apache firewalld: port: "{{ apache_port }}/tcp" permanent: yes state: disabled EOF
このプレイブックの実行結果は以下の通りです。
# ansible-playbook -i inventory.ini install_apache.yml PLAY [centos] ****************************************************************** TASK [Install Apache] ********************************************************** changed: [centos80] changed: [centos81] TASK [Enable Apache] *********************************************************** changed: [centos81] changed: [centos80] TASK [Open Firewall Apache] **************************************************** ok: [centos81] ok: [centos80] PLAY RECAP ********************************************************************* centos80 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 centos81 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0