本連載の第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実行サーバー
01 | [root@ansible2 ~]# yum install epel-release |
02 | 読み込んだプラグイン:fastestmirror |
03 | epel-release-7-5.noarch.rpm | 14 kB 00:00:00 |
04 | /var/tmp/yum-root-3G6fd0/epel-release-7-5.noarch.rpm を調べています: epel-release-7-5.noarch |
08 | インストール中 : epel-release-7-5.noarch 1/1 |
09 | 検証中 : epel-release-7-5.noarch 1/1 |
12 | epel-release.noarch 0:7-5 |
執筆時点(2016/02/01)でのAnsibleの最新版(2.0)をインストールするためには、EPELパッケージのインストール後に、epel-testingレポジトリを有効にする必要があります。
リスト2:Ansibleのインストール@Ansible実行サーバー
01 | [root@ansible2 ~]# yum install ansible --enablerepo=epel-testing |
05 | ================================================================================ |
06 | Package アーキテクチャー バージョン リポジトリー 容量 |
07 | ================================================================================ |
09 | ansible noarch 2.0.0.2-1.el7 epel-testing 2.8 M |
11 | PyYAML x86_64 3.10-11.el7 base 153 k |
12 | libtomcrypt x86_64 1.17-23.el7 epel 224 k |
13 | libtommath x86_64 0.42.0-4.el7 epel 35 k |
14 | python-babel noarch 0.9.6-8.el7 base 1.4 M |
15 | python-ecdsa noarch 0.11-3.el7.centos extras 69 k |
16 | python-httplib2 noarch 0.7.7-3.el7 epel 70 k |
17 | python-jinja2 noarch 2.7.2-2.el7 base 515 k |
18 | python-keyczar noarch 0.71c-2.el7 epel 218 k |
19 | python-markupsafe x86_64 0.11-10.el7 base 25 k |
20 | python-paramiko noarch 1.15.1-1.el7 epel 999 k |
21 | python-pyasn1 noarch 0.1.6-2.el7 base 91 k |
22 | python-six noarch 1.9.0-2.el7 base 29 k |
23 | python2-crypto x86_64 2.6.1-9.el7 epel 475 k |
24 | sshpass x86_64 1.05-5.el7 epel 21 k |
リスト3:--enablerepo=epel-testingの指定がない場合@Ansible実行サーバー
01 | [root@ansible2 ~]# yum install ansible |
05 | ================================================================================= |
06 | Package アーキテクチャー バージョン リポジトリー 容量 |
07 | ================================================================================= |
09 | 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実行サーバー
1 | [root@ansible2 ~]# yum install ansible --enablerepo=epel-testing |
5 | 更新: ansible.noarch 0:2.0.0.2-1.el7 |
インストールされたAnsibleのバージョンは、「ansible --version」と入力することで確認できます。
リスト5:Ansibleのバージョン確認@Ansible実行サーバー
1 | [root@ansible2 ~]# ansible --version |
3 | config file = /etc/ansible/ansible.cfg |
4 | configured module search path = Default w/o overrides |
ansibleコマンドを使うために必要な設定
Ansibleで対象サーバーを操作するためには、操作対象サーバーへの接続が必要となります。接続状況と設定を確認するため、Ansibleでは下記のコマンドがよく用いられます。
図2:操作するサーバーへの接続を確認する
Ansibleでは、操作対象となるサーバー(IPアドレスで指定)と実行するモジュールを指定して実行します。上記の例では、192.168.0.3のサーバーに対し、pingモジュールを実行しています。ただし現時点では、pingの実行は失敗してしまいます。
リスト6:hostsリストの未設定によるansibleの実行失敗@Ansible実行サーバー
1 | [root@ansible2 ~]# ansible 192.168.0.3 -m ping |
2 | [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実行サーバー
1 | [root@ansible2 ansible]# cat /etc/ansible/hosts |
3 | [root@ansible2 ~]# ansible 192.168.0.3 -m ping |
4 | 192.168.0.3 | UNREACHABLE! => { |
6 | "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", |
リスト8:任意のhostsリストを用いたansibleの実行@Ansible実行サーバー
1 | [root@ansible2 ~]# cat /root/hostlist |
3 | [root@ansible2 ~]# ansible -i /root/hostlist 192.168.0.3 -m ping |
4 | 192.168.0.3 | UNREACHABLE! => { |
6 | "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", |
リスト7、リスト8のようにhostsリストがあれば、先ほどのWARNINGは表示されなくなりますが、今度はERRORが表示され、ansibleコマンドの実行が失敗しています。これは、Ansibleが対象となるサーバーを操作するためにはhostsの設定に加えて、認証が必要となるためです。認証には、秘密鍵の作成と登録による方法や、簡単な方法として-kオプションで操作対象サーバーのSSHパスワードを入力し実行するといった方法があります。実際の構築環境に応じたセキュリティ設定を選択してください。本稿では、毎回パスワードを入力する手間を省くため、ssh-key genとssh-copy-idを用いて認証を行っています。
リスト9:-kオプションを用いたansibleコマンドの実行@Ansible実行サーバー
1 | [root@ansible2 ansible]# ansible 192.168.0.3 -m ping -k |
3 | 192.168.0.3 | SUCCESS => { |
リスト10:ssh-copy-idを用いたansibleコマンドの実行@Ansible実行サーバー
01 | [root@ansible2 ~]# ssh-keygen |
02 | Generating public/private rsa key pair. |
03 | Enter file in which to save the key (/root/.ssh/id_rsa): |
04 | Enter passphrase (empty for no passphrase): |
08 | [root@ansible2 ~]# ssh-copy-id 192.168.0.3 |
09 | /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed |
10 | /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 |
11 | root@192.168.0.3's password: |
13 | Number of key(s) added: 1 |
15 | Now try logging into the machine, with: "ssh '192.168.0.3'" |
16 | and check to make sure that only the key(s) you wanted were added. |
18 | [root@ansible2 ~]# ansible 192.168.0.3 -m ping |
19 | 192.168.0.3 | SUCCESS => { |
以上で、操作対象サーバーとの疎通が確認できました。
ansibleコマンドの詳細については、「ansible --help」で確認することができます。また、ansibleコマンドのオプションとなるモジュールについては、「ansible-doc 【モジュール名】」とすることで各モジュールの詳細を確認することができます。モジュールの種類については、下記の公式ドキュメントをご参照ください。
Module Index - Ansible Documentation
http://docs.ansible.com/ansible/modules_by_category.html
リスト11:ansible-docコマンドによるモジュール詳細の確認@Ansible実行サーバー
01 | [root@ansible2 ~]# ansible-doc ping |
02 | less 458 (POSIX regular expressions) |
03 | Copyright (C) 1984-2012 Mark Nudelman |
05 | less comes with NO WARRANTY, to the extent permitted by law. |
06 | For information about the terms of redistribution, |
07 | see the file named README in the less distribution. |
11 | A trivial test module, this module always returns `pong' on successful contact. It |
12 | does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify |
13 | the ability to login and that a usable python is configured. This is NOT ICMP ping, |
14 | this is just a trivial test module. |
17 | # Test we can logon to 'webservers' and execute python with json lib. |
18 | ansible webservers -m ping |
21 | MAINTAINERS: Ansible Core Team, Michael DeHaan |
Ansible Playbookを試す
ここまでansibleコマンドを用いて対象サーバーを操作する実例を紹介しましたが、Ansibleは対象サーバーに多数の設定を一度に投入することが多いため、直接ansibleコマンドを実行することはほとんどありません。その代わりにPlaybookと呼ばれるファイルに操作内容を記述して、ansible-playbookコマンドにより記述された処理を実行します。
本稿では例として、yumでslパッケージをインストールするPlaybookを記述し、実行する方法について紹介します。
まず、操作対象サーバーにログインし、slパッケージがインストールされていないことを確認します。
リスト12:slコマンドの未インストールを確認@操作対象サーバー
次にAnsibleサーバーに戻り、Playbookとなるファイルを作成します。PlaybookはYAML形式で記述し、拡張子は「.yml」とします。今回は、yum.ymlという名前のファイルを作成しています。
リスト13:yum.ymlファイルの編集@Ansible実行サーバー
3 | - name: slコマンドのyumインストール |
図3:yum.ymlファイルの詳細
Ansible実行サーバーで、ansible-playbookコマンドを以下のように実行します。
リスト14:yum.yml Playbookの実行@Ansible実行サーバー
01 | [root@ansible2 ansible]# ansible-playbook yum.yml |
03 | PLAY *************************************************************************** |
05 | TASK [setup] ******************************************************************* |
08 | TASK [slコマンドのyumインストール] ******************************************************** |
11 | PLAY RECAP ********************************************************************* |
12 | 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コマンドの実行@操作対象サーバー
01 | ( ) (@@) ( ) (@) () @@ O @ O @ O |
07 | ==== ________ ___________ |
08 | _D _| |_______/ \__I_I_____===__|_________| |
09 | |(_)--- | H\________/ | | =|___ ___| _________________ |
10 | / | | H | | | | ||_| |_|| _| \_____A |
11 | | | | H |__--------------------| [___] | =| | |
12 | | ________|___H__/__|_____/[][]~\_______| | -| | |
13 | |/ | |-----------I_____I [][] [] D |=======|____|________________________|_ |
14 | __/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__|__________________________|_ |
15 | |/-=|___|= O=====O=====O=====O|_____/~\___/ |_D__D__D_| |_D__D__D_| |
16 | \_/ \__/ \__/ \__/ \__/ \_/ \_/ \_/ \_/ \_/ |
なおAnsibleでは、操作対象サーバーで既に実行済みの操作については再実行されず、設定済みである旨が示されます。試しに、先ほど実行したPlaybookを再実行してみます。
リスト16:yum.yml Playbookの再実行@Ansible実行サーバー
01 | [root@ansible2 ansible]# ansible-playbook yum.yml |
03 | PLAY *************************************************************************** |
05 | TASK [setup] ******************************************************************* |
08 | TASK [slコマンドのyumインストール] ******************************************************** |
11 | PLAY RECAP ********************************************************************* |
12 | 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
wgetコマンドのように、指定したURLのファイルを、保存先にダウンロードするパッケージです。url=以下にはダウンロード先となるURLを指定しますが、リスト17では変数を用いて指定しています。変数の使用法については、次回の記事で紹介します。
unarchiveモジュール
http://docs.ansible.com/ansible/unarchive_module.html
リスト18:unarchiveモジュールの使用例
2 | unarchive: src=/tmp/ruby.tar.gz dest=/tmp copy=no |
tarコマンドのように、ダウンロードなどにより入手したtar.gzファイルなどを展開するパッケージです。
shellモジュール
http://docs.ansible.com/ansible/unarchive_module.html
リスト19:shellモジュールの使用例
2 | shell: chdir=/tmp/{{ rubyver }} ./configure --disable-install-doc |
5 | shell: chdir=/tmp/{{ rubyver }} make |
7 | - name: make install ruby |
8 | 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モジュールの使用例
1 | - name: PostgreSQL redmine user作成 |
4 | password={{ password }} |
postgresql_userモジュールは、postgresqlでユーザーを作成するためのモジュールです。頻繁に使うものではないかもしれませんが、Ansibleモジュールが幅広い分野に及ぶコマンドをサポートしていることをご理解いただけると思います。
次回の記事について
いかがでしたでしょうか。今回は簡単ではありますが、Ansibleのインストールとansibleコマンドの実行、そして簡単なPlaybookの実行についてご紹介しました。
次回は、WordPress環境の構築を題材にしながら、Ansible Playbookの作成の基本となる、変数の扱いや頻出のモジュールについて紹介します。
- Ansibleは、米国Red Hat, Inc. の米国およびその他の国における登録商標もしくは商標です。
- 本文中記載の会社名、商品名、ロゴは各社の商標、または登録商標です。