openstack & ansible で実現する自動化
TRANSCRIPT
OpenStack & Ansible で実現する自動化
JOSUG Meetup #30
齊藤 秀喜 Internet Initiative Japan Inc. Japan OpenStack User Group
JAPAN OPENSTACK USER GROUP 1
JOSUG Meetup #30
自己紹介氏名: 齊藤 秀喜 (さいとう ひでき) 勤務先: 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
目次OpenStackとAnsibleの連携によるInfrastructure as Codeの実践方法について、その一例を紹介します。
1) OpenStackとAnsible > Ansibleとは?
> Undercloud/Overcloud
2) Ansibleを利用した作業の自動化 > OpenStack環境の操作 > Dynamic Inventoryを利用したインスタンス管理
3JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
01OpenStackとAnsibleを協調動作させる
4
OpenStackとAnsible
JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
Ansibleとは?Ansibleは、人間がシステムに対して実施する作業をコード化するためのツールです。
いわゆるInfrastructure as Codeを実現する仕組みの1つです。
1)管理対象ホストにエージェントを導入する必要がない
2)Dynamic Inventoryの採用により、環境の変化に柔軟に対応できる
3)多数のモジュールが標準で提供されている
4)標準モジュールについては、冪等性がほぼ担保されている
5)多くの小さなタスクを1つにまとめることができる
6)条件分岐やループなどの簡単な制御構造を実現できる
7)シンプルな仕組みでゼロからのスタートアップがしやすい
5JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
OpenStack環境での、Ansibleを利用価値は2つ
1.UnderCloudの構築と構成管理の実現 2.OverCloudの構築と構成管理の実現
UnderCloudとOverCloud
6JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
Infrastructure as Code
実現
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化
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を利用して 仮想リソースを管理
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
02AnsibleとOpenStackの連携を見てみましょう
10
Ansibleを利用した 高度な自動化デモ
JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
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形式で記述した 手順書のようなもの
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
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
インストール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 =
設定ファイル作成デフォルト設定から変更したい場合は、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
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"
動作確認
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", ], ...以下略
デモ:OpenStack環境の操作今回は、以下の操作を見ていく中で、OpenStackとAnsibleの連携についてご紹介します。
1)仮想ネットワークの作成 2)仮想ルータとの接続 3)仮想マシンの起動 - Floating IPの割り当て 4)Userataを用いた初期設定 5)仮想ストレージの作成 6)仮想ストレージの接続 7)作成した仮想マシンの操作
18JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
操作の仕組み
19JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
実行コード
実行
localhost
OpenStackOpenStack
module
ansibleRouterNetwork
VM#0
VM#1
API Call
API
クライアント認証ファイルの作成
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/
デモ(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
デモ(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
デモ(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
デモ(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
デモ(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
デモ(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
デモ(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
Dynamic Inventoryを活用する(1)
Ansibleは、操作対象ホストをインベントリーファイルで特定しています。
[問題] 管理対象ホストが増減して変化があった場合に、それに合わせて、インベントリーファイルの修正が必要。 特にOpenStackに代表されるクラウド基盤上のシステムを管理する場合は、特に厄介な問題になる。
[対策] 静的なインベントリーファイルの代わりに、外部プログラムを実行して取得したインベントリー情報を利用する。
28JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
Dynamic Inventoryを活用する(2)
Dynamic Inventoryとして利用される外部プログラムが満たすべき要件は次の通り。
1)単体のコマンドとして実行可能
2)引数として"--list"が指定された場合は、ホストリストをJSON形式で返す
3)引数として"--host <hostname>"が指定された場合は、ホスト固有のパラメーターをJSON形式で返す
29JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
デモ: 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" }
デモ: 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
Dynamic Inventoryの仕組み
32JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
Dynamic Inventory
実行
OpenStack
ansibleRouterNetwork
VM#0
VM#1
API CallAPI
1) --listでホストリストを取得 2) リストアップされたホストに対して--hostを
実行してでホストの個別パラメータを取得
03OpenStackとAnsible
33
まとめ
JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
OpenStackとAnsibleOpenStackに代表されるクラウドOSの機能は、驚くほどの速さで進化を続けており、もはや、作業手順書をスクリプト化して自動化するというような、従来の運用業務改善アプローチでは対処しきれない領域に達しています。
• 利用者のニーズに応じて短期間に増減する仮想マシン • 短縮される一方の作業のリードタイム • 求められるコストカット
34JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
人海戦術の終焉
それAnsibleでやりませんか?クラウドOSの進化にあわせるように、Ansibleのような構成管理の自動化を行うツールも飛躍的に進化しています。 これらを利用することで、変化に強いシステム運用の仕組みを実現することができます。
OpenStackとAnsibleを組み合わせて Infrastructure as Code を更に進めてみませんか?
35JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30
ご静聴ありがとうございました
36JAPAN OPENSTACK USER GROUP
JOSUG Meetup #30