この記事はQiitaからの移行記事です。内容が古い場合があります。
Ansibleはアプリケーションやシステムの管理を自動化するツールです。シンプルな構成ファイルとリモートサーバー上にPython 2.6以降があり、SSHによるリモートアクセスができる環境を用意するだけで、アプリケーションの展開を自動化できます。
UbuntuにAnsibleをインストールする
以下の手順はUbuntuでAnsibleをインストールする方法です。なお、インストールするAnsibleのバージョンは指定していないので、Ubuntuが用意する最新版のAnsibleがインストールされます。
$ sudo apt update && sudo apt install -y ansible
より新しいAnsibleを使う場合はUbuntuにPPAを追加してください。 下記はAnsible社公式が提供するパッケージです。
https://launchpad.net/~ansible/+archive/ubuntu/ansible
AnsibleのPPAを追加するには、次のように実行します。
$ sudo add-apt-repository ppa:ansible/ansible $ sudo apt-get update
RHEL/CentOS/Fedoraなどにインストールする
RHEL7やCentOS7、Fedoraでは標準リポジトリーにAnsibleがありますので、そちらをインストールしましょう。Red Hatが開発しているだけあって、割と新しいAnsibleをインストールできます。
# yum install ansible
リモートサーバーをAnsibleで管理する場合の要件について
リモート管理するサーバー(以降ターゲットノード)にはPython2もしくはPython3が必要です。事前にインストールしておきます。
インベントリーファイルを作る
インベントリファイルは、管理対象ノードのリストを列挙するファイルのことです(ホストファイルと呼ぶこともあります)。各管理対象ノードのIPアドレスなどの情報を指定できます。
以下はnode1にAnsibleをインストールして、node2にリモート管理する流れで説明します。
まずは管理するサーバーの情報を書いてみます。[xxx]でグループとしてノードを定義できます。グループに複数のノードを記述すると全てのノードを制御できます。
node1$ vi ashosts [remote] 192.168.56.42 [all:vars] ansible_python_interpreter=/usr/bin/python3
ansible_python_interpreter
はターゲットノードで利用するPythonのバージョンを指定します。Python2は入っていないけどPython3は入っているというディストリビューションも多くなってきているので、その場合は指定すると良いでしょう。
公開鍵を作る
Ansibleではターゲットノードにリモートアクセスするにはいくつか方法がありますが、公開鍵認証で実行した方が簡単です。 公開鍵認証によるリモートアクセスをするにはまず鍵を作成します。
node1$ ssh-keygen
※鍵の種類や暗号化強度、パスフレーズは適宜設定してください。ここでは説明を省略します。
ターゲットノードでユーザーを作る
リモート管理するサーバーにユーザー(本例ではuser)、パスワードを設定します。パスワードは公開鍵認証時に一度だけ必要です。
node2$ adduser user #Ubuntuの場合 node2$ useradd user #CentOSの場合のユーザー作成 node2$ passwd user #CentOSの場合のパスワードの設定
作成したユーザーで管理権限が必要なコマンドを実行できるようにするため、sudoが実行できるようにします。
node2$ sudo usermod -aG sudo user
AnsibleクライアントからターゲットノードへSSHアクセス
node1からnode2に公開鍵認証によるユーザー認証をできるようにするため、鍵を転送します。192.168.56.42はリモートのサーバーのIPアドレスに置き換えて実行します。実行後、ターゲットノードにSSHアクセスを行います。
node1$ ssh-copy-id -i .ssh/id_rsa.pub user@192.168.56.42 node1$ ssh user@192.168.56.42
AnsibleでターゲットノードにPing
Pingを実行してみましょう。
node1$ ansible remote -u user -i ashosts -m ping
-uオプションでユーザーを毎回指定するのは面倒なので、インベントリーファイルを編集し、デフォルトユーザーを定義してみましょう。
node1$ vi ashosts [remote] 192.168.56.42 [all:vars] ansible_ssh_user=user ansible_python_interpreter=/usr/bin/python3
ansible_ssh_userで指定するユーザーは作成したユーザーに置換えてください。 -uオプションを使わずPingを実行してみるとエラーにならなくなります。
node1$ ansible remote -i ashosts -m ping
リモートサーバーの情報を取得してみましょう。色々メッセージが出力されるはずです。
node1$ ansible remote -i ashosts -m setup
色々なコマンドをターゲットで実行
ターゲットノードでコマンドを実行してみましょう(-aオプションを利用する)。
node1$ ansible remote -i ashosts -a "uname -a" node1$ ansible remote -i ashosts -a "cat /etc/passwd"
ただし、このままでは管理権限が必要なコマンドは失敗します。
node1$ ansible remote -i ashosts -a "cat /etc/shadow" 192.168.56.42 | FAILED | rc=1 >> cat: /etc/shadow: Permission denied
管理権限が必要な場合は--become --ask-become-pass
の指定が必要です。
node1$ ansible remote -i ashosts -a "cat /etc/shadow" --become --ask-become-pass
これでAnsibleでリモートサーバーの管理ができる環境を作ることができました。 リモートサーバーに次の条件が揃い、Ansible用のhostsファイルにリモートサーバーのIPアドレス、グループなどの情報を記述すれば同じようにAnsibleでリモート管理ができるようになります。
- Python 2もしくは3がインストールされている
- ユーザー、パスワードが設定されている
- ユーザーでsudoコマンドが使える
Ansibleはコマンドを実行できるだけでなく、Playbookというものを書くことで一連の処理を一括で実行することができます。
もっと知るにはAnsible Tutorialなどがオススメです。
Ansible Documentation