SlideShare a Scribd company logo
1 of 61
Download to read offline
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 SSHSSH
Target Node
python>=2.4
Ansible Host WinRMWinRM
Target 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 2048
Generating 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 --version
ansible 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=local
EOF
2-2. Ansible モジュール利用して動作確認する
Ansible は、対象ホストが操作可能であるかを確認するために ping モジュールを提供している。
これを利用してローカルホストが操作可能であることを確認する。
$ ansible localhost -i ~/ansible_hosts -m ping
127.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/cloud
host_key_checking = False
EOF
3-3. ライブラリパスの設定が反映されていることを確認する
(handson)$ ansible --version
ansible 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 setup
127.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.org
91f41bca4c0c8f81a530df676fd05aa6 /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 -s
127.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_flo
ating_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/playbooks
create_instance.yml create_step.yml eplite_multinode.yml eplite_singlenode.yml
Filename Description
create_instance.yml
公開鍵の登録 -> セキュリティグループの作成 -> 仮想マシン
インスタンスの作成を行う
create_step.yml step-server 用インスタンスを作成する ( 今回は未使用 )
eplite_multinode.yml
eplite コンテナと 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 の連携
ComputeNode
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 centos@192.168.253.110
[centos@eplite ~]$ hostname
eplite
[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-add
Enter 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.yml
PLAY [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.yml
PLAY [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=centos
192.168.253.114 ansible_connection=ssh ansible_ssh_user=centos
192.168.253.115 ansible_connection=ssh ansible_ssh_user=centos
[eplite:vars]
epapp_fip = 192.168.253.114
epmysql_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.yml
PLAY [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 )
Ansible
sshdsshd
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
おつかれさまでした

More Related Content

What's hot

Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Hidetoshi Hirokawa
 
Ansibleで味わうHelion OpenStack
Ansibleで味わうHelion OpenStackAnsibleで味わうHelion OpenStack
Ansibleで味わうHelion OpenStackMasataka Tsukamoto
 
OpenStack Osloを使おう - cliff編
OpenStack Osloを使おう - cliff編OpenStack Osloを使おう - cliff編
OpenStack Osloを使おう - cliff編Hideki Saito
 
Ansible2とOpenStackの関係
Ansible2とOpenStackの関係Ansible2とOpenStackの関係
Ansible2とOpenStackの関係Hideki Saito
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較Sugawara Genki
 
Ansible meetuptokyo 2015 Dynamic Inventory
Ansible meetuptokyo 2015 Dynamic InventoryAnsible meetuptokyo 2015 Dynamic Inventory
Ansible meetuptokyo 2015 Dynamic InventoryHideki Saito
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいKazuhiro Oinuma
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからTakeshi Kuramochi
 
Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方Hiroshi Okano
 
Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Hideki Saito
 
第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会Yasutaka Hamada
 
Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方Kamimura Taichi
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
 
Rancher command line interface
Rancher command line interfaceRancher command line interface
Rancher command line interfaceMasahito Zembutsu
 
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介Midori Oge
 
Chef社内勉強会(第1回)
Chef社内勉強会(第1回)Chef社内勉強会(第1回)
Chef社内勉強会(第1回)Yoshinori Nakanishi
 

What's hot (20)

Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1
 
Ansibleで味わうHelion OpenStack
Ansibleで味わうHelion OpenStackAnsibleで味わうHelion OpenStack
Ansibleで味わうHelion OpenStack
 
OpenStack Osloを使おう - cliff編
OpenStack Osloを使おう - cliff編OpenStack Osloを使おう - cliff編
OpenStack Osloを使おう - cliff編
 
Ansible2とOpenStackの関係
Ansible2とOpenStackの関係Ansible2とOpenStackの関係
Ansible2とOpenStackの関係
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 
Ansible meetuptokyo 2015 Dynamic Inventory
Ansible meetuptokyo 2015 Dynamic InventoryAnsible meetuptokyo 2015 Dynamic Inventory
Ansible meetuptokyo 2015 Dynamic Inventory
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたい
 
Ansible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれからAnsible 2.0 のサマライズとこれから
Ansible 2.0 のサマライズとこれから
 
Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方Ansible tower 構築方法と使い方
Ansible tower 構築方法と使い方
 
Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021Ansible troubleshooting 101_2021
Ansible troubleshooting 101_2021
 
第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会第1回 一撃サーバー構築シェルスクリプト勉強会
第1回 一撃サーバー構築シェルスクリプト勉強会
 
Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方
 
Puppetのススメ
PuppetのススメPuppetのススメ
Puppetのススメ
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
Rancher command line interface
Rancher command line interfaceRancher command line interface
Rancher command line interface
 
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
第20回CloudStackユーザ会_ApacheCloudStack4.4新機能紹介
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
What is an Ansible?
What is an Ansible?What is an Ansible?
What is an Ansible?
 
Chef社内勉強会(第1回)
Chef社内勉強会(第1回)Chef社内勉強会(第1回)
Chef社内勉強会(第1回)
 

Similar to Okinawa Open Days 2015 Handson - Ansible

Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1Kazuyuki Ichikawa
 
Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化dcubeio
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChefMasahiro NAKAYAMA
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Taro Hirose
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationyukihiro kawada
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1Kotaro Noyama
 
知らないと地味にハマるOpen stackインストール時の注意点
知らないと地味にハマるOpen stackインストール時の注意点知らないと地味にハマるOpen stackインストール時の注意点
知らないと地味にハマるOpen stackインストール時の注意点d-shen
 
Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jAkira Yoshiyama
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介Etsuji Nakai
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud AutomationEtsuji Nakai
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようmax747
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistranokumachang_LL
 
OpenNebula on Ubuntu
OpenNebula on UbuntuOpenNebula on Ubuntu
OpenNebula on Ubuntuautumnalsky
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1Kotaro Noyama
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたatk1234
 
OpenStack Liberty をインストールしてみた
OpenStack Liberty をインストールしてみたOpenStack Liberty をインストールしてみた
OpenStack Liberty をインストールしてみたTakashi Umeno
 

Similar to Okinawa Open Days 2015 Handson - Ansible (20)

Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1Ansibleを失敗しながら学ぶ その1
Ansibleを失敗しながら学ぶ その1
 
Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChef
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verification
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
OpenStack Grizzly構築手順書
OpenStack Grizzly構築手順書OpenStack Grizzly構築手順書
OpenStack Grizzly構築手順書
 
知らないと地味にハマるOpen stackインストール時の注意点
知らないと地味にハマるOpen stackインストール時の注意点知らないと地味にハマるOpen stackインストール時の注意点
知らないと地味にハマるOpen stackインストール時の注意点
 
Osc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 jOsc201703 tokyo-clonezilla-v1.2 j
Osc201703 tokyo-clonezilla-v1.2 j
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
 
OpenNebula on Ubuntu
OpenNebula on UbuntuOpenNebula on Ubuntu
OpenNebula on Ubuntu
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
Lxc on cloud
Lxc on cloudLxc on cloud
Lxc on cloud
 
Version管理 1
Version管理 1Version管理 1
Version管理 1
 
OSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみたOSC Tokyo fall LT~Dockerで分散処理をやってみた
OSC Tokyo fall LT~Dockerで分散処理をやってみた
 
OpenStack Liberty をインストールしてみた
OpenStack Liberty をインストールしてみたOpenStack Liberty をインストールしてみた
OpenStack Liberty をインストールしてみた
 

More from Hideki Saito

これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024Hideki Saito
 
Ansible automationplatform product updates 2021
Ansible automationplatform product updates 2021Ansible automationplatform product updates 2021
Ansible automationplatform product updates 2021Hideki Saito
 
Ansible Fest 2020 技術トピックまとめ
Ansible Fest 2020 技術トピックまとめAnsible Fest 2020 技術トピックまとめ
Ansible Fest 2020 技術トピックまとめHideki Saito
 
Getting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGGetting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGHideki Saito
 
Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Hideki Saito
 
How to contribute code to ansible awx
How to contribute code to ansible awxHow to contribute code to ansible awx
How to contribute code to ansible awxHideki Saito
 
Update: Ansible Tower 3.6.0
Update: Ansible Tower 3.6.0Update: Ansible Tower 3.6.0
Update: Ansible Tower 3.6.0Hideki Saito
 
OpenStackSDK with Ansible
OpenStackSDK with AnsibleOpenStackSDK with Ansible
OpenStackSDK with AnsibleHideki Saito
 
How to contribute AWX
How to contribute AWXHow to contribute AWX
How to contribute AWXHideki Saito
 
Ansible Tower on OpenShift
Ansible Tower on OpenShiftAnsible Tower on OpenShift
Ansible Tower on OpenShiftHideki Saito
 
IT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXIT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXHideki Saito
 
IT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXIT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXHideki Saito
 
OpenStack with SR-IOV
OpenStack with SR-IOVOpenStack with SR-IOV
OpenStack with SR-IOVHideki Saito
 
OpenStack Summitの歩き方
OpenStack Summitの歩き方OpenStack Summitの歩き方
OpenStack Summitの歩き方Hideki Saito
 
OpenStack Summit 2015 Vancouver Report
OpenStack Summit 2015 Vancouver ReportOpenStack Summit 2015 Vancouver Report
OpenStack Summit 2015 Vancouver ReportHideki Saito
 
OpenStack and Ansible Handson
OpenStack and Ansible HandsonOpenStack and Ansible Handson
OpenStack and Ansible HandsonHideki Saito
 
ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!
ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!
ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!Hideki Saito
 

More from Hideki Saito (20)

これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024これからはじめるAnsible - Ansible Night Tokyo 2024
これからはじめるAnsible - Ansible Night Tokyo 2024
 
Ansible automationplatform product updates 2021
Ansible automationplatform product updates 2021Ansible automationplatform product updates 2021
Ansible automationplatform product updates 2021
 
Ansible Fest 2020 技術トピックまとめ
Ansible Fest 2020 技術トピックまとめAnsible Fest 2020 技術トピックまとめ
Ansible Fest 2020 技術トピックまとめ
 
Getting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NGGetting Started - Ansible Galaxy NG
Getting Started - Ansible Galaxy NG
 
Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007Ansible troubleshooting 101_202007
Ansible troubleshooting 101_202007
 
How to contribute code to ansible awx
How to contribute code to ansible awxHow to contribute code to ansible awx
How to contribute code to ansible awx
 
Update: Ansible Tower 3.6.0
Update: Ansible Tower 3.6.0Update: Ansible Tower 3.6.0
Update: Ansible Tower 3.6.0
 
OpenStackSDK with Ansible
OpenStackSDK with AnsibleOpenStackSDK with Ansible
OpenStackSDK with Ansible
 
How to contribute AWX
How to contribute AWXHow to contribute AWX
How to contribute AWX
 
Ansible Tower on OpenShift
Ansible Tower on OpenShiftAnsible Tower on OpenShift
Ansible Tower on OpenShift
 
IT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXIT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWX
 
IT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWXIT Automation with OpenStack and Ansible/AWX
IT Automation with OpenStack and Ansible/AWX
 
Ansible with AWX
Ansible with AWXAnsible with AWX
Ansible with AWX
 
Ansible101
Ansible101Ansible101
Ansible101
 
OpenStack Now!
OpenStack Now!OpenStack Now!
OpenStack Now!
 
OpenStack with SR-IOV
OpenStack with SR-IOVOpenStack with SR-IOV
OpenStack with SR-IOV
 
OpenStack Summitの歩き方
OpenStack Summitの歩き方OpenStack Summitの歩き方
OpenStack Summitの歩き方
 
OpenStack Summit 2015 Vancouver Report
OpenStack Summit 2015 Vancouver ReportOpenStack Summit 2015 Vancouver Report
OpenStack Summit 2015 Vancouver Report
 
OpenStack and Ansible Handson
OpenStack and Ansible HandsonOpenStack and Ansible Handson
OpenStack and Ansible Handson
 
ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!
ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!
ANSIBLE_KEEP_REMOTE_FILESをTrueにしてみよう!
 

Recently uploaded

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (9)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Okinawa Open Days 2015 Handson - Ansible

  • 1. OpenStack をさらに”使う”技術 Docker/Ansible 編 Ansible を利用した自動化を体験する Hideki Saito (@saito_hideki) openstackOpen source software to build public and private clouds.
  • 2. who am i ● 氏名 : 齊藤 秀喜 (@saito_hideki) ● 所属 : – 株式会社インターネットイニシアティブ – 日本 OpenStack ユーザ会 ● 著書 : ● OpenStack クラウドインテグレーション ● ISBN13:978-4798139784
  • 3. 目次 ● はじめに – Ansible の概要 ● ハンズオン前編 – 1. インストール – 2. 実際に使ってみる ● ハンズオン後編 – 3. Playbook でワークフローを実現する – 4. OpenStack と Ansible の連携
  • 5. このハンズオンでは、 OpenStack 上に構築したクラウド基盤 と、ワークフローを自動化するためのツールである Ansible を組み合わせた、システムの構築・運用を自動化する手法を 紹介します。 前セッションの Docker コンテナを利用した Etherpad サイト の構築手順をもう一歩進めて自動化してみましょう。 ワークフローの自動化を体験する
  • 6. Ansible のようなツールを利用して、ワークフローを自動化す れば、多くのメリットが得られます。 ワークフローの自動化を体験する ✔ 何度も繰り返される作業は、人間ではなく Ansible が実施する ✔ Ansible の Playbook( ワークフローを記述した定義ファイル ) をステージング環境 に適用して成功すれば、本番環境でもミスなく安全に作業が行える ✔ 作業内容を機械的にも人的にもレビューしやすくなる ✔ 人ではなくコンピュータが実行するので作業実施時間の見積もりも立てやすい このような定形作業は Ansible の得意分野
  • 7. Ansible は単発の仕事を自動化するだけでなく、複数の仕事を順序だてて まとめたワークフローの自動化を実現します。 さらに、外部インベントリを利用することで、従来の構成管理ツールが苦 手としていた、管理対象の変化にも柔軟に対応できるのが特徴です。 Ansible の概要 キーワード 概要 エージェントレス 管理対象ノードに専用エージェントを導入する必要がない ※Python2.4 以降のランタイムが事実上必須 外部インベントリ 専用の構成管理データベースを持たず、必要に応じて外部シス テムの構成管理情報を参照する方式を採用している すぐに利用可能 多数のモジュールが標準で提供されている。 シナリオ実行 多くの小さなタスクを1つにまとめることができる。 さらに、 タスクの実行結果による条件分岐や繰り返し処理などの制御構 造も記述可能 ドキュメントの充実 公式サイトのドキュメントが高品質で充実しており、ゼロから のスタートアップがしやすい
  • 8. Ansible の主な構成要素 Ansible は大きく以下の要素から構成されています。次章では Ansible を 実際に利用しつつ、その仕組を解説します。 Ansible の概要 Module Playbook Plugin Inventory ファイルの転送、サービスの起動停止など Ansible に行わせる作業がモジュールとして提供さている Ansible に行わせる一連の作業の流れをまとめたもの Chef では recipe 、 Puppet では manifest にあたる Ansible が作業時に利用する callback モジュール群 動的にターゲットホストを取得してグループ化する Dynamic Inventory プログラム
  • 9. Ansible の概要 1. UNIX ホストに対する操作 Ansible Host SSHSSH Target Node python>=2.4 Ansible Host WinRMWinRM Target Node PowerShell>=v3 Ansible Host Netconf over SSH Netconf over SSH Target NetworkDevice 2. Windows ホストに対する操作 3. Netconf を利用したネットワークスイッチ操作
  • 11. 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 モジュール名
  • 14. 1. インストール 1-1.Ansible が操作対象ノードへの SSH 接続に利用するキーペアを作成する $ ssh-keygen -t rsa -b 2048 Generating 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
  • 15. 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 --version ansible 1.9.4 configured module search path = None 1. インストール 2015.12.10 時点での最新バージョンは 1.9.4 です
  • 16. 1. インストール 2-1. インベントリファイルを作成する Ansible が操作対象ノードを識別するために必要となるインベントリファイル (ansible_hosts) を作成する。 $ cd ~ $ cat << EOF > ~/ansible_hosts [localhost] 127.0.0.1 ansible_connection=local EOF 2-2. Ansible モジュール利用して動作確認する Ansible は、対象ホストが操作可能であるかを確認するために ping モジュールを提供している。 これを利用してローカルホストが操作可能であることを確認する。 $ ansible localhost -i ~/ansible_hosts -m ping 127.0.0.1 | success >> { "changed": false, "ping": "pong" } localhost に対して操作が成功 (success) したことを確認する
  • 17. 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 コマンド ) など も含まれる
  • 18. 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 コマンドを利用した仮想マシンインスタンスの リストが取得できたことを確認する
  • 19. 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/cloud host_key_checking = False EOF 3-3. ライブラリパスの設定が反映されていることを確認する (handson)$ ansible --version ansible 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]
  • 21. 2. 実際に使ってみる 2-1. 操作対象のサーバ情報を取得する (handson)$ ansible localhost -i ansible_hosts -m setup 127.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 で指定されたコマンドを実行する
  • 22. 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.org 91f41bca4c0c8f81a530df676fd05aa6 /tmp/openrc.org $HOME/openrc が localhost:/tmp/openrc.org にコピーされる ※ この例では localhost->localhost のコピーしますが localhost->remote ホスト でも同様に動作します
  • 23. 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
  • 24. 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 に配置する
  • 25. 2. 実際に使ってみる 2-5. パッケージをインストールする (handson)$ ansible localhost -i ansible_hosts -m yum -a "name=mlocate state=latest" -u centos -s 127.0.0.1 | success >> { "changed": true, ... ] } UID:centos でログインして sudo(-s) で実行する 最新 (latest) の mlocate パッケージをインストールする
  • 27. 仕事をまとめる Playbook ここまでは、 ansible コマンドにより単発の仕事を Ansible に実行させて きましたが、現実ではこのようが仕事が複数集まって手順として実施され ることになります。 Ansible は、仮想マシンインスタンスの作成のような手順を Playbook と して定義して順序通り実行することが可能です。 以降では Playbook 機能を利用して、 Ansible にまとまった仕事をさせて みましょう。 3: Playbook でワークフローを定義する 公開鍵の登録公開鍵の登録 セキュリティグループの作成セキュリティグループの作成 仮想マシンの起動仮想マシンの起動 実行順序は常に保証される必要がある AnsiblePlaybook 11 22 33
  • 28. 実行可能ファイル 実行可能ファイル 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_flo ating_ip 実行可能ファイル 実行可能ファイルos_keypair 実行可能ファイル 実行可能ファイル 実行可能ファイル 実行可能ファイル 実行可能ファイルos_keypair 実行可能ファイル 実行 インベントリインベントリ 33 44 1. インベントリファイル読み込み 2. Playbook を読み込み 3. モジュールを実行ファイルに変換 4. 実行ファイルの転送と実行
  • 29. 3. Playbook でワークフローを定義する 3-1. ハンズオン用 Playbook を取得する (handson)$ cd ~ (handson)$ git clone https://github.com/saito-hideki/ood2015.git (handson)$ ls ood2015/playbooks create_instance.yml create_step.yml eplite_multinode.yml eplite_singlenode.yml Filename Description create_instance.yml 公開鍵の登録 -> セキュリティグループの作成 -> 仮想マシン インスタンスの作成を行う create_step.yml step-server 用インスタンスを作成する ( 今回は未使用 ) eplite_multinode.yml eplite コンテナと epmysql コンテナを別々のインスタンスで 起動する eplite_singlenode.yml eplite コンテナと epmysql を1つのインスタンスで起動する ハンズオン用 Playbook の機能
  • 30. 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 # 繰り返し処理や一定条件を満たした場合のみ実行するような制御も可能
  • 31. 4. OpenStack と Ansible の連携 ComputeNode 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 アドレス経由でリモート・コントロールを実施
  • 32. 4. OpenStack と Ansible の連携 4-1. 事前準備として以下の2点を確認してください。 (1)step-server 以外の仮想マシンが存在しないこと ➔ step-server 以外の仮想マシンは削除してください (2)step-server 用の floating-ip 以外の floating-ip が存在しないこと ➔step-server 以外の floating-ip は削除してください
  • 33. 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) 仕事の流れ
  • 34. 目標 : ハンズオン環境 (All-In-One) ansible を動作させるインスタンス 仮想マシンインスタンス間を結ぶ 内部ネットワーク 外部接続用ネットワークと 内部ネットワーク間を結ぶ 仮想ルータ 仮想マシンインスタンスの 外部接続用ネットワーク eplite と mysql を動作させるインスタンス を構築します
  • 35. 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 アドレスを割り当てるタスク
  • 36. 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 centos@192.168.253.110 [centos@eplite ~]$ hostname eplite [centos@eplite ~]$ exit flavor は m1.small インスタンスは active 状態 Docker01 イメージで起動 公開鍵には step-server を利用 インスタンス名は "eplite" FloatingIP アドレスがアサインされている FloatingIP アドレスに対して SSH ログインすると ... インスタンス名がホスト名として設定されている
  • 37. 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-add Enter passphrase for /home/centos/.ssh/id_rsa: 鍵のパスフレーズ Identity added: /home/centos/.ssh/id_rsa (/home/centos/.ssh/id_rsa) FloatingIP アドレスは各自の環境に応じて修正してください ssh-agent を利用して Ansible から SSH ログインする際の パスフレーズ入力を省略します
  • 38. 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 コンテナをダウンロードして起動するタスク
  • 39. Etherpad Lite の動作確認 (All-In-One) ブラウザから FloatingIP にアクセスしてみましょう ➔ http://192.168.253.112/
  • 40. 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) 仕事の流れ
  • 41. 目標 : ハンズオン環境 (Multi Node) 外部接続用ネットワークと 内部ネットワーク間を結ぶ 仮想ルータ 仮想マシンインスタンス間を結ぶ 内部ネットワーク ansible を動作させるインスタンス mysql を起動させるインスタンス を構築します eplite を起動させるインスタンス を構築します 仮想マシンインスタンスの 外部接続用ネットワーク
  • 42. 4. OpenStack と Ansible の連携 (Multi Node) 4-7. eplite インスタンスを起動する (create_instance.yml) (handson)$ ansible-playbook -i ansible_hosts -e "hostname=epmysql" ood2015/playbooks/create_instance.yml PLAY [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.yml PLAY [localhost] ************************************************************* ... PLAY RECAP ******************************************************************** 127.0.0.1 : ok=6 changed=2 unreachable=0 failed epmysql インスタンスを起動する epapp インスタンスを起動する
  • 43. 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 | +-.-+-------------+--------+-.-+-------------+-----------------------------------------+
  • 44. 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=centos 192.168.253.114 ansible_connection=ssh ansible_ssh_user=centos 192.168.253.115 ansible_connection=ssh ansible_ssh_user=centos [eplite:vars] epapp_fip = 192.168.253.114 epmysql_fip = 192.168.253.115 FloatingIP アドレスは各自の環境に応じて修正してください FloatingIP アドレスは各自の環境に応じて修正してください
  • 45. 4. OpenStack と Ansible の連携 (Multi Node) 4-9. eplite インスタンスを起動する (create_instance.yml) (handson)$ ansible-playbook -i ansible_hosts ood2015/playbooks/eplite_multinode.yml PLAY [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 インスタンスにのみ適用される
  • 46. Etherpad Lite の動作確認 (All-In-One) ブラウザから FloatingIP にアクセスしてみましょう ➔ http://192.168.253.114/
  • 47. 付録 : Playbooks - create_instance.yml - eplite_multinode.yml - Dynamic Inventory - 新 OpenStack モジュール - 実行ファイルを残す
  • 48. 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 として定義 セキュリティグループとルールを定義 適用対象はローカルホストグループ 仮想マシンインスタンスのスペックを定義
  • 49. 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 モジュールが 適用された状態に状態変更する
  • 50. 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 モジュールが 適用された状態に状態変更する
  • 51. 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 環境で、指定したインスタンスが 起動している状態に状態変更する
  • 52. 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 モジュールを繰り返し 適用する
  • 53. 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 コンテナが利用する環境変数を設定する
  • 54. 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 コンテナが起動している状態となるよう インスタンスの状態を変更する
  • 55. 4. OpenStack と Ansible の連携 ( 付録3 ) ダイナミックインベントリを利用する Ansible が管理対象ホストのインベントリ情報を取得する方法は、以下の2 通りです。 (1)静的なインベントリを利用する UNIX の hosts ファイルのように静的に定義されたテキストファイル を実行時に読み込んで利用する ➔ホストの増減に対応するためには都度ファイルメンテナンスが必要 (1)動的なインベントリ ( 外部インベントリ ) を利用する OpenStack のような他のシステムを利用して、対象ホストのリストと パラメータを取得する外部プログラムを利用する ➔ホストの増減は OpenStack が管理しているので実行時に最新情報 を取得することで、インベントリ情報の鮮度を保てる
  • 56. 実行可能ファイル 実行可能ファイル Playbook 4. OpenStack と Ansible の連携 ( 付録3 ) Ansible sshdsshd 11 22 Playbook の仕組み ダイナミックインベントリプログラムは、 OpenStack から最新の構成情報を 取得し、 JSON 形式のインベントリを生成します。 実行可能ファイル 実行可能ファイルos_keypair 実行可能ファイル 実行可能ファイル 実行可能ファイル 実行可能ファイル 実行可能ファイルos_keypair 実行可能ファイル 実行 33 44 1. ダイナミックインベントリ実行 2. Playbook を読み込み 3. モジュールを実行ファイルに変換 4. 実行ファイルの転送と実行 ダイナミック インベントリ ダイナミック インベントリ 実行
  • 57. 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 形式で出力する
  • 58. 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 を実行できる
  • 59. 4. OpenStack と Ansible の連携 ( 付録4 ) 新たな OpenStack 用モジュール 近々リリースが予定されている Ansible v2 では、刷新された OpenStack 連携 モジュールが提供されます ( まだでない ...) shade を利用することで、よりシンプルにモジュールやダイナミックインベン トリを作成することができるようになりました。 OpenStack 接続設定 (openrc など ) 新モジュール OpenStack クライアント shade 旧モジュール OpenStack クライアント モジュール側で各クライアントの実装差異を 吸収しなければならないなど .. 実装が大変
  • 60. 4. OpenStack と Ansible の連携 ( 付録5 ) Ansible が生成する実行可能ファイル Ansible が操作対象ホストに対して「仕事」をする際、モジュールから実行 可能ファイルを生成して転送し、操作対象ホスト上で実行します。 この実行可能ファイルは、通常だと作業完了後に自動削除されます。 この実行可能ファイル、見たくありませんか? その方法は ... 環境変数を設定します。 $ export ANSIBLE_KEEP_REMOTE_FILES=yes