プロジェクト

全般

プロフィール

AnsibleをCentOSにインストール

Ansibleの入手

Ansibleは、Pythonモジュールです。
Pythonモジュールとして入手してインストールする方法と、CentOSのRPMパッケージとして入手してインストールする方法があります。
ここでは、RPMパッケージとしてインストールする方法を記載します。

Ansibleパッケージの入手とインストール

epelリポジトリからansibleパッケージをインストールします。

パッケージ 確認日 epelリポジトリ epel-testingリポジトリ
ansible 2016-01-28 1.9.4-1 2.0.0.2-1

2016-01に、Ansible 2.0がリリースされました。これからAnsibleを使い始めるのであれば、2.0から始めるのがよいかと思われます。

epelリポジトリの設定

epelリポジトリの設定が未であれば、epelリポジトリの設定を行うパッケージ(epel-release)をcentos-extraリポジトリ(標準で利用可能)からインストールします。

~$ sudo yum install epel-release

ansibleのインストール(CentOS 6編)

今回、ansibleはepel-testintリポジトリにある最新版(2.0.0)をインストールすることとし、以下のコマンドでインストールします。

~$ sudo yum --enablerepo=epel-testing install ansible

================================================================================
 パッケージ             アーキテクチャ
                                    バージョン          リポジトリー       容量
================================================================================
インストールしています:
 ansible                noarch      2.0.0.2-1.el6       epel-testing      2.9 M
依存性関連でのインストールをします。:
 PyYAML                 x86_64      3.10-3.1.el6        base              157 k
 python-babel           noarch      0.9.4-5.1.el6       base              1.4 M
 python-crypto          x86_64      2.0.1-22.el6        base              159 k
 python-crypto2.6       x86_64      2.6.1-2.el6         epel              513 k
 python-httplib2        noarch      0.7.7-1.el6         epel               70 k
 python-jinja2          x86_64      2.2.1-2.el6_5       base              466 k
 python-keyczar         noarch      0.71c-1.el6         epel              219 k
 python-paramiko        noarch      1.7.5-2.1.el6       base              728 k
 python-pyasn1          noarch      0.0.12a-1.el6       base               70 k
 python-simplejson      x86_64      2.0.9-3.1.el6       base              126 k
 python-six             noarch      1.9.0-2.el6         base               28 k
 sshpass                x86_64      1.05-1.el6          epel               19 k

トランザクションの要約
================================================================================
インストール        13 パッケージ

Windowsを管理ノードとするときのWinRM接続に使うpywinrmの入手とインストール

pythonパッケージである pywinrm は、CentOSの公式リポジトリにもEPELにも、その他のメジャーなRPMリポジトリにも見当たりません。そのため、pythonのパッケージ管理ツールpipを使ってインストールします。

また、インターネットに接続できない環境で簡単にpywinrmを利用できるよう、pywinrmからRPMパッケージを作成します。

pipのインストール

pipは、EPELリポジトリにあるので、yumでインストールします。

~$ sudo yum install python-pip

pipでpywinrmをインストール

~$ pip install pywinrm

pywinrmのRPMパッケージ作成

pythonモジュールにsetup.pyが含まれていれば、bdist_rpmでRPMパッケージを生成することができます。
ただし、RPMパッケージ名がpywinrmのようになります。CentOS系のRPMパッケージではPythonのモジュールはパッケージ名をpython-pywimrmのように接頭辞にpython-を付けています。CentOS系のパッケージ命名に合わせるため、bdist_rpmの--spec-onlyオプションでSPECファイルのみを生成し、それを修正してからrpmbuildします。

まず、pythonモジュールpywinrmをpipコマンドで入手します。

work$ pip install -d .
work$ ls
isodate-0.5.4.tar.gz  pywinrm-0.1.1.tar.gz  xmltodict-0.9.2.tar.gz

依存するPythonモジュールも一緒にダウンロードされました。なお、この依存するisodateとxmltodictはともにEPELリポジトリにあるので、RPM化するのはpywinrmだけです。

次に、ダウンロードしたpywinrmを展開し、bdist_rpmでSPECファイルのみを生成させます。

work$ tar xzf pywinrm-0.1.1.tar.gz
work$ cd pywinrm-0.1.1
pywinrm-0.1.1$ python setup.py bdist_rpm --spec-only
pywinrm-0.1.1$ ls dist
pywinrm.spec

生成されたpywinrm.specファイルと、ダウンロードしたpywinrm-0.1.1.tar.gzを、rpmbuild作業場所へコピーします。

work$ cp pywinrm-0.1.1.tar.gz ~/rpmbuild/SOURCES/
work$ cp pywinrm-0.1.1/dist/pywinrm.spec ~/rpmbuild/SPECS/python-pywinrm.spec
work$ 

python-pywinrm.specを編集します(RPMパッケージ名をpython-pywinrmに変更する修正)

@@ -1,13 +1,13 @@
-%define name pywinrm
+%define original_name pywinrm
 %define version 0.1.1
 %define unmangled_version 0.1.1
 %define release 1

 Summary: Python library for Windows Remote Management
-Name: %{name}
+Name: python-%{original_name}
 Version: %{version}
 Release: %{release}
-Source0: %{name}-%{unmangled_version}.tar.gz
+Source0: %{original_name}-%{unmangled_version}.tar.gz
 License: MIT license
 Group: Development/Libraries
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
@@ -21,7 +21,7 @@
 UNKNOWN

 %prep
-%setup -n %{name}-%{unmangled_version}
+%setup -n %{original_name}-%{unmangled_version}

 %build
 python setup.py build

RPMを生成します。

~$ rpmbuild -ba ~/rpmbuild/SPECS/python-pywinrm.spec
  :
~$ ls ~/rpmbuild/RPMS/noarch
python-pywinrm-0.1.1-1.noarch.rpm

できたRPMを、Ansible制御マシンへコピーしてインストールします。(またはインターナルなyumリポジトリへ置いてインストール)

~$ sudo yum localinstall python-pywinrm-0.1.1-1.noarch.rpm

Windowsを管理ノードとするときWinRM接続にActive Directoryユーザー認証するためのkerberosの入手とインストール

Active Directoryのドメイン参加Windowsへドメインユーザーで認証する場合、パスワード認証ではなくKerberos認証が必要です。
それには、CentOSのKerberos認証クライアントパッケージを入れて設定し、pythonモジュールのkerberosをインストールします。

CentOSのKerberos認証設定

Kerberos認証に必要なパッケージをインストールします。

~$ sudo yum install krb5-workstation

/etc/krb5.conf を編集します。デフォルトでサンプルのレルム名、KDCサーバー、ドメイン名対応が記載されているので、実際に使用するActive Directoryドメイン名に合わせて変更します。

@@ -4,7 +4,7 @@
  admin_server = FILE:/var/log/kadmind.log

 [libdefaults]
- default_realm = EXAMPLE.COM
+ default_realm = BRAVO.LOCAL
  dns_lookup_realm = false
  dns_lookup_kdc = false
  ticket_lifetime = 24h
@@ -12,11 +12,11 @@
  forwardable = true

 [realms]
- EXAMPLE.COM = {
-  kdc = kerberos.example.com
-  admin_server = kerberos.example.com
+ BRAVO.LOCAL = {
+  kdc = ad.bravo.local
+  admin_server = ad.bravo.local
  }

 [domain_realm]
- .example.com = EXAMPLE.COM
- example.com = EXAMPLE.COM
+ .bravo.local = BRAVO.LOCAL
+ bravo.local = BRAVO.LOCAL

また、Active DirectoryのDNSを参照するようにしておきます(/etc/resolv.conf のnameserverにActive Directory DNSサーバーのIPアドレスを記述)。

pythonモジュールのkerberosインストール

pythonモジュールのkerberosをインストールします。

~$ sudo yum install python-devel python-kerberos

Kerberos認証の動作確認

まず、制御マシン上でAnsibleのWinRM接続に使うActive DirectoryドメインユーザーのKerberos認証を実行しておきます。

~$ kinit foobar@BRAVO.LOCAL
~$ klist
Ticket cache: FILE:/tmp/krb5cc_12345
Default principal: foobar@BRAVO.LOCAL

Valid starting     Expires            Service principal
02/07/16 08:00:10  02/07/16 18:00:13  krbtgt/BRAVO.LOCAL@BRAVO.LOCAL
        renew until 02/14/16 08:00:10

接続確認用にインベントリファイル(~/work/hosts)を作成します。

[windows]
neckar

[windows:vars]
ansible_user=foobar@bravo.local
ansible_connection=winrm

ansibleコマンドで接続確認(win_ping)します。

work$ ansbile neckar -i ./hosts -m win_ping

接続確認のエラーと対応

Unspecified GSS failure
work$ ansbile neckar -i ./hosts -m win_ping
neckar | FAILED! => {
    "failed": true,
    "msg": "ERROR! kerberos: (('Unspecified GSS failure.  Minor code may provide
 more information', 851968), ('Cannot determine realm for numeric host address',
 -1765328141)), ssl: 401 Unauthorized." 
}

考えられる原因

  • kinit でKerberos認証を実施していない
  • 接続先の管理ノードがOS側で名前解決できない
    → インベントリファイルにansible_hostでIPアドレスを指定していましたが、Kerberos認証ではOS側でも名前解決が必要です。

クリップボードから画像を追加 (サイズの上限: 1 GB)