Ansibleのインストールとサンプルコードの実行
本連載の第2回、第3回では、Ansible基礎編と題してAnsibleの導入方法や簡単な使い方について詳しく解説していきます。
第2回では、Ansible2.0のインストール手順と簡単なサンプルコマンド、Playbookを実行するまでの手順について紹介します。
Ansibleについて
前回の記事で紹介があったとおり、Ansibleは指定されたコマンドや、複数のコマンドをまとめて記述したPlaybookを用いて、対象となるサーバーの操作を行うことができます。これは、Ansibleサーバーから操作対象サーバーに向けてSSH接続することで処理を実行しています。
前提環境
今回の環境は、下記のとおりです。
本環境では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)レポジトリを利用することになります。
[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レポジトリを有効にする必要があります。
[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 ~]#
[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コマンドを実行すれば、アップデート可能です。
[root@ansible2 ~]# yum install ansible --enablerepo=epel-testing (中略) 更新: ansible.noarch 0:2.0.0.2-1.el7 完了しました!
インストールされたAnsibleのバージョンは、「ansible --version」と入力することで確認できます。
[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では下記のコマンドがよく用いられます。
Ansibleでは、操作対象となるサーバー(IPアドレスで指定)と実行するモジュールを指定して実行します。上記の例では、192.168.0.3のサーバーに対し、pingモジュールを実行しています。ただし現時点では、pingの実行は失敗してしまいます。
[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オプションを用いて一時的に別のファイルを指定することも可能です。
[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 }
[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を用いて認証を行っています。
[root@ansible2 ansible]# ansible 192.168.0.3 -m ping -k SSH password: <パスワード入力> 192.168.0.3 | SUCCESS => { "changed": false, "ping": "pong" }!
[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
[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パッケージがインストールされていないことを確認します。
[root@slave ~]# sl -bash: sl: コマンドが見つかりません
次にAnsibleサーバーに戻り、Playbookとなるファイルを作成します。PlaybookはYAML形式で記述し、拡張子は「.yml」とします。今回は、yum.ymlという名前のファイルを作成しています。
- hosts: all tasks: - name: slコマンドのyumインストール yum: name=sl
Ansible実行サーバーで、ansible-playbookコマンドを以下のように実行します。
[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が走り抜けることを目的としたジョークコマンドです。
( ) (@@) ( ) (@) () @@ 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を再実行してみます。
[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
- 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
- name: rubyの展開 unarchive: src=/tmp/ruby.tar.gz dest=/tmp copy=no
tarコマンドのように、ダウンロードなどにより入手したtar.gzファイルなどを展開するパッケージです。
shellモジュール
http://docs.ansible.com/ansible/unarchive_module.html
- 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
最後に、特定のソフトウェアのコマンドの例を紹介します。
- name: PostgreSQL redmine user作成 postgresql_user: name=redmine password={{ password }}
postgresql_userモジュールは、postgresqlでユーザーを作成するためのモジュールです。頻繁に使うものではないかもしれませんが、Ansibleモジュールが幅広い分野に及ぶコマンドをサポートしていることをご理解いただけると思います。
次回の記事について
いかがでしたでしょうか。今回は簡単ではありますが、Ansibleのインストールとansibleコマンドの実行、そして簡単なPlaybookの実行についてご紹介しました。
次回は、WordPress環境の構築を題材にしながら、Ansible Playbookの作成の基本となる、変数の扱いや頻出のモジュールについて紹介します。
- Ansibleは、米国Red Hat, Inc. の米国およびその他の国における登録商標もしくは商標です。
- 本文中記載の会社名、商品名、ロゴは各社の商標、または登録商標です。