okinawa open days 2015 handson - ansible

61
OpenStack をさらに”使う”技術 Docker/Ansible 編 Ansible を利用した自動化を体験する Hideki Saito (@saito_hideki) openstack Open source software to build public and private clouds.

Upload: hideki-saito

Post on 15-Apr-2017

3.840 views

Category:

Technology


0 download

TRANSCRIPT

OpenStack をさらに”使う”技術Docker/Ansible 編

Ansible を利用した自動化を体験するHideki Saito (@saito_hideki)

openstackOpen source software to build public and private clouds.

who am i

● 氏名 : 齊藤 秀喜 (@saito_hideki)● 所属 :

– 株式会社インターネットイニシアティブ– 日本 OpenStack ユーザ会

● 著書 :● OpenStack クラウドインテグレーション● ISBN13:978-4798139784

目次● はじめに

– Ansible の概要

● ハンズオン前編– 1. インストール– 2. 実際に使ってみる

● ハンズオン後編– 3. Playbook でワークフローを実現する– 4. OpenStack と Ansible の連携

はじめに

このハンズオンでは、 OpenStack 上に構築したクラウド基盤と、ワークフローを自動化するためのツールである Ansibleを組み合わせた、システムの構築・運用を自動化する手法を紹介します。

前セッションの Docker コンテナを利用した Etherpad サイトの構築手順をもう一歩進めて自動化してみましょう。

ワークフローの自動化を体験する

Ansible のようなツールを利用して、ワークフローを自動化すれば、多くのメリットが得られます。

ワークフローの自動化を体験する

✔ 何度も繰り返される作業は、人間ではなく Ansible が実施する✔ Ansible の Playbook( ワークフローを記述した定義ファイル ) をステージング環境

に適用して成功すれば、本番環境でもミスなく安全に作業が行える✔ 作業内容を機械的にも人的にもレビューしやすくなる✔ 人ではなくコンピュータが実行するので作業実施時間の見積もりも立てやすい

このような定形作業は Ansible の得意分野

Ansible は単発の仕事を自動化するだけでなく、複数の仕事を順序だててまとめたワークフローの自動化を実現します。さらに、外部インベントリを利用することで、従来の構成管理ツールが苦手としていた、管理対象の変化にも柔軟に対応できるのが特徴です。

Ansible の概要

キーワード 概要

エージェントレス 管理対象ノードに専用エージェントを導入する必要がない※Python2.4以降のランタイムが事実上必須

外部インベントリ 専用の構成管理データベースを持たず、必要に応じて外部システムの構成管理情報を参照する方式を採用している

すぐに利用可能 多数のモジュールが標準で提供されている。

シナリオ実行 多くの小さなタスクを1つにまとめることができる。 さらに、タスクの実行結果による条件分岐や繰り返し処理などの制御構造も記述可能

ドキュメントの充実 公式サイトのドキュメントが高品質で充実しており、ゼロからのスタートアップがしやすい

Ansible の主な構成要素Ansible は大きく以下の要素から構成されています。次章では Ansible を実際に利用しつつ、その仕組を解説します。

Ansible の概要

Module

Playbook

Plugin

Inventory

ファイルの転送、サービスの起動停止など Ansibleに行わせる作業がモジュールとして提供さている

Ansible に行わせる一連の作業の流れをまとめたものChef では recipe 、 Puppet では manifest にあたる

Ansible が作業時に利用する callbackモジュール群

動的にターゲットホストを取得してグループ化するDynamic Inventoryプログラム

Ansible の概要1. UNIXホストに対する操作

Ansible Host SSHSSHTarget Node

python>=2.4

Ansible Host WinRMWinRMTarget Node

PowerShell>=v3

Ansible Host Netconf over SSH

Netconf over SSH

Target NetworkDevice

2. Windowsホストに対する操作

3. Netconf を利用したネットワークスイッチ操作

Ansible の概要

Ansible

実行可能ファイル

実行可能ファイル

pingモジュール

インベントリインベントリ

sshdsshd

11

33

44

利用するモジュールを指定する

指定されたグループのホスト群に関する情報を取得する

モジュールから実行プログラムを生成する

実行プログラムを sftp/scp で転送する

転送先のホスト上でプログラムを実行する

Ansible の基本的な挙動単発の仕事を行う ansible コマンドを例に図示します。

22

実行

Ansible の概要 :5コマンドラインインターフェイス以降のハンズオンで利用するコマンドラインは以下の通りです。

1. モジュールを適用して単発のタスクを実行する$ ansible --version

$ ansible < フィルタ文字列 > -i インベントリファイル名 -m モジュール名

$ ansible < フィルタ文字列 > -i インベントリファイル名 -m モジュール名 -a "key=value"

2. 複数のモジュールから構成された Playbook を適用する$ ansible-playbook -i インベントリファイル名 Playbook ファイル

$ ansible-playbook -i インベントリファイル名 -e "key=value" Playbook ファイル

3. モジュールの利用方法を表示する$ ansible-doc モジュール名

ハンズオン前編~インストール ~

現状のハンズオン環境ansible を動作させるサーバ

仮想マシンインスタンス間を結ぶ内部ネットワーク

外部接続用ネットワークと内部ネットワーク間を結ぶ仮想ルータ

仮想マシンインスタンスの外部接続用ネットワーク

1. インストール1-1.Ansible が操作対象ノードへの SSH接続に利用するキーペアを作成する

$ ssh-keygen -t rsa -b 2048Generating public/private rsa key pair.Enter file in which to save the key (/home/centos/.ssh/id_rsa): <enter キー >Enter passphrase (empty for no passphrase): パスフレーズ <enter キー >Enter same passphrase again: パスフレーズ <enter キー >...

1-2.EPELリポジトリをインストールする

$ sudo yum install -y \http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

1-3. インストール済みのパッケージ群を最新の状態に更新し再起動する

$ sudo yum update -y$ sudo reboot

1-4.Ansible の最新モジュールを公式リポジトリから取得するOpenStack を操作するためのモジュール群は、現在のリリースバージョン (1.9.4)から大きく改善されているためハンズオンでは最新版を利用する。Ansible の最新モジュールは github 上の公式リポジトリで公開されいるため、 gitパッケージをダウンロードして最新モジュールを checkout して利用できるようあらかじめ準備しておく。

$ sudo yum install -y git$ sudo yum install -y ansible

1-5.Ansible のバージョンを確認する

$ ansible --versionansible 1.9.4 configured module search path = None

1. インストール

2015.12.10時点での最新バージョンは 1.9.4 です

1. インストール2-1. インベントリファイルを作成するAnsible が操作対象ノードを識別するために必要となるインベントリファイル (ansible_hosts)を作成する。

$ cd ~$ cat << EOF > ~/ansible_hosts[localhost]127.0.0.1 ansible_connection=localEOF

2-2. Ansibleモジュール利用して動作確認するAnsible は、対象ホストが操作可能であるかを確認するために pingモジュールを提供している。これを利用してローカルホストが操作可能であることを確認する。

$ ansible localhost -i ~/ansible_hosts -m ping127.0.0.1 | success >> { "changed": false, "ping": "pong"}

localhost に対して操作が成功 (success) したことを確認する

1. インストール2-3. Ansibleから OpenStack を操作するための準備Ansible が新たに提供する OpenStack 用モジュール (os_*) は、 OpenStack Infra で提供されるshade ライブラリから OpenStack 環境を操作する仕組みになっています。

※以前のモジュールは、 python-novaclient などのクライアントライブラリを直接利用していました

OpenStack 環境を操作するモジュールを利用する前に、あらかじめ python の virtualenv 環境に pip を利用して shade ライブラリを含めた依存するライブラリ群をインストールします。

$ cd ~$ sudo yum groupinstall -y "Development Tools"$ sudo yum install -y python-devel python-virtualenv$ virtualenv ~/handson$ source ~/handson/bin/activate(handson)$ pip install shade functools32

virtualenv 環境 (handson) に切り替えると、プロンプトが (handson) に変更され、切り替え後に pip でインストールするモジュール (*) は ~/handson以下にインストールされる。※この中には shade が依存している python-novaclient(nova コマンド ) なども含まれる

1. インストール2-4. OpenStack 環境への接続性を確認する

(handson)$ source ~/openrc(handson)$ nova list+--------------------------------------+-------------+-~-+-------------+---------------------------------------+| ID | Name | ~ | Power State | Networks |+--------------------------------------+-------------+-~-+-------------+---------------------------------------+| 26a6bd31-7496-4560-bc2e-bbcf8ed52bfa | step-server | ~ | Running | work-net=172.16.100.2, 192.168.253.31 |+--------------------------------------+-------------+-~-+-------------+---------------------------------------+

virtualenv 環境で nova コマンドを利用した仮想マシンインスタンスのリストが取得できたことを確認する

1. インストール3-1. 最新の Ansibleモジュールを checkout して利用する(handson)$ mkdir ~/ansible && cd ~/ansible(handson)$ git clone https://github.com/ansible/ansible.git(handson)$ git clone https://github.com/ansible/ansible-modules-core.git

3-2. 設定ファイルを作成し checkout したモジュールのパスを指定する(handson)$ cat << EOF > ~/.ansible.cfg[defaults]Library=/home/centos/ansible/ansible-modules-core/cloudhost_key_checking = FalseEOF

3-3. ライブラリパスの設定が反映されていることを確認する(handson)$ ansible --versionansible 1.9.4 configured module search path = /home/centos/ansible/ansible-modules-core/cloud(handson)$ ansible-doc os_server

os_serverモジュールの使用法が表示されることを確認する※ansible-docから抜けるには :q[enter]

ハンズオン前編~実際に使ってみる ~

2. 実際に使ってみる2-1. 操作対象のサーバ情報を取得する

(handson)$ ansible localhost -i ansible_hosts -m setup127.0.0.1 | success >> { "_ansible_verbose_override": true, "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.16.100.2" ],...(中略 )...}

2-2. アドホックなコマンド実行

(handson)$ ansible localhost -i ansible_hosts -a "uname -r"127.0.0.1 | success | rc=0 >>3.10.0-229.20.1.el7.x86_64

ansible の操作対象となっているサーバの詳細情報を取得できるこの情報は他のモジュールのパラメータとして再利用することが可能

ansible が操作対象となっているサーバに SSH ログインし-a で指定されたコマンドを実行する

2. 実際に使ってみる2-3. ファイルの転送(handson)$ ansible localhost -i ansible_hosts \-m copy -a "src=~/openrc dest=/tmp/openrc.org"127.0.0.1 | success >> { "changed": true, "checksum": "237459e27de6617a0ec770216b9066f830e2a3ea", "dest": "/tmp/openrc.org", "gid": 1000, "group": "centos", "md5sum": "91f41bca4c0c8f81a530df676fd05aa6", "mode": "0664", "owner": "centos", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 183, "src": "/home/centos/.ansible/tmp/ansible-tmp-1449820592.16-56579232754242/source", "state": "file", "uid": 1000}(handson)$ md5sum /tmp/openrc.org91f41bca4c0c8f81a530df676fd05aa6 /tmp/openrc.org

$HOME/openrc が localhost:/tmp/openrc.orgにコピーされる※この例では localhost->localhost のコピーしますが localhost->remoteホストでも同様に動作します

2. 実際に使ってみる冪等性の担保Ansible が提供するほとんどのモジュールは、同一の操作対象ノードに対して同じ操作を行っても副作用がないことを保証しています。

2-3. ファイルの転送(handson)$ ansible localhost -i ansible_hosts \-m copy -a "src=~/openrc dest=/tmp/openrc.org"127.0.0.1 | success >> { "changed": true,...}(handson)$ ansible localhost -i ansible_hosts \-m copy -a "src=~/openrc dest=/tmp/openrc.org"127.0.0.1 | success >> { "changed": false,...}

$HOME/openrc が localhost:/tmp/openrc.orgにコピーされる操作対象ホストに変化があった => changed: true

コピー先に md5sum の結果が同じファイルがすでに存在しているため二度目の操作は実施されない操作対象ホストに変化なし => changed: false

2. 実際に使ってみる2-4. ファイルの取得

(handson)$ ansible 127.0.0.1 -i ansible_hosts \-m fetch -a "src=/etc/hosts dest=/tmp"127.0.0.1 | success >> { "changed": true, "checksum": "d83644438c9b506de63b597ae100e31588039022", "dest": "/tmp/127.0.0.1/etc/hosts", "md5sum": "fd5452809a45f2e28788086017a8e331", "remote_checksum": "d83644438c9b506de63b597ae100e31588039022", "remote_md5sum": null}(handson)$ md5sum /tmp/127.0.0.1/etc/hosts fd5452809a45f2e28788086017a8e331 /tmp/127.0.0.1/etc/hosts

操作対象ホストから /etc/hosts を取得して /tmp/127.0.0.1/etc/hosts に配置する

2. 実際に使ってみる2-5. パッケージをインストールする

(handson)$ ansible localhost -i ansible_hosts \-m yum -a "name=mlocate state=latest" -u centos -s127.0.0.1 | success >> { "changed": true,... ]}

UID:centos でログインして sudo(-s) で実行する

最新 (latest) の mlocateパッケージをインストールする

ハンズオン後編OpenStack と Ansible の連携

仕事をまとめる Playbookここまでは、 ansible コマンドにより単発の仕事を Ansible に実行させてきましたが、現実ではこのようが仕事が複数集まって手順として実施されることになります。Ansible は、仮想マシンインスタンスの作成のような手順を Playbook として定義して順序通り実行することが可能です。以降では Playbook 機能を利用して、 Ansible にまとまった仕事をさせてみましょう。

3: Playbook でワークフローを定義する

公開鍵の登録公開鍵の登録

セキュリティグループの作成セキュリティグループの作成

仮想マシンの起動仮想マシンの起動

実行順序は常に保証される必要がある

AnsiblePlaybook

11

22

33

実行可能ファイル実行可能ファイル

Playbook:create_instance.yml

3: Playbook でワークフローを定義する

Ansible

os_keypair

sshdsshd

11

22

Playbook の仕組み3->4 の動きを Playbook に記述された順に実行します

os_security_group

os_security_group

os_security_group_rule

os_server

quantum_floating_ip

実行可能ファイル実行可能ファイルos_keypair

実行可能ファイル

実行可能ファイル実行可能ファイル

実行可能ファイル実行可能ファイルos_keypair

実行可能ファイル

実行

インベントリインベントリ

33

44

1. インベントリファイル読み込み2. Playbook を読み込み3. モジュールを実行ファイルに変換4. 実行ファイルの転送と実行

3. Playbook でワークフローを定義する3-1. ハンズオン用 Playbook を取得する

(handson)$ cd ~(handson)$ git clone https://github.com/saito-hideki/ood2015.git(handson)$ ls ood2015/playbookscreate_instance.yml create_step.yml eplite_multinode.yml eplite_singlenode.yml

Filename Description

create_instance.yml公開鍵の登録 ->セキュリティグループの作成 ->仮想マシンインスタンスの作成を行う

create_step.yml step-server用インスタンスを作成する (今回は未使用 )

eplite_multinode.ymlepliteコンテナと epmysqlコンテナを別々のインスタンスで起動する

eplite_singlenode.yml epliteコンテナと epmysqlを1つのインスタンスで起動する

ハンズオン用 Playbook の機能

3. Playbook でワークフローを定義する3-2. Playbook の基本構造

Playbook は Ansible に行わせるワークフローを、 YAML形式で表現したシナリオのようなもので以下のような基本構造をもちます。

---- hosts: # 適用ホストを指定するフィルタ localhost

vars: # パラメータ hostname: "foo" # パラメータは key=value 形式で表現 packages: # リスト構造も利用可能 - httpd - mysql

tasks: # ワークフローとして実施する作業を実行順に定義 - hostname: # hostname モジュールでホスト名を設定する name: "{{ hostname }}" sudo: yes - yum: # yum モジュールでパッケージをインストールする state=latest name="{{ item }}" with_items: packages # 繰り返し処理や一定条件を満たした場合のみ実行するような制御も可能

4. OpenStack と Ansible の連携

Com

pute

Nod

e

VM#0

VM#1

VM#2

VM#3

VM#4

例1

例1例2例2

Playbook によるワークフローと OpenStack操作用モジュールを利用すると、Ansibleから OpenStack を制御することが可能です。

例1 . OpenStack API経由でリソースの作成・削除といった管理作業を実施例2 .仮想マシンのリストや IP アドレス情報を OpenStack の API を利用して取得し、

この IP アドレス経由でリモート・コントロールを実施

4. OpenStack と Ansible の連携

4-1. 事前準備として以下の2点を確認してください。

(1)step-server以外の仮想マシンが存在しないこと

➔ step-server以外の仮想マシンは削除してください

(2)step-server 用の floating-ip以外の floating-ip が存在しないこと

➔step-server以外の floating-ip は削除してください

EtherpadLite をデプロイするワークフロー仮想マシンインスタンスを起動して EtherpadLite を起動する手順を Playbook で実現してみましょう。ここでは、 create_instance.yml と eplite_singlenode.yml の2つのPlaybook で実現しています。

(1) step-server 上で作成済みの公開鍵を OpenStack 環境に登録する(2) eplite 用のセキュリティグループを作成する(3) 作成したセキュリティグループにルールを追加する(4) 仮想マシンインスタンス (eplite) を起動する(5) FloatingIP アドレスを取得する(6) 取得した FloatingIP アドレスを eplite に割り当てる(7) eplite にログインして MySQLコンテナをロードして起動する(8) eplite にログインして Etherpad コンテナをロードして起動する

4. OpenStack と Ansible の連携 (All-In-One)

仕事

の流

目標 : ハンズオン環境 (All-In-One)

ansible を動作させるインスタンス

仮想マシンインスタンス間を結ぶ内部ネットワーク

外部接続用ネットワークと内部ネットワーク間を結ぶ仮想ルータ

仮想マシンインスタンスの外部接続用ネットワーク

eplite と mysql を動作させるインスタンスを構築します

4. OpenStack と Ansible の連携 (All-In-One)

4-2. eplite インスタンスを起動する (create_instance.yml)(handson)$ ansible-playbook -i ansible_hosts \-e "hostname=eplite" ood2015/playbooks/create_instance.yml

PLAY [localhost] ************************************************************** GATHERING FACTS *************************************************************** ok: [localhost]TASK: [import keypairs] ******************************************************* changed: [localhost] => (item={...})TASK: [create security group] ************************************************* changed: [localhost] => (item={...})TASK: [add rules to secgroup] ************************************************* changed: [localhost] => (item=({'name': 'eplite', 'desc': 'secgroup for eplite'}, {...}))...TASK: [create servers] ******************************************************** changed: [localhost] => (item={...})TASK: [create and assign floating_ip to server] ******************************* changed: [localhost] => (item={...})PLAY RECAP ******************************************************************** localhost : ok=6 changed=5 unreachable=0 failed=0

公開鍵をインポートするタスク

セキュリティグループを作成するタスク

セキュリティグループにルールを追加するタスク

仮想マシンインスタンスを作成するタスク

FloatingIP アドレスを割り当てるタスク

4. OpenStack と Ansible の連携 (All-In-One)

4-3. eplite インスタンスが起動したことを確認する(handson)$ nova show eplite+---------------------------------+----------------------------------------------------------+| Property | Value |+---------------------------------+----------------------------------------------------------+...| flavor | m1.small (2) |...| image | Docker01 (2fcdd86d-094c-493f-93a0-7d0a22b83d6f) || key_name | step-server || metadata | {} || name | eplite |...| security_groups | eplite || status | ACTIVE |...| work-net network | 172.16.100.32, 192.168.253.110 |+---------------------------------+----------------------------------------------------------+

(handson)$ ssh [email protected][centos@eplite ~]$ hostnameeplite[centos@eplite ~]$ exit

flavorはm1.small

インスタンスは active状態

Docker01イメージで起動

公開鍵には step-serverを利用インスタンス名は "eplite"

FloatingIPアドレスがアサインされているFloatingIPアドレスに対して SSHログインすると ...インスタンス名がホスト名として設定されている

4. OpenStack と Ansible の連携 (All-In-One)

4-4. ansible_hosts に eplite のエントリを追記する

(handson)$ vi ~/ansible_hosts

[localhost]127.0.0.1 ansible_connection=local

[eplite]192.168.253.112 ansible_connection=ssh ansible_ssh_user=centos

4-5. ssh-agent に公開鍵のパスフレーズを登録する

(handson)$ eval `ssh-agent`(handson)$ ssh-addEnter passphrase for /home/centos/.ssh/id_rsa: 鍵のパスフレーズ Identity added: /home/centos/.ssh/id_rsa (/home/centos/.ssh/id_rsa)

FloatingIP アドレスは各自の環境に応じて修正してください

ssh-agent を利用して Ansibleから SSH ログインする際のパスフレーズ入力を省略します

4. OpenStack と Ansible の連携 (All-In-One)

4-6. eplite アプリケーションをデプロイする (eplite_singlenode.yml)

(handson)$ ansible-playbook -i ansible_hosts \-e "target=192.168.253.110" ood2015/playbooks/eplite_singlenode.yml

PLAY [eplite] *****************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.253.112]

TASK: [install require packages] ********************************************** changed: [192.168.253.112] => (item=python-docker-py)

TASK: [start epmysql] ********************************************************* changed: [192.168.253.112]

TASK: [start eplite] ************************************m********************** changed: [192.168.253.112]

PLAY RECAP ******************************************************************** 192.168.253.112 : ok=4 changed=3 unreachable=0 failed=0

dockerモジュールが必要とする python-docker-pyパッケージをインストールするタスク

epmysql コンテナをダウンロードして起動するタスク

eplitel コンテナをダウンロードして起動するタスク

Etherpad Lite の動作確認 (All-In-One)ブラウザから FloatingIP にアクセスしてみましょう

➔ http://192.168.253.112/

EtherpadLite をデプロイするワークフロー仮想マシンインスタンス (epapp/epmysql) を起動して、 epmysqlに MySQLコンテナを、 eapp に EtherpadLite コンテナを起動する手順を Playbook で実現してみましょう。create_instance.yml と eplite_multinode.yml の2つの Playbookで実現していますが、基本的な流れは All-in-One と同様です。

(1) step-server 上で作成済みの公開鍵を OpenStack 環境に登録する(2) eplite 用のセキュリティグループを作成する(3) 作成したセキュリティグループにルールを追加する(4) 仮想マシンインスタンス (epapp/epmysql) を起動する(5) FloatingIP アドレスを 2つ取得する(6) 取得した FloatingIP アドレスを epapp/epmysql に割り当てる(7) epmysql にログインして MySQLコンテナをロードして起動する(8) epapp にログインして Etherpad コンテナをロードして起動する

4. OpenStack と Ansible の連携 (Multi Node)

仕事

の流

目標 : ハンズオン環境 (Multi Node)

外部接続用ネットワークと内部ネットワーク間を結ぶ仮想ルータ

仮想マシンインスタンス間を結ぶ内部ネットワーク

ansible を動作させるインスタンス

mysql を起動させるインスタンスを構築します

eplite を起動させるインスタンスを構築します

仮想マシンインスタンスの外部接続用ネットワーク

4. OpenStack と Ansible の連携 (Multi Node)

4-7. eplite インスタンスを起動する (create_instance.yml)

(handson)$ ansible-playbook -i ansible_hosts -e "hostname=epmysql" \ood2015/playbooks/create_instance.ymlPLAY [localhost] *************************************************************...PLAY RECAP ******************************************************************** 127.0.0.1 : ok=6 changed=2 unreachable=0 failed=0

(handson)$ ansible-playbook -i ansible_hosts -e "hostname=epapp" \ood2015/playbooks/create_instance.ymlPLAY [localhost] *************************************************************...PLAY RECAP ******************************************************************** 127.0.0.1 : ok=6 changed=2 unreachable=0 failed

epmysql インスタンスを起動する

epapp インスタンスを起動する

4. OpenStack と Ansible の連携 (Multi Node)

4-7. FloatingIP アドレスを確認する

(handson)$ nova list+-.-+-------------+--------+-.-+-------------+-----------------------------------------+| . | Name | Status | . | Power State | Networks |+-.-+-------------+--------+-.-+-------------+-----------------------------------------+| . | epapp | ACTIVE | . | Running | work-net=172.16.100.37, 192.168.253.114 || . | eplite | ACTIVE | . | Running | work-net=172.16.100.36, 192.168.253.113 || . | epmysql | ACTIVE | . | Running | work-net=172.16.100.38, 192.168.253.115 || . | step-server | ACTIVE | . | Running | work-net=172.16.100.28, 192.168.253.31 |+-.-+-------------+--------+-.-+-------------+-----------------------------------------+

4. OpenStack と Ansible の連携 (Multi Node)

4-8.ansible_hosts に eplite のエントリを修正する

(handson)$ vi ~/ansible_hosts

[localhost]127.0.0.1 ansible_connection=local

[eplite]192.168.253.112 ansible_connection=ssh ansible_ssh_user=centos192.168.253.114 ansible_connection=ssh ansible_ssh_user=centos192.168.253.115 ansible_connection=ssh ansible_ssh_user=centos

[eplite:vars]epapp_fip = 192.168.253.114epmysql_fip = 192.168.253.115

FloatingIP アドレスは各自の環境に応じて修正してください

FloatingIP アドレスは各自の環境に応じて修正してください

4. OpenStack と Ansible の連携 (Multi Node)

4-9. eplite インスタンスを起動する (create_instance.yml)

(handson)$ ansible-playbook -i ansible_hosts ood2015/playbooks/eplite_multinode.ymlPLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** ok: [127.0.0.1]ok: [192.168.253.115]ok: [192.168.253.113]ok: [192.168.253.114]TASK: [install require packages] ********************************************** ok: [192.168.253.113] => (item=python-docker-py)changed: [127.0.0.1] => (item=python-docker-py)changed: [192.168.253.115] => (item=python-docker-py)changed: [192.168.253.114] => (item=python-docker-py)TASK: [start epmysql] ********************************************************* skipping: [192.168.253.113]skipping: [192.168.253.114]skipping: [127.0.0.1]changed: [192.168.253.115]TASK: [start eplite] ********************************************************** skipping: [192.168.253.113]skipping: [192.168.253.115]skipping: [127.0.0.1]changed: [192.168.253.114]PLAY RECAP ******************************************************************** 127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0 192.168.253.113 : ok=2 changed=0 unreachable=0 failed=0 192.168.253.114 : ok=3 changed=2 unreachable=0 failed=0 192.168.253.115 : ok=3 changed=2 unreachable=0 failed=0

dockerモジュールが必要とする python-docker-pyパッケージをインストールするタスク

epmysql コンテナをダウンロードして起動するタスク※epmysql インスタンスにのみ適用される

eplitel コンテナをダウンロードして起動するタスク※epapp インスタンスにのみ適用される

Etherpad Lite の動作確認 (All-In-One)ブラウザから FloatingIP にアクセスしてみましょう

➔ http://192.168.253.114/

付録 : Playbooks- create_instance.yml- eplite_multinode.yml- Dynamic Inventory-新 OpenStackモジュール- 実行ファイルを残す

4. OpenStack と Ansible の連携 (付録 1)付録 1-1. create_instance.yml(1)---- hosts: localhost

vars: ansible_python_interpreter: /home/centos/handson/bin/python os_auth_url: "{{ lookup('env','OS_AUTH_URL') }}" os_username: "{{ lookup('env','OS_USERNAME') }}" os_password: "{{ lookup('env','OS_PASSWORD') }}" os_project_name: "{{ lookup('env','OS_TENANT_NAME') }}" os_region_name: "{{ lookup('env','OS_REGION_NAME') }}" keypairs: - name: "step-server" public_key_file: "/home/centos/.ssh/id_rsa.pub" secgroups: - name: "eplite" desc: "secgroup for eplite" rules: - ... servers: - name: "{{ hostname }}" key_name: "step-server"...

OpenStack API接続情報を定義

公開鍵情報を keypairs として定義

セキュリティグループとルールを定義

適用対象はローカルホストグループ

仮想マシンインスタンスのスペックを定義

4. OpenStack と Ansible の連携 (付録 1)付録 1-2. create_instance.yml(2)

tasks: - name: import keypairs os_keypair: state=present name="{{ item.name }}" public_key_file="{{ item.public_key_file }}" with_items: keypairs - name: create security group os_security_group: state=present name="{{ item.name }}" description="{{ item.desc}}" with_items: secgroups...

vars: keypairs: - name: "step-server" public_key_file: "/home/centos/.ssh/id_rsa.pub"

vars: secgroups: - name: "eplite" desc: "secgroup for eplite" rules: [{ ルール 1, ルール 2, ルール 3, ...}]

OpenStack 環境で os_keypairモジュールが適用された状態に状態変更する

OpenStack 環境で os_security_groupモジュールが適用された状態に状態変更する

4. OpenStack と Ansible の連携 (付録 1)付録 1-3. create_instance.yml(3)

tasks:... - name: add rules to secgroup os_security_group_rule: state=present security_group="{{ item[0].name }}" protocol="{{ item[1].protocol }}" port_range_min="{{ item[1].port_range_min }}" port_range_max="{{ item[1].port_range_max }}" remote_ip_prefix="{{ item[1].remote_ip_prefix }}" with_subelements: - secgroups - rules

...

secgroups リストと、その中で定義されるrules リストでネストされたループを作る

vars: secgroups: - name: "eplite" desc: "secgroup for eplite" rules: - protocol: "icmp" port_range_min: -1 port_range_max: -1 remote_ip_prefix: "0.0.0.0/0"

OpenStack 環境で os_security_group_ruleモジュールが適用された状態に状態変更する

4. OpenStack と Ansible の連携 (付録 1)付録 1-4. create_instance.yml(4)

vars: servers: - name: "{{ hostname }}" key_name: "step-server" flavor: "m1.small" image: "Docker01" secgroups: - "eplite" nics: - net-name: "work-net" auto_ip: no ext_net: "ext-net_1214" int_net: "work-net"

tasks:... - name: create servers os_server: state: present timeout: 200 name: "{{ item.name }}" key_name: "{{ item.key_name }}" flavor: "{{ item.flavor }}" image: "{{ item.image }}" security_groups: "{{ item.secgroups }}" nics: "{{ item.nics }}" auto_ip: "{{ item.auto_ip }}" with_items: servers...

servers リストの要素に書かれた設定値で os_serverモジュールを繰り返し適用する

OpenStack 環境で、指定したインスタンスが起動している状態に状態変更する

4. OpenStack と Ansible の連携 (付録 1)付録 1-5. create_instance.yml(5)

vars: os_auth_url: "{{ lookup('env','OS_AUTH_URL') }}" os_username: "{{ lookup('env','OS_USERNAME') }}" os_password: "{{ lookup('env','OS_PASSWORD') }}" os_project_name: "{{ lookup('env','OS_TENANT_NAME') }}" os_region_name: "{{ lookup('env','OS_REGION_NAME') }}"... servers: - name: "{{ hostname }}"... ext_net: "ext-net_1214" int_net: "work-net"

tasks:... - name: create and assign floating_ip to server quantum_floating_ip: state=present login_username="{{ os_username }}" login_password="{{ os_password }}" login_tenant_name="{{ os_project_name }}" network_name="{{ item.ext_net }}" instance_name="{{ item.name }}" internal_network_name="{{ item.int_net }}" with_items: servers...

servers リストの要素に書かれた設定値でquantum_floating_ipモジュールを繰り返し適用する

4. OpenStack と Ansible の連携 (付録2 )付録 2-1. eplite_multinode.yml(1)

---- hosts: all vars: require: packages: - python-docker-py epmysql: image: "192.168.253.13:5000/student-0003/epmysql:ver1.0" ports: - "3306:3306" expose: - 3306 epapp: image: "192.168.253.13:5000/student-0003/eplite:ver1.0" ports: - "80:80" expose: - 80 env: FIP: "{{ epapp_fip }}" DB_PORT_3306_TCP_ADDR: "{{ epmysql_fip }}"

インベントリファイル内のすべてのホストを適用対象とする

dockerモジュールに渡すイメージ情報を設定する

dockerモジュールに渡すイメージ情報を設定する

docker コンテナが利用する環境変数を設定する

4. OpenStack と Ansible の連携 (付録2 )付録 2-1. eplite_multinode.yml(1)

tasks:... - name: start epmysql docker: state: started name: epmysql insecure_registry: True image: "{{ epmysql.image }}" ports: "{{ epmysql.ports }}" expose: "{{ epmysql.expose }}" tty: True sudo: yes when: ansible_hostname == "epmysql" - name: start eplite docker: state: started name: eplite insecure_registry: True image: "{{ epapp.image }}" ports: "{{ epapp.ports }}" expose: "{{ epapp.expose }}" env: "{{ epapp.env }}" tty: True sudo: yes when: ansible_hostname == "epapp"

dockerモジュールは sudo で実行する

dockerモジュールは sudo で実行する

このタスクはホスト名が epmysql であるホストにのみ適用する

このタスクはホスト名が epapp であるホストにのみ適用する

epmysql コンテナが起動している状態となるようインスタンスの状態を変更する

epapp コンテナが起動している状態となるようインスタンスの状態を変更する

4. OpenStack と Ansible の連携 (付録3 )

ダイナミックインベントリを利用するAnsible が管理対象ホストのインベントリ情報を取得する方法は、以下の2通りです。

(1)静的なインベントリを利用するUNIXの hosts ファイルのように静的に定義されたテキストファイルを実行時に読み込んで利用する

➔ホストの増減に対応するためには都度ファイルメンテナンスが必要

(1)動的なインベントリ ( 外部インベントリ ) を利用するOpenStack のような他のシステムを利用して、対象ホストのリストとパラメータを取得する外部プログラムを利用する

➔ホストの増減は OpenStack が管理しているので実行時に最新情報を取得することで、インベントリ情報の鮮度を保てる

実行可能ファイル実行可能ファイル

Playbook

4. OpenStack と Ansible の連携 (付録3 )

Ansiblesshdsshd

11

22

Playbook の仕組みダイナミックインベントリプログラムは、 OpenStackから最新の構成情報を取得し、 JSON 形式のインベントリを生成します。

実行可能ファイル実行可能ファイルos_keypair

実行可能ファイル

実行可能ファイル実行可能ファイル

実行可能ファイル実行可能ファイルos_keypair

実行可能ファイル

実行33

44

1. ダイナミックインベントリ実行2. Playbook を読み込み3. モジュールを実行ファイルに変換4. 実行ファイルの転送と実行

ダイナミックインベントリダイナミックインベントリ

実行

4. OpenStack と Ansible の連携 (付録3 )付録 3-1. Dynamic Inventoryプログラムを利用する (2)

(handson)$ cd ~(handson)$ ./ood2015/inventory/openstack.py --list{... "_meta": { "hostvars": { "734f7dbf-b198-48af-829d-5ef40f2307fd": { "ansible_ssh_host": "192.168.253.114", ...}

ダイナミックインベントリプログラム (openstack.py)からOpenStack に最新の仮想マシンインスタンス情報を問い合わせて、 Ansible が利用可能な JSON 形式で出力する

4. OpenStack と Ansible の連携 (付録3 )付録 3-1. Dynamic Inventoryプログラムを利用する (3)

注意 ) 実行前に epapp インスタンスと epmysql インスタンスを削除し、それぞれの FloatingIP を開放しておいてください

(handson)$ ansible-playbook -i ansible_hosts -e "hostname=epmysql" \ood2015/playbooks/create_instance.yml...(handson)$ ansible-playbook -i ansible_hosts -e "hostname=epapp" \ood2015/playbooks/create_instance.yml...(handson)$ ansible-playbook -i ./ood2015/inventory/openstack.py \ood2015/playbooks/eplite_multinode_dynamic.yml...

PLAY RECAP ******************************************************************** 69816420-9f05-4fc4-8819-c2af3b00481b : ok=3 changed=2 unreachable=0 failed=0 be2f90ed-e492-4310-af64-fbd598d945d6 : ok=3 changed=2 unreachable=0 failed=0 c4a930ed-f4a2-4ee4-a82e-73a78de4ed22 : ok=2 changed=0 unreachable=0 failed=0 ecc54c11-8e66-42b1-85c5-76e443770232 : ok=2 changed=0 unreachable=0 failed=0

epapp,epmysql の FloatingIP アドレスは変更となったが、 OpenStackから取得した最新のインベントリ情報に基づいて Playbook を実行できる

4. OpenStack と Ansible の連携 (付録4 )新たな OpenStack 用モジュール近々リリースが予定されている Ansible v2 では、刷新された OpenStack 連携モジュールが提供されます ( まだでない ...)shade を利用することで、よりシンプルにモジュールやダイナミックインベントリを作成することができるようになりました。

OpenStack接続設定

(openrc など )

新モジュール

OpenStackクライアント

shade

旧モジュール

OpenStackクライアント

モジュール側で各クライアントの実装差異を吸収しなければならないなど ..実装が大変

4. OpenStack と Ansible の連携 (付録5 )Ansible が生成する実行可能ファイル

Ansible が操作対象ホストに対して「仕事」をする際、モジュールから実行可能ファイルを生成して転送し、操作対象ホスト上で実行します。この実行可能ファイルは、通常だと作業完了後に自動削除されます。

この実行可能ファイル、見たくありませんか?その方法は ...環境変数を設定します。$ export ANSIBLE_KEEP_REMOTE_FILES=yes

おつかれさまでした