openstack & ansible で実現する自動化

36
OpenStack & Ansible で実現する自動化 JOSUG Meetup #30 齊藤 秀喜 Internet Initiative Japan Inc. Japan OpenStack User Group JAPAN OPENSTACK USER GROUP 1 JOSUG Meetup #30

Upload: hideki-saito

Post on 18-Jan-2017

545 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: OpenStack & Ansible で実現する自動化

OpenStack & Ansible で実現する自動化

JOSUG Meetup #30

齊藤 秀喜 Internet Initiative Japan Inc. Japan OpenStack User Group

JAPAN OPENSTACK USER GROUP 1

JOSUG Meetup #30

Page 2: OpenStack & Ansible で実現する自動化

自己紹介氏名: 齊藤 秀喜 (さいとう ひでき) 勤務先: Internet Initiative Japan Inc. 仕事:

• IaaSの開発・管理・運用・リサーチ • OSSコミュニティ運営のお手伝い

所属: 日本OpenStackユーザ会(ボードメンバー 兼 写真部長) 趣味: OpenStack, Ansible TwitterID: @saito_hideki IRC Freenode: saitou Email: [email protected]

JAPAN OPENSTACK USER GROUP 2

JOSUG Meetup #30

Page 3: OpenStack & Ansible で実現する自動化

目次OpenStackとAnsibleの連携によるInfrastructure as Codeの実践方法について、その一例を紹介します。

1) OpenStackとAnsible > Ansibleとは?

> Undercloud/Overcloud

2) Ansibleを利用した作業の自動化 > OpenStack環境の操作 > Dynamic Inventoryを利用したインスタンス管理

3JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 4: OpenStack & Ansible で実現する自動化

01OpenStackとAnsibleを協調動作させる

4

OpenStackとAnsible

JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 5: OpenStack & Ansible で実現する自動化

Ansibleとは?Ansibleは、人間がシステムに対して実施する作業をコード化するためのツールです。

いわゆるInfrastructure as Codeを実現する仕組みの1つです。

1)管理対象ホストにエージェントを導入する必要がない

2)Dynamic Inventoryの採用により、環境の変化に柔軟に対応できる

3)多数のモジュールが標準で提供されている

4)標準モジュールについては、冪等性がほぼ担保されている

5)多くの小さなタスクを1つにまとめることができる

6)条件分岐やループなどの簡単な制御構造を実現できる

7)シンプルな仕組みでゼロからのスタートアップがしやすい

5JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 6: OpenStack & Ansible で実現する自動化

OpenStack環境での、Ansibleを利用価値は2つ

1.UnderCloudの構築と構成管理の実現 2.OverCloudの構築と構成管理の実現

UnderCloudとOverCloud

6JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Infrastructure as Code

実現

Page 7: OpenStack & Ansible で実現する自動化

OpenStack環境そのものを構築するために、Ansibleを利用する。 コントロールプレーンの構築手順をPlaybook化して再利用。 ‣ OpenStack Kolla (http://docs.openstack.org/developer/kolla/)

‣ OpenStack Ansible (http://docs.openstack.org/developer/openstack-ansible/)

UnderCloudとAnsible

7JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

UnderCloud (Ansible)

OverCloud (OpenStack)

ControllerControllerControllerComputeComputeCompute

NetworkNetwork

Deploy Configure Manage

冗長構成での構築など 複雑な作業をPlaybook化

Page 8: OpenStack & Ansible で実現する自動化

OverCloudとAnsible(1)OpenStack管理下にある仮想リソースをAnsibleから管理する。

8JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

OverCloud (OpenStack)

API

Deploy Configure Manage

RouterNetworkVM#0

VM#1

OpenStack モジュール群 Ansible

OpenStack APIを利用して 仮想リソースを管理

Page 9: OpenStack & Ansible で実現する自動化

OverCloudとAnsible(2)VM上のアプリケーションをAnsibleから管理する。

9JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

OverCloud (OpenStack)

Deploy Configure Manage

RouterNetworkVM#0

VM#1

さまざまな モジュール群 Ansible

API

SSH

Inventory

Page 10: OpenStack & Ansible で実現する自動化

02AnsibleとOpenStackの連携を見てみましょう

10

Ansibleを利用した 高度な自動化デモ

JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 11: OpenStack & Ansible で実現する自動化

Ansibleの構成要素

11JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

# 構成要素 概要

1設定ファイル(ansible.cfg)

Ansibleの振る舞いを決める基本設定を記述する

2 inventory 管理対象ホストの一覧とパラメータを記述したファイル

3 plugin タスクの実行時間を計測したり、タスクの完了を通知したりするためのプラグイン群

4 module 管理対象ホストに、さまざまな操作を行うモジュール群

5 command ansibleやansible-playbookなど、moduleやplaybookを 実行するコマンド群

6 Playbook 管理対象ホストに行う一連の操作をYAML形式で記述した 手順書のようなもの

Page 12: OpenStack & Ansible で実現する自動化

ansibleコマンド

12JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

inventory

plugin

module

実行コードhost#0 host#0 host#0

実行コード 実行コード 実行コード

ansible

SSH SSH SSH 生成

% ansible <target> -i inventory -m module

Page 13: OpenStack & Ansible で実現する自動化

ansible-playbookコマンド

13JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

plugin

playbook

module

実行コード

host#0 host#0 host#0

実行コード 実行コード 実行コード

SSH SSH SSH

生成

modulemodule

実行コード実行コード

inventory

% ansible-playbook -i inventory playbook.yml

ansible

Page 14: OpenStack & Ansible で実現する自動化

インストールpipで楽々インストール。作業はコレだけ!

ここでは、Ansibleだけでなく、playbookの書式チェックのために、ansible-lintを、OpenStack環境を操作するためにshadeライブラリをインストールしています。

14JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

~ % virtualenv ~/venv/2.7.11/openstack ~ % source ~/venv/2.7.11/openstack/bin/activate (openstack) % pip install ansible (openstack) % pip install ansible-lint (openstack) % pip install shade (openstack) % ansible --version ansible 2.1.1.0 config file =

Page 15: OpenStack & Ansible で実現する自動化

設定ファイル作成デフォルト設定から変更したい場合は、ansible.cfgを作成する。 設定ファイルは、以下の優先度でチェックされます。

1) 環境変数*ANSIBLE_CONFIG*で指定された設定ファイル 2) カレントディレクトリにある「ansible.cfg」 3) ホームディレクトリ($HOME)の「.ansible.cfg」 4) システム全体に影響する「/etc/ansible/ansible.cfg」

15JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

[defaults] forks = 10 log_path = /home/demo/logs/ansible/ansible.log # library = host_key_checking = False gathering = smart transport = smart callback_whitelist = profile_tasks

Page 16: OpenStack & Ansible で実現する自動化

inventoryファイルの作成接続対象となるホストの情報を記載するインベントリーファイルには、特に必要のない限り、対象ホストに対する接続情報(IPアドレス、ログインIDなど)のみを記載します。

Ansibleは、管理対象となるホスト群の構成情報を保存するデータベースを持たないのが特徴の1つで、管理対象ホストの設定情報などは、必要に応じて、直接収集するように設計されています。

16JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

[local] 127.0.0.1 ansible_connection=local

[devstack] 172.16.0.3 ansible_user=vagrant ansible_password=vagrant

[local:vars] ansible_python_interpreter = "/home/demo/venv/2.7.11/openstack/bin/python"

Page 17: OpenStack & Ansible で実現する自動化

動作確認

17JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

setupモジュールを利用して、Ansibleの動作確認を行います。

実行結果

(openstack) % ansible local -i inventory -m setup

127.0.0.1 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "192.168.1.2", "172.16.0.1", "172.16.1.1" ], "ansible_all_ipv6_addresses": [ "fe80::62f8:1dff:feb4:e068%en0", "fe80::74af:98ff:fe58:937f%awdl0", "fe80::c014:662c:afd9:8e8d%utun0", ], ...以下略

Page 18: OpenStack & Ansible で実現する自動化

デモ:OpenStack環境の操作今回は、以下の操作を見ていく中で、OpenStackとAnsibleの連携についてご紹介します。

1)仮想ネットワークの作成 2)仮想ルータとの接続 3)仮想マシンの起動 - Floating IPの割り当て 4)Userataを用いた初期設定 5)仮想ストレージの作成 6)仮想ストレージの接続 7)作成した仮想マシンの操作

18JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 19: OpenStack & Ansible で実現する自動化

操作の仕組み

19JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

実行コード

実行

localhost

OpenStackOpenStack

module

ansibleRouterNetwork

VM#0

VM#1

API Call

API

Page 20: OpenStack & Ansible で実現する自動化

クライアント認証ファイルの作成

clouds: devstack: auth: auth_url: http://172.16.0.3:5000 username: demo password: changeme project_name: demo project_domain_id: default user_domain_id: default identity_api_version: '3' region_name: RegionOne

20JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Ansible v2.xのOpenStackモジュールは、クライアントの認証用に設定ファイルを用意することで、Playbook内に認証情報を埋め込む必要がなくなりました。 参考URL: http://docs.openstack.org/developer/os-client-config/

Page 21: OpenStack & Ansible で実現する自動化

デモ(1) 仮想ネットワークの作成

--- - hosts: local tasks: - name: create network os_network: cloud: devstack name: demo_net0 state: present

- name: create subnet os_subnet: cloud: devstack name: demo_subnet0 cidr: 192.168.0.0/24 network_name: demo_net0 dns_nameservers: - 8.8.8.7 - 8.8.8.8 state: present

21JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

ネットワークを作成する - Network: demo_net0 - Subnet: demo_subnet0

Page 22: OpenStack & Ansible で実現する自動化

デモ(2) 仮想ルータとの接続

--- - hosts: local tasks: - name: create router os_router: cloud: devstack name: demo_router0 network: public interfaces: - demo_subnet0 state: present

22JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

publicとdemo_subnet0を接続する仮想ルータを作成する - Router: demo_router0

public

demo_net0(demo_subnet0)

demorouter0

Page 23: OpenStack & Ansible で実現する自動化

デモ(3) 仮想マシンの起動

--- - hosts: local vars: image_name: ubuntu-14.04-amd64 tasks: - name: create server instance os_server: cloud: devstack name: demo_vm0 region_name: RegionOne availability_zone: nova image: "{{ image_name }}" key_name: saitou timeout: 200 flavor: m1.tiny security_groups: base_secgroup auto_ip: yes nics: - net-name: demo_net0 state: present

23JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

以下のスペックで仮想マシンを起動する - name: demo_vm0 - image: ubuntu-14.04-amd64 - flavor: m1.tiny - keypair: saitou - secgroup: base_secgroup - network: demo_net0 - floating_ip: 自動付与

demo_net0

demo_vm0

Page 24: OpenStack & Ansible で実現する自動化

デモ(4) Userataを用いた初期設定

--- - hosts: local vars: image_name: ubuntu-14.04-amd64 tasks: - name: create server instance os_server: cloud: devstack name: demo_vm2 region_name: RegionOne availability_zone: nova image: "{{ image_name }}" key_name: saitou timeout: 200 flavor: m1.tiny security_groups: base_secgroup auto_ip: yes nics: - net-name: demo_net0 userdata: "{{ lookup('file','./userdata')}}" state: present

24JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

以下のスペックで仮想マシンを起動する - name: demo_vm2 - image: ubuntu-14.04-amd64 - flavor: m1.tiny - keypair: saitou - secgroup: base_secgroup - network: demo_net0 - floating_ip: 自動付与 - userdata: ./userdata

demo_net0

demo_vm2demo_vm2

Page 25: OpenStack & Ansible で実現する自動化

デモ(5) 仮想ストレージの作成

--- - hosts: local

tasks: - name: create volume os_volume: cloud: devstack availability_zone: nova size: 1 display_name: demo_volume state: present

25JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

以下のスペックでストレージを作成する

name: demo_volume - size: 1GB

Page 26: OpenStack & Ansible で実現する自動化

デモ(6) 仮想ストレージの作成

--- - hosts: local

tasks: - name: attach volume os_server_volume: cloud: devstack server: demo_vm0 volume: demo_volume device: /dev/vdb state: present

26JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

ストレージをVMに接続する - server: demo_vm0 - volume: demo_volume - デバイスファイル: /dev/vdb

demo_vm2

demo_volume

/dev/vdb

Page 27: OpenStack & Ansible で実現する自動化

デモ(7)作成した仮想マシンの操作

[local] 127.0.0.1 ansible_connection=local

[instances] 172.16.1.132 172.16.1.133

[instances:vars] ansible_user=ubuntu ansible_ssh_private_key_file=/home/demo/.ssh/id_rsa.pub

27JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

作成した仮想マシンをansibleコマンドで操作する。 ここでは、仮想マシン上でunameコマンドを実行している。 % ansible instances -i inventory -a "uname -a"

inventoryファイル名: inventory00

Page 28: OpenStack & Ansible で実現する自動化

Dynamic Inventoryを活用する(1)

Ansibleは、操作対象ホストをインベントリーファイルで特定しています。

[問題] 管理対象ホストが増減して変化があった場合に、それに合わせて、インベントリーファイルの修正が必要。 特にOpenStackに代表されるクラウド基盤上のシステムを管理する場合は、特に厄介な問題になる。

[対策] 静的なインベントリーファイルの代わりに、外部プログラムを実行して取得したインベントリー情報を利用する。

28JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 29: OpenStack & Ansible で実現する自動化

Dynamic Inventoryを活用する(2)

Dynamic Inventoryとして利用される外部プログラムが満たすべき要件は次の通り。

1)単体のコマンドとして実行可能

2)引数として"--list"が指定された場合は、ホストリストをJSON形式で返す

3)引数として"--host <hostname>"が指定された場合は、ホスト固有のパラメーターをJSON形式で返す

29JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 30: OpenStack & Ansible で実現する自動化

デモ: Dynamic InventoryDynamic Inventoryプログラムを実行してみる

30JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

% ./inventory.py --list | jq { "instances": { "hosts": [ "172.16.1.132", "172.16.1.133" ], "vars": {} } }

% ./inventory.py --host 172.16.1.132 | jq { "ansible_ssh_private_key_file": "/home/demo/.ssh/id_rsa.pub", "ansible_user": "ubuntu" }

Page 31: OpenStack & Ansible で実現する自動化

デモ: Dynamic Inventoryを利用するDynamic Inventoryを利用して先程のansibleコマンドを実行してみる

31JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

% ansible instances -i inventory.py -a "uname -a" 172.16.1.132 | SUCCESS | rc=0 >> Linux demo-vm2 3.13.0-93-generic #140-Ubuntu SMP Mon Jul 18 21:21:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

172.16.1.133 | SUCCESS | rc=0 >> Linux demo-vm0 3.13.0-93-generic #140-Ubuntu SMP Mon Jul 18 21:21:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Page 32: OpenStack & Ansible で実現する自動化

Dynamic Inventoryの仕組み

32JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Dynamic Inventory

実行

OpenStack

ansibleRouterNetwork

VM#0

VM#1

API CallAPI

1) --listでホストリストを取得 2) リストアップされたホストに対して--hostを

実行してでホストの個別パラメータを取得

Page 33: OpenStack & Ansible で実現する自動化

03OpenStackとAnsible

33

まとめ

JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 34: OpenStack & Ansible で実現する自動化

OpenStackとAnsibleOpenStackに代表されるクラウドOSの機能は、驚くほどの速さで進化を続けており、もはや、作業手順書をスクリプト化して自動化するというような、従来の運用業務改善アプローチでは対処しきれない領域に達しています。

• 利用者のニーズに応じて短期間に増減する仮想マシン • 短縮される一方の作業のリードタイム • 求められるコストカット

34JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

人海戦術の終焉

Page 35: OpenStack & Ansible で実現する自動化

それAnsibleでやりませんか?クラウドOSの進化にあわせるように、Ansibleのような構成管理の自動化を行うツールも飛躍的に進化しています。 これらを利用することで、変化に強いシステム運用の仕組みを実現することができます。

OpenStackとAnsibleを組み合わせて Infrastructure as Code を更に進めてみませんか?

35JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30

Page 36: OpenStack & Ansible で実現する自動化

ご静聴ありがとうございました

36JAPAN OPENSTACK USER GROUP

JOSUG Meetup #30