47
Ansible Hands-on Okinawa Open Days 2016 2016.12.05 Hideki Saito (@saito_hideki) Okinawa Open Days 2016 1

Ansible handson ood2016

Embed Size (px)

Citation preview

Ansible Hands-onOkinawa Open Days 2016

2016.12.05

Hideki Saito (@saito_hideki)

Okinawa Open Days 2016

1

whoami氏名: 齊藤 秀喜 (さいとう ひでき) TwitterID: @saito_hideki

• 所属: • 株式会社インターネットイニシアティブ • 日本OpenStackユーザ会ボードメンバー • Okinawa Open Days 2016実行委員

• 趣味: OpenStack, Ansible, IT Automation

Okinawa Open Days 2016

2

本セッションの目的本セッションでは、ITオートメーションツールである"Ansible"の仕組みと基本操作、パブリッククラウド環境での利用方法について、実際に手を動かしながら体験してみましょう。

(1) Ansibleのインストール

(2) Ansibleの仕組み

(3) パブリッククラウド環境で利用する

Okinawa Open Days 2016

3

Ansibleのインストール 〜前提条件〜

Cloud Shellでのコンソール操作が可能であること

Okinawa Open Days 2016

4

Ansibleは、手作業のコード化と自動実行を実現するためのITオートメーションツールです。

構築手順構築手順Server

Ansibleとは(1)Okinawa Open Days 2016

Apache

MySQL

PHP

Linux

Linux

Apache

MySQL

PHP

Server

Linux

Apache

MySQL

PHP

構築手順書作業実施

Playbookコード実行

オペレータ5

Ansibleとは(2)Ansibleは、ITオートメーションを実現する優秀なツールですが、他の選択肢も存在しています。 他の代表的なプロダクトとして、ChefやPuppetがあげれられます。

Okinawa Open Days 2016

6

Ansibleの特徴ChefとPuppetはAnsibleに比べて歴史も長く、多くの利用実績があります。また、自動化を実現するためのコンセプトも似通っています。

これらのプロダクトに対して、Ansibleは以下のような特徴を持っています。

◎ 運用しやすいコマンドラインベースのシンプルなアーキテクチャ ◎ エージェントレスなうえに、CMDBもなしで身軽 ○ 標準提供される数多くのモジュール群をもっている ☓ 外部から制御可能なAPIをもっていない(CLIベースなので) ☓ ユーザの細かな権限管理をしにくい ☓ Ansibleの設定やログなどを中央で管理する方法は提供されない

Okinawa Open Days 2016

7

Server

Infrastructure as Codeを実現

Okinawa Open Days 2016

Linux

Apache

MySQL

PHP

Playbook例: テスト環境の⾃動構築

fetch/push review

check/fetch/review

fetch/pushdeploy

operation

operation

exec

8

ITオートメーションツールと、他の役割のツール群を連携させることで、更に大きな導入効果を得られます。

ハンズオンの準備Okinawa Open Days 2016

Github上のリポジトリをチェックアウト ハンズオン用のリポジトリをチェックアウトして利用します。 このリポジトリには、ダイナミックインベントリやPlaybookなどの以降で利用するファイル群が保存されています。

$ cd ~ $ git clone https://github.com/saito-hideki/ood-handson-ansible $ cd ood-handson-ansible

├── ansible.cfg ├── gce.ini ├── gce.py ├── hosts ├── playbooks │ └── gce │ └── create_instance.yml ├── README.md └── secrets.py.sample

Ansibleの設定ファイル

<ood-handson-ansibleリポジトリ>

ダイナミックインベントリ設定ファイル

ダイナミックインベントリインベントリファイル

GCE用のダイナミックインベントリが 利用する認証設定ファイルPlaybook

9

Ansibleのインストール(1)Cloud Shell上にvirtualenv環境を構築します。

• 仮想環境名: ood2016

virtualenv環境への切り替え以降に、pipでインストールしたPythonモジュールやパッケージは、virtualenv環境である$HOME/ood2016/以下に配置されます。

Okinawa Open Days 2016

$ virtualenv ~/ood2016 $ source ~/ood2016/bin/activate (ood2016)$

virtualenvの環境名がプロンプトに表示されます

virtualenv環境への切り替え

virtualenv環境(ood2016)の作成

10

Ansibleのインストール(2)AnsibleからGoogle Cloud Platformを操作するのに必要となる Apache Libcloud を、pipでインストールします。

Okinawa Open Days 2016

(ood2016)$ pip install apache-libcloud Collecting apache-libcloud Downloading apache_libcloud-1.4.0-py2.py3-none-any.whl (2.3MB) 100% |████████████████████████████████| 2.4MB 559kB/s Installing collected packages: apache-libcloud Successfully installed apache-libcloud-1.4.0

Ansible

GCPモジュール

Apache LibcloudServerServerServer

11

Ansibleのインストール(3)pipを利用してAnsibleをインストールして、設定ファイルを確認します。

Okinawa Open Days 2016

(ood2016)$ pip install ansible Installing setuptools, pip, wheel...done.

[defaults] callback_whitelist = profile_tasks forks = 10 gathering = smart host_key_checking = False private_key_file=/home/<UserID>/.ssh/google_compute_engine transport = smart

設定ファイルパス: ~/ood-handson-ansible/ansible.cfg

設定可能なパラメータ > http://docs.ansible.com/ansible/intro_configuration.html

12

Ansibleのインストール(4)Ansible(ver2.2.0.0)が正常に動作することを確認します。

Okinawa Open Days 2016

(ood2016)$ cd ~/ood-handson-ansible (ood2016)$ ansible --version ansible 2.2.0.0 config file = /home/<UserID>/ood-handson-ansible/ansible.cfg configured module search path = Default w/o overrides

(ood2016)$ ansible localhost -i hosts -m ping localhost | SUCCESS => { "changed": false, "ping": "pong" }

pingモジュールを利用して動作確認を行います。

SUCCESSとなっていれば、Ansibleは正常に動作しています

チェックアウトしたリポジトリ上にある インベントリファイル(hosts)を利用します

13

ansibleコマンドの書式Okinawa Open Days 2016

ansibleコマンドは、パッケージをインストールしたり、対象ホストを再起動するなど、連続しない単発のタスクを実行するときに利用します。[書式] ansible <host-pattern> [options]

[例1] モジュールを実行する ansible <パターン> -i インベントリ -m モジュール ansible localhost -i hosts -m ping

[例1] モジュールに変数を渡して実行する ansible <パターン> -i インベントリ -m モジュール -e "key=value" ansible localhost -i hosts -m debug -e "msg='Hello,World!'"

[例2] アドホックにOSのコマンドを実行する ansible <パターン> -i インベントリ -a "コマンド" ansible testserver -i ./gce.py -a "uname -a"

14

ansible-playbookコマンドの書式

Okinawa Open Days 2016

ansible-playbookコマンドは、ワークフローをYAML形式で記述したPlaybookを使用して、連続するタスクを実行するときに利用します。[書式] ansible-playbook -i インベントリ playbook.yml

[例1] Playbookを実行する ansible-playbook -i インベントリ ansible-playbook -i hosts playbook.yml

[例2] Playbookを実行時に-eオプションで変数を与える ansible-playbook -i インベントリ -e "変数=値" Playbook ansible-playbook -i ./gce.py -e "hostname=testserver" playbook.yml

[例3] Playbookを実行時に-tオプションでタグを指定する ansible-playbook -i インベントリ -t Playbook ansible-playbook -i ./gce.py -t start playbook.yml

15

Ansibleの仕組み

Okinawa Open Days 2016

16

Ansibleの構成要素Ansibleはコマンドラインベースのツールで、以下の要素から構成されています。

Okinawa Open Days 2016

# 構成要素 概要

1 Configuration Ansibleの振る舞いを決める設定ファイル

2 Inventory 管理対象ホストの一覧が記述されたファイル

3 Module タスクとしてAnsibleが実行するプログラム

4 Command タスクやPlaybookを実行するためのコマンド群

5 Playbook 複数のタスクから構成されるワークフロー定義ファイル

17

Ansibleによる自動化の仕組み

Okinawa Open Days 2016

(a) UNIXホストに対する操作

(b)Windowsホストに対する操作

(c)ネットワーク機器に対する操作

18

ansibleによるタスク実行Okinawa Open Days 2016

19

ansible-playbookによるシナリオ実行

Okinawa Open Days 2016

AnsibleはPlaybookにより、オペレーションのコード化を実現しています。 Playbookは、実施する一連のタスクを、順序立ててYAML形式で記述したものです。

20

パブリッククラウド環境で利用する

Okinawa Open Days 2016

21

インベントリファイルの課題Ansibleでは、インベントリファイルと呼ばれるテキストファイルで操作対象ホストの情報を管理しています。

Okinawa Open Days 2016

mail.example.com

[webservers] foo.example.com bar.example.com

[dbservers] www[00:50]

<インベントリファイル>

IPアドレスまたは名前解決可能なホスト名

複数のホストエントリのグループ化が可能

アルファベットと数字であればレンジ指定が可能

22

ダイナミックインベントリ操作対象の増減が激しい環境では、手動でインベントリファイルのエントリをメンテナンスするのは現実的に難しくなります。 しかし、幸いなことにGCPのようなクラウドサービスは、ユーザ管理下のリソースに関する情報を取得可能なAPIを提供しています。Ansibleは、このAPIをダイナミックインベントリから利用することで、環境の変化に対応します。

Okinawa Open Days 2016

API

JSON形式の インベントリ情報 ServerServerServer

23

ダイナミックインベントリを利用するGCPを対象として、ダイナミックインベントリを利用するには、いくつかの準備が必要です。

Okinawa Open Days 2016

(1) ダッシュボードから"ツールとサービス"をクリックします

(2) "API Manager"をクリックします

(3) "認証情報"をクリックします

サービスアカウントの準備 Google Cloud Platformのダッシュボードから、API Managerを利用して認証情報を作成し、ダウンロードします。

24

ダイナミックインベントリを利用する

Okinawa Open Days 2016

サービスアカウントの準備

(4) "サービスアカウントキー"を作成します

ファイル名: credential.json として保存してください

25

ダイナミックインベントリを利用する

Okinawa Open Days 2016

サービスアカウントの準備 作成した認証ファイルを、Cloud Shellにアップロードします。

(5) Cloud Shellのメニューバーからファイルアップロードを選択して、認証ファイルアップロードします。

26

ダイナミックインベントリを利用する

Okinawa Open Days 2016

APIを有効化する Google Compute EngineをAPI経由で操作する機能を有効化します。"API Manager"の"ライブラリ"から"Compute Engine API"を"有効"にします。

27

ダイナミックインベントリを利用する

Okinawa Open Days 2016

GCP認証ファイルの作成 Google Cloud PlatformのAPIを利用するために必要となる認証情報を設定するファイル(secrets.py)を作成します。 secrets.pyの内容は以下の2行です。

GCE_PARAMS = ('<client_email>', '<credentialファイルパス>') GCE_KEYWORD_PARAMS = {'project': '<project_id>'}

credential.jsonの"project_id"パラメータの値

credential.jsonの"client_email"パラメータの値 credential.jsonファイルのパス

28

ダイナミックインベントリを利用する

Okinawa Open Days 2016

ダイナミックインベントリの動作確認 GCP用のダイナミックインベントリは、Pythonスクリプトで提供されています。

(ood2016)$ ./gce.py --help usage: gce.py [-h] [--list] [--host HOST] [--pretty] Produce an Ansible Inventory file based on GCE optional arguments: -h, --help show this help message and exit --list List instances (default: True) --host HOST Get all information about an instance --pretty Pretty format (default: False) (ood2016)$ ./gce.py --pretty --list (ood2016)$ ./gce.py --pretty --host <ホスト名>

virtualenvの環境名がプロンプトに表示されいない場合は、以下のコマンドを実行してください

$ source ~/ood2016/bin/activate 29

仮想マシンを起動するOkinawa Open Days 2016

GCEと連携して仮想マシンを起動する create_instance.ymlを適用し、仮想マシンを起動させてみましょう。--- - hosts: localhost

vars: gcp: driver: google hostname: "{{ hostname }}" machine_image: https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1604-xenial-v20161115 machine_type: n1-standard-1 project: ood2016-handson zone: asia-northeast1-a tasks: - command: > docker-machine create --driver "{{ gcp.driver }}" --google-project "{{ gcp.project }}" --google-zone "{{ gcp.zone }}" --google-machine-type "{{ gcp.machine_type }}" --google-machine-image "{{ gcp.machine_image }}" "{{ gcp.hostname }}" - command: gcloud compute ssh "{{ gcp.hostname }}" --zone "{{ gcp.zone }}" -- uname - name: show getting start debug: msg: "Usage: ssh -i <private-key file> -l {{ ansible_user_id }} {{ gcp.hostname }}.{{ gcp.zone }}.{{ gcp.project }}" tags: - usage

Ansibleが実行するタスクが列挙されています

GCEの情報や、起動する仮想マシンのスペックが定義されています

タスクを実行するホストを指定しています

みなさんの環境にあわせて修正してください

30

仮想マシンを起動するOkinawa Open Days 2016

(ood2016)$ cd ~/ood-handson-ansible/ (ood2016)$ ansible-playbook -i hosts -e "hostname=testserver" playbooks/gce/create_instance.yml

PLAY [localhost] *************************************************************** TASK [setup] ******************************************************************* Friday 02 December 2016 16:33:15 +0900 (0:00:00.027) 0:00:00.027 ******* ok: [localhost] TASK [command] ***************************************************************** Friday 02 December 2016 16:33:16 +0900 (0:00:00.927) 0:00:00.955 ******* changed: [localhost] TASK [command] ***************************************************************** Friday 02 December 2016 16:39:07 +0900 (0:05:50.367) 0:05:51.323 ******* Enter passphrase (empty for no passphrase): 何も入力せずにEnter Enter same passphrase again: 何も入力せずにEnter changed: [localhost] TASK [show getting start] ****************************************************** Friday 02 December 2016 16:39:28 +0900 (0:00:21.277) 0:06:12.600 ******* ok: [localhost] => { "msg": "Usage: ssh -i <private-key file> -l %userid% testserver.asia-northeast1-a.ood2016-handson" } PLAY RECAP ********************************************************************* localhost : ok=4 changed=2 unreachable=0 failed=0 ... 以下略 ...

<ansible-playbookコマンド実⾏結果>

taskセクション を順次実⾏

-eオプションで変数を定義

31

Playbook

仮想マシンを起動するOkinawa Open Days 2016

GCEと連携した仮想マシンの起動プロセス ここでは、ローカルホストのCloud Shell上で、commandモジュールからdocker-machineコマンドを実行しています。

インベントリファイル

モジュール

Cloud Shell

(4) API

(1) read

(5) create & boot

(2) read

実行可能コード

(3) generate

execinstance

32

仮想マシンを起動するOkinawa Open Days 2016

起動した仮想マシンにログインする GCE上に起動した"testserver"に実際にログインしてみましょう。

(ood2016)$ ./gce.py --host testserver | jq .gce_public_ip "NNN.NNN.NNN.NNN" (ood2016)$ ssh -i ~/.ssh/google_compute_engine NNN.NNN.NNN.NNN <userd>@testserver:~$ hostname testserver <userd>@testserver:~$ exit logout Connection to NNN.NNN.NNN.NNN closed. (ood2016)$

SSHログイン成功!

ダイナミックインベントリを利用してIPアドレスを調べる

33

Dockerコンテナを起動するOkinawa Open Days 2016

testserverがAnsibleから操作できることを確認 GCE上に起動したtestserverが、Ansibleから操作できることを確認します。ここでは、ダイナミックインベントリを利用しています。

(ood2016)$ ansible testserver -i ./gce.py -m ping testserver | SUCCESS => { "changed": false, "ping": "pong" }

1

23

3

GCE上のホストリストを取得

testserverの詳細情報を取得

testserver上でpingモジュールを実行

1

2

1 2 3

34

Dockerコンテナを起動するOkinawa Open Days 2016

Dockerハンズオンで登録したイメージを再利⽤ Dockerハンズオンで作成・登録した、Dockerコンテナ(v1.0/v1.1)のイメージを再利用します。

モジュール

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

Cloud Shell

(2) API

(3) read

(1) read

実行可能コード

(4) generate

instance

(5) sftp(6) ssh / exec

実行可能コード

CMDB

35

Dockerコンテナを起動するOkinawa Open Days 2016

(ood2016)$ ansible-playbook -i ./gce.py \ -e "hostname=testserver" -e "tag=v1.0" playbooks/gce/launch_container.yml

PLAY [testserver] ************************************************************** TASK [setup] ******************************************************************* Saturday 03 December 2016 14:01:29 +0900 (0:00:00.033) 0:00:00.033 ***** ok: [testserver] TASK [install requirement packages by apt] ************************************* Saturday 03 December 2016 14:01:31 +0900 (0:00:01.989) 0:00:02.023 ***** changed: [testserver] => (item=[u'python-pip']) TASK [install requirement packages by pip] ************************************* Saturday 03 December 2016 14:02:17 +0900 (0:00:46.477) 0:00:48.500 ***** changed: [testserver] => (item=docker-py) TASK [pull container image from gcr.io by gcloud command] ********************** Saturday 03 December 2016 14:02:22 +0900 (0:00:05.024) 0:00:53.525 ***** changed: [testserver] => (item=v1.0) changed: [testserver] => (item=v1.1) TASK [launch container] ******************************************************** Saturday 03 December 2016 14:02:46 +0900 (0:00:23.682) 0:01:17.208 ***** changed: [testserver] PLAY RECAP ********************************************************************* testserver : ok=5 changed=4 unreachable=0 failed=0 ...以下略...

36

変数指定 Playbook変数指定

Dockerコンテナを起動するOkinawa Open Days 2016

GCPダッシュボードからHTTPアクセスを許可 起動したコンテナに対して、インターネット経由でのHTTPアクセスを許可します。

37

Dockerコンテナを起動するOkinawa Open Days 2016

Webブラウザからアクセスする WebブラウザからコンテナにHTTPアクセスしてみましょう。

38

Dockerコンテナを切り替える

Okinawa Open Days 2016

(ood2016)$ ansible-playbook -i ./gce.py \ -e "hostname=testserver" -e "tag=v1.1" playbooks/gce/switch_container.yml PLAY [testserver] ************************************************************** TASK [setup] ******************************************************************* Saturday 03 December 2016 16:53:49 +0900 (0:00:00.046) 0:00:00.046 ***** ok: [testserver] TASK [stop container] ********************************************************** Saturday 03 December 2016 16:53:51 +0900 (0:00:01.637) 0:00:01.683 ***** changed: [testserver] TASK [launch container] ******************************************************** Saturday 03 December 2016 16:53:52 +0900 (0:00:01.111) 0:00:02.795 ***** changed: [testserver] PLAY RECAP ********************************************************************* testserver : ok=3 changed=2 unreachable=0 failed=0 ...以下略...

起動中のコンテナをv1.0からv1.1に切り替えます 起動中のv1.0を停止し、v1.1を起動することにより、アプリケーションを切り替えてみましょう。

39

変数指定 Playbook変数指定

Dockerコンテナを切り替える

Okinawa Open Days 2016

Webブラウザからアクセスする WebブラウザからコンテナにHTTPアクセスしてみましょう。

40

仮想マシンを削除するOkinawa Open Days 2016

(ood2016)$ ansible-playbook -i hosts -e "hostname=testserver" playbooks/gce/delete_instance.yml PLAY [localhost] *************************************************************** TASK [setup] ******************************************************************* Saturday 03 December 2016 17:05:40 +0900 (0:00:00.023) 0:00:00.023 ***** ok: [localhost] TASK [delete instance from GCE] ************************************************ Saturday 03 December 2016 17:05:41 +0900 (0:00:00.484) 0:00:00.508 ***** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0

...以下略...

起動中の仮想マシンを削除します 最後に、GCE上で起動しているtestserverを削除するPlaybookを実行してみましょう。

41

Playbook変数指定

仮想マシンを削除するOkinawa Open Days 2016

GCEと連携した仮想マシンの削除プロセス 起動時と同じプロセスで、今度はローカルホストのCloud Shell上で、commandモジュールからdocker-machineコマンドを利用してインスタンスを削除します。

インベントリファイル

モジュール

Cloud Shell

(4) API

(1) read

(5) delete

(2) read

実行可能コード(3) generate

exec

instance 42

まとめ

Okinawa Open Days 2016

43

IT Automation by AnsibleOkinawa Open Days 2016

このハンズオンセッションでは、Ansibeを利用したオペレーションの自動化について体験していただきました。 Ansibleに代表されるITオートメーションツールは、これまで人間が行ってきた作業を自動化するための機能を提供してくれます Google Cloud PlatformやOpenStackのようなクラウド基盤との連携機能を持っており、親和性が高いのが特徴です。

44

Infrastructure as CodeITオートメーションツールを導入して、 手作業のコード化を推進することで、ソフトウェア開発の分野で利用されているQAやテストなどの優れた手法を、ITインフラの運用管理にも応用することができるようになります。

1.手順書のコード化 2.コードのリビジョンの管理 3.チケットシステムによる課題管理 4.コードレビュー 5.テスト 6.デプロイシステム 7.インフラの構成管理

Internet Week 2016

出展: Wikipedia1〜7をシステマチックに連携させることで

Infrastructure as Codeを実現する

45

Ansible関連情報• 公式サイト

• https://www.ansible.com/

• Tower公式サイト • https://www.ansible.com/tower

• 公式ドキュメント • http://docs.ansible.com/ansible/index.html

• ソースコードリポジトリ • https://github.com/ansible/ansible • https://github.com/ansible/ansible-modules-core • https://github.com/ansible/ansible-modules-extras

Internet Week 2016

46

おつかれさまでした:-)

Okinawa Open Days 2016