Upload
hideki-saito
View
685
Download
0
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は、手作業のコード化と自動実行を実現するための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の構成要素Ansibleはコマンドラインベースのツールで、以下の要素から構成されています。
Okinawa Open Days 2016
# 構成要素 概要
1 Configuration Ansibleの振る舞いを決める設定ファイル
2 Inventory 管理対象ホストの一覧が記述されたファイル
3 Module タスクとしてAnsibleが実行するプログラム
4 Command タスクやPlaybookを実行するためのコマンド群
5 Playbook 複数のタスクから構成されるワークフロー定義ファイル
17
ansible-playbookによるシナリオ実行
Okinawa Open Days 2016
AnsibleはPlaybookにより、オペレーションのコード化を実現しています。 Playbookは、実施する一連のタスクを、順序立ててYAML形式で記述したものです。
20
インベントリファイルの課題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
(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変数指定
仮想マシンを削除する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
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