Ansibleのインストールとサンプルコードの実行

2016年3月8日(火)
平原 一帆
Ansible2.0をCentOS 7.2環境へインストールし、サンプルのコマンドやPlaybookを実行できるところまで解説します。

本連載の第2回、第3回では、Ansible基礎編と題してAnsibleの導入方法や簡単な使い方について詳しく解説していきます。

第2回では、Ansible2.0のインストール手順と簡単なサンプルコマンド、Playbookを実行するまでの手順について紹介します。

Ansibleについて

前回の記事で紹介があったとおり、Ansibleは指定されたコマンドや、複数のコマンドをまとめて記述したPlaybookを用いて、対象となるサーバーの操作を行うことができます。これは、Ansibleサーバーから操作対象サーバーに向けてSSH接続することで処理を実行しています。

前提環境

今回の環境は、下記のとおりです。

前提環境

図1:前提環境

本環境ではCentOS 7.2を用いて、ソフトウェアの選択時に「最小限(Minimal)」を選んでインストールを実施しています。ネットワークは、インターネットへの接続が可能な外部ネットワークと、Ansibleコマンドを実施する際に指定するAnsible管理ネットワークを設定しています。検証環境の都合でネットワークを分けていますが、これらは同じセグメントでも構いません。操作対象サーバーのユーザーとして、rootのほかにuserを作成しています。

Ansibleの動作環境において、ハードウェア要件は明確に記載されていません。一方ソフトウェア要件としては、Ansible実行サーバーにはPython 2.6か2.7のインストールが必要です。また操作対象のサーバーには、Python 2.4以上(2.x)が必要である旨が記載されています。要件の詳細については、下記の公式ドキュメントをご参照ください。

Installation - Ansible Documentation

http://docs.ansible.com/ansible/intro_installation.html

Ansibleのインストール

CentOS 7.2においては、yumを用いるのが最も簡単なインストール手順となります。ただし、執筆時点(2016/02/01)ではCentOSの標準レポジトリにAnsibleが含まれていないため、EPEL(Extra Package for Enterprise Linux)レポジトリを利用することになります。

リスト1:EPELのインストール@Ansible実行サーバー

[root@ansible2 ~]# yum install epel-release
読み込んだプラグイン:fastestmirror
epel-release-7-5.noarch.rpm                                               |  14 kB  00:00:00
/var/tmp/yum-root-3G6fd0/epel-release-7-5.noarch.rpm を調べています: epel-release-7-5.noarch

(中略)

  インストール中          : epel-release-7-5.noarch                                      1/1
  検証中                  : epel-release-7-5.noarch                                      1/1

インストール:
  epel-release.noarch 0:7-5

完了しました!

執筆時点(2016/02/01)でのAnsibleの最新版(2.0)をインストールするためには、EPELパッケージのインストール後に、epel-testingレポジトリを有効にする必要があります。

リスト2:Ansibleのインストール@Ansible実行サーバー

[root@ansible2 ~]# yum install ansible --enablerepo=epel-testing

(中略)

================================================================================
 Package              アーキテクチャー  バージョン           リポジトリー         容量
================================================================================
インストール中:
 ansible              noarch            2.0.0.2-1.el7        epel-testing        2.8 M
依存性関連でのインストールをします:
 PyYAML               x86_64            3.10-11.el7          base                153 k
 libtomcrypt          x86_64            1.17-23.el7          epel                224 k
 libtommath           x86_64            0.42.0-4.el7         epel                 35 k
 python-babel         noarch            0.9.6-8.el7          base                1.4 M
 python-ecdsa         noarch            0.11-3.el7.centos    extras               69 k
 python-httplib2      noarch            0.7.7-3.el7          epel                 70 k
 python-jinja2        noarch            2.7.2-2.el7          base                515 k
 python-keyczar       noarch            0.71c-2.el7          epel                218 k
 python-markupsafe    x86_64            0.11-10.el7          base                 25 k
 python-paramiko      noarch            1.15.1-1.el7         epel                999 k
 python-pyasn1        noarch            0.1.6-2.el7          base                 91 k
 python-six           noarch            1.9.0-2.el7          base                 29 k
 python2-crypto       x86_64            2.6.1-9.el7          epel                475 k
 sshpass              x86_64            1.05-5.el7           epel                 21 k

(中略)

完了しました!
[root@ansible2 ~]#

リスト3:--enablerepo=epel-testingの指定がない場合@Ansible実行サーバー

[root@ansible2 ~]# yum install ansible

(中略)

=================================================================================
 Package              アーキテクチャー  バージョン           リポジトリー         容量
=================================================================================
インストール中:
 ansible              noarch            1.9.4-1.el7          epel                1.7 M

(中略)

完了しました!

リスト3のように、epel-testingを使用するよう指定しないと、Ansible 1.9.4がインストールされます。その場合でも、epel-testingを指定して再度yumコマンドを実行すれば、アップデート可能です。

リスト4:Ansible2.0へのアップデート@Ansible実行サーバー

[root@ansible2 ~]# yum install ansible --enablerepo=epel-testing

(中略)

更新:  ansible.noarch 0:2.0.0.2-1.el7

完了しました!

インストールされたAnsibleのバージョンは、「ansible --version」と入力することで確認できます。

リスト5:Ansibleのバージョン確認@Ansible実行サーバー

[root@ansible2 ~]# ansible --version
ansible 2.0.0.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

ansibleコマンドを使うために必要な設定

Ansibleで対象サーバーを操作するためには、操作対象サーバーへの接続が必要となります。接続状況と設定を確認するため、Ansibleでは下記のコマンドがよく用いられます。

操作するサーバーへの接続を確認する

図2:操作するサーバーへの接続を確認する

Ansibleでは、操作対象となるサーバー(IPアドレスで指定)と実行するモジュールを指定して実行します。上記の例では、192.168.0.3のサーバーに対し、pingモジュールを実行しています。ただし現時点では、pingの実行は失敗してしまいます。

リスト6:hostsリストの未設定によるansibleの実行失敗@Ansible実行サーバー

[root@ansible2 ~]# ansible 192.168.0.3 -m ping
 [WARNING]: provided hosts list is empty, only localhost is available

Ansibleは実行内容によっては対象のサーバーに重大な影響を及ぼしてしまうため、実行が許可されるのはIPアドレスがhostsリストに書かれているサーバーに限定されています。hostsリストは、デフォルトでは「/etc/ansible/hosts」となりますが、-iオプションを用いて一時的に別のファイルを指定することも可能です。

リスト7:/etc/ansible/hostsのhostsリストを用いたansibleの実行@Ansible実行サーバー

[root@ansible2 ansible]# cat /etc/ansible/hosts
192.168.0.3
[root@ansible2 ~]# ansible 192.168.0.3 -m ping
192.168.0.3 | UNREACHABLE! => {
    "changed": false,
    "msg": "ERROR! SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue",
    "unreachable": true
}

リスト8:任意のhostsリストを用いたansibleの実行@Ansible実行サーバー

[root@ansible2 ~]# cat /root/hostlist
192.168.0.3
[root@ansible2 ~]# ansible -i /root/hostlist 192.168.0.3 -m ping
192.168.0.3 | UNREACHABLE! => {
    "changed": false,
    "msg": "ERROR! SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue",
    "unreachable": true
}

リスト7、リスト8のようにhostsリストがあれば、先ほどのWARNINGは表示されなくなりますが、今度はERRORが表示され、ansibleコマンドの実行が失敗しています。これは、Ansibleが対象となるサーバーを操作するためにはhostsの設定に加えて、認証が必要となるためです。認証には、秘密鍵の作成と登録による方法や、簡単な方法として-kオプションで操作対象サーバーのSSHパスワードを入力し実行するといった方法があります。実際の構築環境に応じたセキュリティ設定を選択してください。本稿では、毎回パスワードを入力する手間を省くため、ssh-key genとssh-copy-idを用いて認証を行っています。

リスト9:-kオプションを用いたansibleコマンドの実行@Ansible実行サーバー

[root@ansible2 ansible]# ansible 192.168.0.3 -m ping -k
SSH password: <パスワード入力>
192.168.0.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}!

リスト10:ssh-copy-idを用いたansibleコマンドの実行@Ansible実行サーバー

[root@ansible2 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):

(中略)

[root@ansible2 ~]# ssh-copy-id 192.168.0.3
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.3's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.0.3'"
and check to make sure that only the key(s) you wanted were added.

[root@ansible2 ~]# ansible 192.168.0.3 -m ping
192.168.0.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

以上で、操作対象サーバーとの疎通が確認できました。

ansibleコマンドの詳細については、「ansible --help」で確認することができます。また、ansibleコマンドのオプションとなるモジュールについては、「ansible-doc 【モジュール名】」とすることで各モジュールの詳細を確認することができます。モジュールの種類については、下記の公式ドキュメントをご参照ください。

Module Index - Ansible Documentation

http://docs.ansible.com/ansible/modules_by_category.html

リスト11:ansible-docコマンドによるモジュール詳細の確認@Ansible実行サーバー

[root@ansible2 ~]# ansible-doc ping
less 458 (POSIX regular expressions)
Copyright (C) 1984-2012 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less
> PING

  A trivial test module, this module always returns `pong' on successful contact. It
  does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
  the ability to login and that a usable python is configured. This is NOT ICMP ping,
  this is just a trivial test module.

EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
ansible webservers -m ping


MAINTAINERS: Ansible Core Team, Michael DeHaan

Ansible Playbookを試す

ここまでansibleコマンドを用いて対象サーバーを操作する実例を紹介しましたが、Ansibleは対象サーバーに多数の設定を一度に投入することが多いため、直接ansibleコマンドを実行することはほとんどありません。その代わりにPlaybookと呼ばれるファイルに操作内容を記述して、ansible-playbookコマンドにより記述された処理を実行します。

本稿では例として、yumでslパッケージをインストールするPlaybookを記述し、実行する方法について紹介します。

まず、操作対象サーバーにログインし、slパッケージがインストールされていないことを確認します。

リスト12:slコマンドの未インストールを確認@操作対象サーバー

[root@slave ~]# sl
-bash: sl: コマンドが見つかりません

次にAnsibleサーバーに戻り、Playbookとなるファイルを作成します。PlaybookはYAML形式で記述し、拡張子は「.yml」とします。今回は、yum.ymlという名前のファイルを作成しています。

リスト13:yum.ymlファイルの編集@Ansible実行サーバー

- hosts: all
  tasks:
    - name: slコマンドのyumインストール
      yum: name=sl
yum.ymlファイルの詳細

図3:yum.ymlファイルの詳細

Ansible実行サーバーで、ansible-playbookコマンドを以下のように実行します。

リスト14:yum.yml Playbookの実行@Ansible実行サーバー

[root@ansible2 ansible]# ansible-playbook yum.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.3]

TASK [slコマンドのyumインストール] ********************************************************
changed: [192.168.0.3]

PLAY RECAP *********************************************************************
192.168.0.3                : ok=2    changed=1    unreachable=0    failed=0

上記のPlaybookにより、hostsファイルで指定している操作対象サーバー(192.168.0.3)に対してslパッケージがインストールされました。操作対象サーバーでslコマンドを実行すると、先ほどは失敗していたslコマンドの実行に成功します。ちなみにslコマンドは、lsコマンドを誤入力した際に、画面上をSLが走り抜けることを目的としたジョークコマンドです。

リスト15:slコマンドの実行@操作対象サーバー

                                      (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O
                                 (@@@)
                             (    )
                          (@@@@)

                        (   )
                       ====        ________                ___________
                   _D _|  |_______/        \__I_I_____===__|_________|
                    |(_)---  |   H\________/ |   |        =|___ ___|      _________________
                    /     |  |   H  |  |     |   |         ||_| |_||     _|                \_____A
                   |      |  |   H  |__--------------------| [___] |   =|                        |
                   | ________|___H__/__|_____/[][]~\_______|       |   -|                        |
                   |/ |   |-----------I_____I [][] []  D   |=======|____|________________________|_
                 __/ =| o |=-~~\  /~~\  /~~\  /~~\ ____Y___________|__|__________________________|_
                  |/-=|___|=   O=====O=====O=====O|_____/~\___/          |_D__D__D_|  |_D__D__D_|
                   \_/      \__/  \__/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

なおAnsibleでは、操作対象サーバーで既に実行済みの操作については再実行されず、設定済みである旨が示されます。試しに、先ほど実行したPlaybookを再実行してみます。

リスト16:yum.yml Playbookの再実行@Ansible実行サーバー

[root@ansible2 ansible]# ansible-playbook yum.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.3]

TASK [slコマンドのyumインストール] ********************************************************
ok: [192.168.0.3]

PLAY RECAP *********************************************************************
192.168.0.3                : ok=2    changed=0    unreachable=0    failed=0

先ほどchangedとして示されていたyum インストールがokとなっており、実行時間も短縮されます。

非常に簡単ではありますが、Playbookを用いたサーバーの操作について紹介しました。

多様なansibleモジュール

本稿の最後に、実際の環境構築に用いられるPlaybookから抜粋し、いくつかのansibleモジュールを紹介したいと思います。

get_urlモジュール

http://docs.ansible.com/ansible/get_url_module.html

リスト17:get_urlモジュールの使用例

- name: rubyのダウンロード//}
  get_url:
    url={{ rubyurl }}
    dest=/tmp/ruby.tar.gz

wgetコマンドのように、指定したURLのファイルを、保存先にダウンロードするパッケージです。url=以下にはダウンロード先となるURLを指定しますが、リスト17では変数を用いて指定しています。変数の使用法については、次回の記事で紹介します。

unarchiveモジュール

http://docs.ansible.com/ansible/unarchive_module.html

リスト18:unarchiveモジュールの使用例

- name: rubyの展開
  unarchive: src=/tmp/ruby.tar.gz dest=/tmp copy=no

tarコマンドのように、ダウンロードなどにより入手したtar.gzファイルなどを展開するパッケージです。

shellモジュール

http://docs.ansible.com/ansible/unarchive_module.html

リスト19:shellモジュールの使用例

- name: rubyのインストール
  shell: chdir=/tmp/{{ rubyver }} ./configure --disable-install-doc

- name: make ruby
  shell: chdir=/tmp/{{ rubyver }} make

- name: make install ruby
  shell: chdir=/tmp/{{ rubyver }} make install

Ansibleモジュールはコマンドを幅広くサポートしていますが、それでも対応するモジュールがない場合は、shellを用いることで、実行したい処理を記述することができます。上記の例では、rubyをインストールするためのconfigureやmakeを実行しています。

postgresql_userモジュール

http://docs.ansible.com/ansible/postgresql_user_module.html

最後に、特定のソフトウェアのコマンドの例を紹介します。

リスト20:postgresql_userモジュールの使用例

- name: PostgreSQL redmine user作成
  postgresql_user:
    name=redmine
    password={{ password }}

postgresql_userモジュールは、postgresqlでユーザーを作成するためのモジュールです。頻繁に使うものではないかもしれませんが、Ansibleモジュールが幅広い分野に及ぶコマンドをサポートしていることをご理解いただけると思います。

次回の記事について

いかがでしたでしょうか。今回は簡単ではありますが、Ansibleのインストールとansibleコマンドの実行、そして簡単なPlaybookの実行についてご紹介しました。

次回は、WordPress環境の構築を題材にしながら、Ansible Playbookの作成の基本となる、変数の扱いや頻出のモジュールについて紹介します。

  • Ansibleは、米国Red Hat, Inc. の米国およびその他の国における登録商標もしくは商標です。
  • 本文中記載の会社名、商品名、ロゴは各社の商標、または登録商標です。
日立ソリューションズ
インフラ系OSSを中心に、新技術・新製品の組み合わせ評価及びソリューション開発支援に従事。現在は主にOSSクラウド技術の評価・情報展開を実施している。Open Standard Cloud Association (OSCA™)、OSSコンソーシアム クラウド部会などでも活動中。

連載バックナンバー

運用・管理技術解説
第10回

Ansible Towerのクラウド連携機能による効率化を目指す

2017/9/26
Ansible Towerが備えるクラウド連携機能を用いることで、Playbookやユーザーの管理を効率良く行えることを紹介する。
運用・管理技術解説
第9回

Ansible Towerによる権限の管理

2017/7/27
複数のユーザーによる使用を前提としたAnsible Towerでの権限管理の方法を紹介する。
運用・管理
第8回

Ansibleの機能を拡張するAnsible Tower

2017/4/18
好評の連載「注目の構成管理ツールAnsibleを徹底活用する」の追加コンテンツとして、Ansible Towerを取り上げる。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています