読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

CentOS7にansibleをインストールする

ansible python

ansibleというかpython絡みでインストールエラーが発生するのは稀によくあるので、備忘録として残しておきます。

f:id:treeapps:20160219001058p:plain

今回使うCentOS7は、VagrantBoxの CentOS7.0 x86_64 minimal (VirtualBoxGuestAddtions 4.3.14) となります。

公式のインストールチュートリアル

Installation — Ansible Documentation

デフォルトで必要なもの

  • python2.4以上
  • git
  • python-devel
  • sshpass

※ python-devel はCentOS7で初期インストールされていないので注意。
※ sshpassはチュートリアルを正常動作させるために必要です。

バージョンの確認

# バージョン確認
[vagrant@node1 ~]$ python -V
Python 2.7.5
[vagrant@node1 ~]$ easy_install --version
setuptools 0.9.8

早速インストールしてみる

# epelのインストール
sudo yum install -y epel-release

# sshpassの新ストール
sudo yum install -y sshpass

# python-develをインストール
sudo yum install -y python-devel

# pipと依存ライブラリをインストール
sudo easy_install pip
sudo pip install paramiko PyYAML Jinja2 httplib2

# ansibleをインストール
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

ansibleの動作確認

バージョンの確認
[vagrant@node1 ansible]$ ansible --version
ansible 1.9 (devel 1e867b0b8e) last updated 2015/02/15 03:30:39 (GMT -400)
  lib/ansible/modules/core: (detached HEAD 4ba2d55589) last updated 2015/02/15 03:30:51 (GMT -400)
  lib/ansible/modules/extras: (detached HEAD 2ffd7235e5) last updated 2015/02/15 03:31:03 (GMT -400)
  v2/ansible/modules/core: (detached HEAD 34784b7a61) last updated 2015/02/15 03:31:14 (GMT -400)
  v2/ansible/modules/extras: (detached HEAD 312d59061c) last updated 2015/02/15 03:31:26 (GMT -400)
  configured module search path = None
動作確認
# 自分にpingを送信するため一度sshしてknown_hostsを生成しておく
ssh vagrant@127.0.0.1

# デフォルトのインベントリファイルを生成する
echo "127.0.0.1" > ~/ansible_hosts
export ANSIBLE_HOSTS=~/ansible_hosts

# pingする
[vagrant@node1 ansible]$ ansible all -m ping --ask-pass
SSH password:
127.0.0.1 | success >> {
    "changed": false,
    "ping": "pong"
}

インストール時のエラー

sudo pip install paramiko PyYAML Jinja2 httplib2

以下のエラーが出る場合は python-devel がインストールされていません。インストールしましょう。

sudo pip install paramiko PyYAML Jinja2 httplib2
・・・中略・・・
    gcc -pthread -fno-strict-aliasing -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/python2.7 -c src/MD2.c -o build/temp.linux-x86_64-2.7/src/MD2.o

    src/MD2.c:31:20: 致命的エラー: Python.h: そのようなファイルやディレクトリはありません

     #include "Python.h"

                        ^

    コンパイルを停止しました。

    error: command 'gcc' failed with exit status 1

    ----------------------------------------
    Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-pJjJCP/pycrypto/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-m6JKiC-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-pJjJCP/pycrypto

ansible all -m ping --ask-pass のエラーその1

以下のエラーが出る場合は sshpass がインストールされていません。

[vagrant@node1 ansible]$ ansible all -m ping --ask-pass
SSH password:
127.0.0.1 | FAILED => to use the 'ssh' connection type with passwords, you must install the sshpass program
sshpassをインストールする
# epelのインストール
sudo yum install -y epel-release
# sshpassの新ストール
sudo yum install -y sshpass

ansible all -m ping --ask-pass のエラーその2

ansible all -m ping --ask-pass 実行時に以下のエラーが出る場合は、対象サーバに1度もsshしていない、つまりknown_hostsが生成されていない場合に発生します。1回sshするなりしてknown_hostsを生成しておきましょう。

[vagrant@node1 ansible]$ ansible all -m ping --ask-pass
SSH password:
127.0.0.1 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

もっと簡単にインストールする

Installation — Ansible Documentation
公式サイトによると、EPELのver6か7が入っている場合、sudo yum install ansible でインストールできるとの事です。(実際できました)

しかしyumなので、まず間違いなく最新バージョンは入りません。

yumでインストールした場合のバージョン

1.8.2-1.el7が入るようです。しかし前述のやり方なら最新版のv1.9がインストールできます。この差は以外とデカイので、どちらのインストール方法を選ぶかは要検討ですね。

[vagrant@node1 ~]$ sudo yum instal ansible
=======================================================================================================================================================
 Package                                  アーキテクチャー              バージョン                                リポジトリー                    容量
=======================================================================================================================================================
インストール中:
 ansible                                  noarch                        1.8.2-1.el7                               epel                           1.5 M
依存性関連でのインストールをします:
 PyYAML                                   x86_64                        3.10-11.el7                               base                           153 k
 libyaml                                  x86_64                        0.1.4-11.el7_0                            updates                         55 k
 python-babel                             noarch                        0.9.6-8.el7                               base                           1.4 M
 python-crypto                            x86_64                        2.6.1-1.el7.centos                        extras                         470 k
 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.3.0-4.el7                               base                            18 k

トランザクションの要約
=======================================================================================================================================================
インストール  1 パッケージ (+12 個の依存関係のパッケージ)

ついでにFabricもインストールしよう!

chefに対してAnsibleが有るように、capistranoに対してFabricがあります。Fabricはcapistranoと比較してシンプルで使いやすい構造になっています。chef + capistranoの重戦車と比較し、Ansible + Fabricはlightweightなので、個人使用や小規模プロジェクトにはおすすめです。

今回はAnsibleのインストールの過程でpipもインストールされているので、折角なのでFabricもインストールしてしまいましょう!

Fabricのインストール

[vagrant@node1 ~]$ pip install fabric
Collecting fabric
  Downloading Fabric-1.10.1.tar.gz (209kB)
・・・中略・・・
    ----------------------------------------
    Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-3BAKrD/fabric/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-7sD1N8-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-3BAKrD/fabric
[vagrant@node1 ~]$ sudo pip install fabric
Collecting fabric
  Downloading Fabric-1.10.1.tar.gz (209kB)
    100% |################################| 212kB 2.1MB/s
Requirement already satisfied (use --upgrade to upgrade): paramiko>=1.10 in /usr/lib/python2.7/site-packages (from fabric)
Requirement already satisfied (use --upgrade to upgrade): ecdsa>=0.11 in /usr/lib/python2.7/site-packages (from paramiko>=1.10->fabric)
Requirement already satisfied (use --upgrade to upgrade): pycrypto!=2.4,>=2.1 in /usr/lib64/python2.7/site-packages (from paramiko>=1.10->fabric)
Installing collected packages: fabric
  Running setup.py install for fabric
    Installing fab script to /usr/bin
Successfully installed fabric-1.10.1

Fabricの動作確認

バージョン確認
[vagrant@node1 ~]$ fab -V
Fabric 1.10.1
Paramiko 1.15.2
Fabricの動作確認

まずは test.py を作成します。

def hello():
    print("Hello world!")

以下で実行し、Hellow world! と表示されれば正常動作しています。

[vagrant@node1 ~]$ fab -f ./test.py hello
Hello world!

Done.

雑感

python系はアプリのインストールが大変難しい印象があります。あれをやってエラー、これをやってエラー・・・

ansibleも公式サイトのInstallation通りやったのにエラーがでました。これがCentOS5系どかだったらもう目も当てられない状況になるでしょう。インストール職人にしかインストールできない程難解かもしれません。

しかしansible自体は大変素晴らしい構成管理ツールだと思います。chefは大規模以外は冗長で気軽に使えるものではないし、puppetは海外での総合評価が1位のようですがansible程の手軽さはないです(多分)。なので、インストール作業さえ乗り越えれば後は楽になれますので頑張りましょう!

初めてのAnsible

初めてのAnsible