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



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

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

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

【宣伝.1】[GitLab実践ガイド](http://amzn.asia/4Yxxjhj)
2018/2/1にでるよー。よかったら書店で御覧ください。

【宣伝.2】[Ansible実践ガイド](https://www.amazon.co.jp/Ansible%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%8C%97%E5%B1%B1%E6%99%8B%E5%90%BE-ebook/dp/B01NAH7NAA/)
~~Kindle版いまなら半額!! 1,728円!!(2017/12/27まで)~~ 
※キャンペーン終わりました。購入いただいた方ありがとうございます！

#1. 本記事の概要
今回は何度となく外部登壇で紹介だけしている**Ansible Tower & HPE Synergy**のセットアップ方法をご紹介したいなとおもいます。(誰得…
HPE Synergyってなんぞや？って方は以下を御覧ください。
[Red Hat Forum 2017: Ansible Towerの実践!!エンタープライズのInfrastructure as Codeの現在](https://www.slideshare.net/ShingoKitayama/red-hat-forum-2017-ansible-towerinfrastructure-as-code)

![P00000263.JPG](https://qiita-image-store.s3.amazonaws.com/0/151157/837d97c3-e07b-68e1-b626-f8ce4af52796.jpeg)

要は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](https://qiita-image-store.s3.amazonaws.com/0/151157/4686e544-524f-1e60-aa4e-d00c8bb47d12.jpeg)

## 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モジュール](http://docs.ansible.com/ansible/latest/list_of_remote_management_modules.html#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をインストールします。ドキュメントが充実しているので、[公式ページ](http://docs.ansible.com/ansible-tower/latest/html/quickinstall/prepare.html)をなぞっていけばできるのですが、RHELだったら何するんだっけ?って時のために記載しておきます。

##3.1 RHEL(RedHat Enterprise Linux)の初期セットアップ
まずはRHELの初期セットアップです。このあたりは環境によってそれぞれ異なるので、適宜設定をしてください。自分はこれらを設定してますというメモ。
###3.1.1 OSの基本設定
IPv6って大事ですよね。はい。

```sh: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を設定します。

```shell: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に必要な設定を

```shell:hostname_setting
$ sudo hostnamectl set-hostname --static ansible-tower01

$ sudo visudo
(追加)
Defaults    timestamp_timeout = 300
```

###3.1.2 サブスクリプションの登録
RHEL使うときはサブスクライブしましょ。これ大事。

```shell: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を利用します。そのため、必要なリポジトリをあらかじめ登録し、アップデートしておきましょう。

```shell: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」だけ設定しておきましょ。

```shell:ansible_install
$ sudo yum -y install ansible
$ ansible --version
ansible 2.4.1.0
  config file = $HOME/.ansible.cfg
$ vi $HOME/.ansible.cfg
```
Configの内容は以下みたいな感じ

```cfg:$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を使用していますが、適宜更新してください。

```shell: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の管理者パスワード)

```ini: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コマンドの羅列をキックするだけ

```shell:tower_install
$ sudo ./serup.sh
```

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

![P00000265.JPG](https://qiita-image-store.s3.amazonaws.com/0/151157/abd25318-9fed-ced6-7fdc-8c11004cccb1.jpeg)

ほら素敵。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を実行するたびに、あのライブラリがないとか、このライブラリが無いとか怒られるので、入れておきます。

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

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

```shell: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からがオヌヌメ。

```shell: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内で利用する際は、常にこのファイルのパスを指定する必要があります。

```shell:credential_deploy
$ sudo mkdir -v /usr/local/etc/oneview
$ sudo vi /usr/local/etc/oneview/oneview_config.json
```
Credentialの書き方は[こちらを参照](https://github.com/HewlettPackard/python-hpOneView#configuration)。特にOneViewの[バージョン情報](https://github.com/HewlettPackard/oneview-ansible#4-setting-your-oneview-version
)を正しく設定する必要があるので注意です。

|OneView APIバージョン| 設定  |
|:-------------------|:------|
|2.0 API version     |200   |
|3.0 API version     |300   |
|3.10 API version    |500   |


```json: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実行時に勝手にロードされて利用できます。
もしモジュールライブラリのパスを変えたいというときは、以下のように環境変数で切り替えることも可能です。

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

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

```shell: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が読み込まれモジュールを実行できます。

```yaml: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
```

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

```shell: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