Ansible操作例 – CentOSへの接続方法の説明

スポンサーリンク

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

AnsibleによるCentOSの操作例01

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

AnsibleによるCentOSの操作例02

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

AnsibleによるCentOSの操作例03

タイトルとURLをコピーしました