Edited at
AnsibleDay 24

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

More than 1 year has passed since last update.

クリスマスイブですね-。今年はサンタが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