クリスマスイブですね-。今年はサンタが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の現在
要は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モジュールを利用します。
2.1 セットアップの流れ
今回は大きく以下の流れでセットアップを行っていきます。
- Ansible Towerのセットアップ
- Oneview Ansible Moduleのセットアップ
- HPE Synergyのセットアップ
- 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って大事ですよね。はい。
$ 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を設定します。
$ 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に必要な設定を
$ sudo hostnamectl set-hostname --static ansible-tower01
$ sudo visudo
(追加)
Defaults timestamp_timeout = 300
###3.1.2 サブスクリプションの登録
RHEL使うときはサブスクライブしましょ。これ大事。
$ 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を利用します。そのため、必要なリポジトリをあらかじめ登録し、アップデートしておきましょう。
$ 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」だけ設定しておきましょ。
$ sudo yum -y install ansible
$ ansible --version
ansible 2.4.1.0
config file = $HOME/.ansible.cfg
$ vi $HOME/.ansible.cfg
Configの内容は以下みたいな感じ
[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を使用していますが、適宜更新してください。
$ 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の管理者パスワード)
[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コマンドの羅列をキックするだけ
$ sudo ./serup.sh
無事インストールスクリプトが終わったら、Ansible Towerサーバーにブラウザからアクセスし、先程「admin_password」に登録したパスワードでログインしてみましょう。
ほら素敵。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を実行するたびに、あのライブラリがないとか、このライブラリが無いとか怒られるので、入れておきます。
$ sudo yum -y install zlib-devel openssl-devel libselinux-python
4.1.2 Pythonのコンパイル
今回はコンパイルして「/usr/local/bin/python」にランタイムを配備しておきます。更にAnsible内で利用するPythonはこの最新版を利用するよう設定します。
$ 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からがオヌヌメ。
$ 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内で利用する際は、常にこのファイルのパスを指定する必要があります。
$ 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 |
{
"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実行時に勝手にロードされて利用できます。
もしモジュールライブラリのパスを変えたいというときは、以下のように環境変数で切り替えることも可能です。
export ANSIBLE_LIBRARY=/srv/modules/custom_modules:/srv/modules/vendor_modules
では、実際にモジュールライブラリを配備しましょう。ここで重要なのがAnsible Towerの場合プロジェクトごとにライブラリをlibraryに配置すると、どれを読み込んでいるかわからなくなるので、Ansible Tower上の「/usr/share/ansible」に配置することをおすすめします。
$ 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が読み込まれモジュールを実行できます。
- 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