Python
Cloud
devops
Ansible
AnsibleDay 24

Ansible Oneviewの実践!! -AnsibleでBear-metal as a Serviceを創る-

クリスマスイブですね-。今年はサンタがAnsibleでプレゼントデプロイ自動化するみたいなので、楽しみにしています。我が家はちゃんとSanta_Inventory.iniの19131行目に登録されています。oO(なにそれ

さて。今年はなんかAnsibleが浸透した1年でしたねー。もぅ世の中のセットアップは全部Ansibleでアプリデプロイはk8sで良いんじゃないかという感じです。CNCF万歳!!

というところで、自分の番なのでガシガシと書きたいところなのですが、クリスマス執筆祭りに追われており、ちょっとお待ち下さい…。クソ長いのでアジャイル的に公開更新していきます。暇がある時に読んで下さい。

【宣伝.1】GitLab実践ガイド
2018/2/1にでるよー。よかったら書店で御覧ください。

【宣伝.2】Ansible実践ガイド
Kindle版いまなら半額!! 1,728円!!(2017/12/27まで)
※キャンペーン終わりました。購入いただいた方ありがとうございます!

1. 本記事の概要

今回は何度となく外部登壇で紹介だけしているAnsible Tower & HPE Synergyのセットアップ方法をご紹介したいなとおもいます。(誰得…
HPE Synergyってなんぞや?って方は以下を御覧ください。
Red Hat Forum 2017: Ansible Towerの実践!!エンタープライズのInfrastructure as Codeの現在

P00000263.JPG

要はAnsible TowerからHWのAPIをキックして、Bear-metal as a Serviceを実現しようジャマイカというお話です。と、ここまで話すと「あー。HWの紹介ね。」って感じの方もいらっしゃるかもしれないんですが、どちらかというと、Ansibleの3rd Party製モジュールを色々触る上での知識やTipsなんかを中心に紹介していきます。ということで、Bear-metal as a Serviceの世界をご堪能くだしぁ。

2. 構成に関して

今回の構成は以下のとおり。

  • Synergy with Image Streamer x1
  • Ansible Tower on VMware x1

Synergyとは別のサーバー上にAnsible Towerをセットアップし、外からOneView APIに対してOSのデプロイを司令します。もちろんPlaybookでAPIを呼ぶため、今回は「oneview-ansible」モジュールというCertifiedモジュールを利用します。

P00000264.JPG

2.1 セットアップの流れ

今回は大きく以下の流れでセットアップを行っていきます。

  1. Ansible Towerのセットアップ
  2. Oneview Ansible Moduleのセットアップ
  3. HPE Synergyのセットアップ
  4. Ansible Towerの設定と実装

2.2 構成のバージョン

今回は以下のバージョンを用いてセットアップを行いました。ここは少し注意して導入を行ってください。AnsibleのバージョンやPythonのバージョンが異なると動かないことがありますので、適宜調整いただければと思います。

対象 プロダクト バージョン
Ansible Towerサーバー RHEL 7.4
Python 2.7.14
oneview-anible 4.0.0
Ansible 2.4.1
Ansible Tower 3.2.1
HPE Synergy OneView 3.10

2.3 oneview-ansible moduleについて

oneview-ansibleモジュールのアップストリーム版は以下で展開されています。
■ oneview-ansible module
https://github.com/HewlettPackard/oneview-ansible

ただし、Ansibleのバージョン2.4以降、oneview-ansibleモジュールのいくつかがAnsibleパッケージ標準のRemote Management Modules群にはいっており、すぐに利用することができます。すでにAnsible標準に対応しているOneviewモジュールは以下です。

Oneviewモジュール 内容
oneview_ethernet_network Manage OneView Ethernet Network resources
oneview_ethernet_network_facts Retrieve the facts about one or more of the OneView Ethernet Networks
oneview_fc_network Manage OneView Fibre Channel Network resources.
oneview_fc_network_facts Retrieve the facts about one or more of the OneView Fibre Channel Networks
oneview_fcoe_network Manage OneView FCoE Network resources
oneview_fcoe_network_facts Retrieve the facts about one or more of the OneView FCoE Networks
oneview_network_set Manage HPE OneView Network Set resources
oneview_network_set_facts Retrieve facts about the OneView Network Sets
oneview_san_manager Manage OneView SAN Manager resources

3. Ansible Towerのセットアップ手順

なにはともあれ、Ansible Towerをインストールしましょう。今回はVM上のRHELにTowerをインストールします。ドキュメントが充実しているので、公式ページをなぞっていけばできるのですが、RHELだったら何するんだっけ?って時のために記載しておきます。

3.1 RHEL(RedHat Enterprise Linux)の初期セットアップ

まずはRHELの初期セットアップです。このあたりは環境によってそれぞれ異なるので、適宜設定をしてください。自分はこれらを設定してますというメモ。

3.1.1 OSの基本設定

IPv6って大事ですよね。はい。

ipv6_disabled
$ sudo vi /etc/sysctl.d/disable_ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

$ sudo sysctl -p /etc/sysctl.d/disable_ipv6.conf

企業だとProxyを使われていることがほとんどだと思いますので、Proxyを設定します。

env_setting
$ sudo vi /etc/environment
http_proxy="http://proxy.ansible.example.com:8080"
https_proxy="http://proxy.ansible.example.com:8080"
ftp_proxy="http://proxy.ansible.example.com:8080"
no_proxy="192.168.*,10.*,*.local,*.net"

$ sudo vi /etc/yum.conf
(追加)
proxy=http://proxy.ansible.example.com:8080

$ sudo vi /etc/rhsm/rhsm.conf
(追加)
# an http proxy server to use
proxy_hostname = proxy.ansible.example.com
# port for http proxy server
proxy_port = 8080

あとは環境に合わせてOSに必要な設定を

hostname_setting
$ sudo hostnamectl set-hostname --static ansible-tower01

$ sudo visudo
(追加)
Defaults    timestamp_timeout = 300

3.1.2 サブスクリプションの登録

RHEL使うときはサブスクライブしましょ。これ大事。

rhel_subscribe
$ sudo subscription-manager register \
--username \<username\> \
--password \<password\> \
--autosubscribe

## 登録解除はこちら
$ sudo subscription-manager unregister

3.2 RHEL Ansible Towerのインストール

それでは早速Ansible Towerをインストールしていきます。

3.2.1 Towerの前提条件

構成の前提条件は、公式ドキュメントが一番なので、こちらをご確認ください。
http://docs.ansible.com/ansible-tower/latest/html/quickinstall/prepare.html#prerequisites-and-requirements

サポートOSは以下です。

  • Red Hat Enterprise Linux 7.2 or later 64-bit
  • CentOS 7.2 or later 64-bit
  • Ubuntu 14.04 LTS 64-bit
  • Ubuntu 16.04 LTS 64-bit

3.2.2 Yumのリポジトリ登録

TowerのインストールはYumを利用します。そのため、必要なリポジトリをあらかじめ登録し、アップデートしておきましょう。

yum_updated
$ sudo subscription-manager repos --list-enabled |grep extra
$ sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
$ sudo subscription-manager repos --list-enabled |grep extra
$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum -y update

3.2.3 Ansibleのインストール

Towerの前にAnsibleをインストールしておきます。Ansible単体でインストールしておくとvirtualenvやpyenvを利用して入れることもありますが、TowerではOSにインストールされたAnsibleを利用するためYumで入れておきます。また、Ansible実行ユーザーの配下に「ansible.cfg」だけ設定しておきましょ。

ansible_install
$ sudo yum -y install ansible
$ ansible --version
ansible 2.4.1.0
  config file = $HOME/.ansible.cfg
$ vi $HOME/.ansible.cfg

Configの内容は以下みたいな感じ

$HOME/.ansible.cfg
[defaults]
forks = 15
retry_files_enabled = false
log_path = $HOME/.ansible/ansible.log
host_key_checking = false

3.2.4 Towerのインストール

やっとTowerをインストールできる所まで来ましたので、Towerをインストールします。今回はバージョン3.2.1のTowerを使用していますが、適宜更新してください。

tower_setup
$ mkdir -v ~/src && cd ~/src
$ curl -O https://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz
$ tar zxvf ./ansible-tower-setup-latest.tar.gz
$ cd ./ansible-tower-setup-3.2.1/
$ vi ./inventry

Towerのインストールはインベントリの設定を行うだけです。ローカルホストにインストールする場合に変更しなければいけないのが以下のパラメーターです。

  • admin_password (Towerの管理者パスワード)
  • pg_password (PostgreSQLの管理者パスワード)
  • rabbitmq_password (RabbitMQの管理者パスワード)
inventory
[tower]
localhost ansible_connection=local

[database]

[all:vars]
admin_password='password'

pg_host=''
pg_port=''

pg_database='awx'
pg_username='awx'
pg_password='password'

rabbitmq_port=5672
rabbitmq_vhost=tower
rabbitmq_username=tower
rabbitmq_password='password'
rabbitmq_cookie=cookiemonster

# Needs to be true for fqdns and ip addresses
rabbitmq_use_long_name=false

Towerのインストールはとても簡単。シェルというなのAnsibleコマンドの羅列をキックするだけ

tower_install
$ sudo ./serup.sh

無事インストールスクリプトが終わったら、Ansible Towerサーバーにブラウザからアクセスし、先程「admin_password」に登録したパスワードでログインしてみましょう。

P00000265.JPG

ほら素敵。Ansible Towerがインストールできましたー。初回時のログイン時にサブスクリプション登録が聞かれるので、入れておきましょう。
サブスクリプション無いよって方は、Trial版も利用できます。Towerのライセンスに関する詳細はこちらから。
http://docs.ansible.com/ansible-tower/3.1.4/html_ja/installandreference/updates_support.html

と。ここまでは誰でもできるインストール。ここからが本題です。

4. Oneview Ansible Moduleのセットアップ

ここからが意外とハマりどころ。そもそもAnsible TowerのではOSのパッケージに含まれるAnsibleを利用することが前提とされているため、Pythonのライブラリなどはシステムに入っているPythonが利用されます。ところが、3rd Partyのモジュールを利用すると、Pythonのバージョンや必要なライブラリが指定されていることもちらほら。
今回利用する「oneview-ansible」もその一つで、必須要件はこちら。

  • Ansible >= 2.1
  • Python >= 2.7.9
  • HPE OneView Python SDK (Install HPE OneView Python SDK)

ところが、RHEL7.4でAnsibleを入れると、こちら。はい。惜しいですね。

  • Ansible = 2.4
  • Python = 2.7.5

ということで、Tower上からoneview-ansibleモジュールが利用できるように設定していきます。

4.1 Python(2.7.14)のインストール

まずは2.7.14のPythonをインストールしましょう。通常であればpyenvなどを利用すると便利なのですが、Ansible Towerなので、漢は黙ってコンパイル。ということでソースコードからインストールします。

4.1.1 事前にライブラリをインストール

Pythonをコンパイルするときは、これを忘れると大変なことになります。Ansibleを実行するたびに、あのライブラリがないとか、このライブラリが無いとか怒られるので、入れておきます。

library_install
$ sudo yum -y install zlib-devel openssl-devel libselinux-python

4.1.2 Pythonのコンパイル

今回はコンパイルして「/usr/local/bin/python」にランタイムを配備しておきます。更にAnsible内で利用するPythonはこの最新版を利用するよう設定します。

python_install
$ cd ~/src
$ curl -O https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz
$ tar xvf ./Python-2.7.14.tar.xz
$ cd ./Python-2.7.14/
$ ./configure --enable-optimizations
$ make
$ make test
$ sudo make install
$ /usr/local/bin/python --version
Python 2.7.14

4.2 HPE OneView Python SDKのセットアップ

次に、OneViewで必要なPythonのSDKをインストールし、OneView接続用のクレデンシャル情報を設定します。

4.2.1 SDKのインストール

SDKはpipからインストールしても、ソースからインストールしても構いませんが、メンテナンス性を考えるとpipからがオヌヌメ。

sdk_install
$ cd ~/src
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo /usr/local/bin/python ./get-pip.py
$ pip install dnspython  ##必要なパッケージを事前にインストール

## pipからインストール
$ pip install hpOneView

## ソースからインストール
$ cd ~/src
$ git clone https://github.com/HewlettPackard/python-hpOneView.git
$ cd ./python-hpOneView/
$ sudo /usr/local/bin/pip install .

4.2.2 クレデンシャルの設定

またこの時点で、Oneviewへの接続情報(クレデンシャル情報)を設定しておきます。Oneview専用モジュールをPlaybook内で利用する際は、常にこのファイルのパスを指定する必要があります。

credential_deploy
$ sudo mkdir -v /usr/local/etc/oneview
$ sudo vi /usr/local/etc/oneview/oneview_config.json

Credentialの書き方はこちらを参照。特にOneViewのバージョン情報を正しく設定する必要があるので注意です。

OneView APIバージョン 設定
2.0 API version 200
3.0 API version 300
3.10 API version 500
oneview_config.json
{
  "ip": "<Synergy OneView IP Address>",
  "image_streamer_ip": "<Synergy ImageStreamer IP Address>",
  "credentials": {
    "userName": "Administrator",
    "authLoginDomain": "",
    "password": "password"
  },
  "api_version": 500
}

4.3 oneview-ansible moduleの配置

SDKをPythonにロードできた次は、3rd Party製のモジュールライブラリを展開します。通常3rd Party製のモジュールは、Ansible実行時のカレントディレクトリ直下のlibraryというディレクトリ内、もしくは「/usr/share/ansible」に配置しておきます。すると、Ansible実行時に勝手にロードされて利用できます。
もしモジュールライブラリのパスを変えたいというときは、以下のように環境変数で切り替えることも可能です。

libpath_setting
export ANSIBLE_LIBRARY=/srv/modules/custom_modules:/srv/modules/vendor_modules

では、実際にモジュールライブラリを配備しましょう。ここで重要なのがAnsible Towerの場合プロジェクトごとにライブラリをlibraryに配置すると、どれを読み込んでいるかわからなくなるので、Ansible Tower上の「/usr/share/ansible」に配置することをおすすめします。

oneview-ansible_deploy
$ sudo mkdir -v /usr/share/ansible
$ cd /usr/share/ansible
$ sudo git clone https://github.com/HewlettPackard/oneview-ansible.git

4.4 Ansible OneView 接続テスト

お待たせしました。やっと×3です!!
やっと、Ansible Oneviewが使えるようになったので、まずはAnsible Tower経由ではなく、ansible-playbookコマンドから接続してみましょう。今回利用するPlaybookは単純にServer情報(Server Profile Template:IS-RHEL7.3-SY480Gen9-Template-Ansible)を取得するものです。
ここで注意するのは、Ansible Python Interpreterに先程コンパイルした新しいPythonを指定しておくことです。これによって、OneView Python SDKが読み込まれモジュールを実行できます。

test.yaml
- name: Test OneView Connection
  hosts: localhost
  connection: local
  gather_facts: false

  vars:
    ansible_python_interpreter: "/usr/local/bin/python"
    oneview_config: "/usr/local/etc/oneview/oneview_config.json"

  tasks:
    - name: Gather facts about the Server Profile Template
      oneview_server_profile_template_facts:
        config: "{{ oneview_config }}"
        name: "IS-RHEL7.3-SY480Gen9-Template-Ansible"
      register: server_profile_template_results

    - name: Debug facts about the Server Profile Template
      debug:
        var: server_profile_template_results

そして、これらを実施する方法は以下。

ansible_test```
$ mkdir -v ~/test && cd ~/test
$ vi ./test.yaml ##Playbookを配置

## もしoneview ansibleライブラリを、/usr/share/ansible以外の場所においた場合
$ ln -s /usr/local/lib/oneview-ansible/library library
$ ls -la
total 4
drwxrwxr-x. 2 shkitayama shkitayama  38 Dec  5 15:27 .
drwx------. 7 shkitayama shkitayama 148 Dec  5 15:10 ..
lrwxrwxrwx. 1 shkitayama shkitayama  38 Dec  5 15:25 library -> /usr/local/lib/oneview-ansible/library
-rw-rw-r--. 1 shkitayama shkitayama 627 Dec  5 15:21 test.yaml

## 実施
$ ansible-playbook ./test.yaml

あとは成功することを祈りましょう。

5. Ansible Towerのセットアップ

いよいよTowerのセットアップを行います。その前にAnsible TowerがロードするPlaybookを配備しておきましょう。

$ sudo mkdir /var/lib/awx/projects/oneview
$ sudo ln -s /usr/local/lib/oneview-ansible/library /var/lib/awx/projects/oneview/library
$ sudo cp -vi ~/test/test.yaml /var/lib/awx/projects/oneview/
$ sudo chown -R awx:awx /var/lib/awx/projects/oneview

[設定]>[ユーザー]>[USERの作成]
ansible user
[設定]>[組織]>[HPE]
HPE

[プロジェクト プロジェクトの作成
OneView Project
[プロジェクト]>[OneView Project]>[パーミッション]
Ansible Permission

インベントリー インベントリーの作成

インベントリー]OneView パーミッション

テンプレート ジョブテンプレートの作成
AnsibleOneview Demo Template
[設定]>[認証情報]>[認証情報の編集] @@@@
oneview