ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

Ansible はじめの一歩

この記事は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

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。