オペレーションの自動化

Ansibleを利用した、さまざまなオペレーションの自動化を体験してください。

Presenter Notes

概要

> 操作環境の準備

体験ラウンジの環境を準備する

> Lesson1: Ansibleのインストール

Pythonのvirtualenv利用した仮想実行環境にAnsibleをインストールする

> Lesson2: 仮想マシンのデリバリ

OpenStackのAPIを利用して、仮想マシンを起動する

> Lesson3: ダイナミックインベントリ

OpenStackと連携して仮想マシンの管理を行う

> Lesson4: 運用オペレーション/ダイナミックインベントリ

デリバリされた仮想マシンの設定やミドルウェアのインストールなどの操作を行う

> 後片付け

体験ラウンジ環境の後片付け

Presenter Notes

> 操作環境の準備

下記のコマンドで、Ansibleが導入された操作用仮想マシンを用意します。

"student11" の部分には、操作端末に応じた番号が割り当てられます。

コマンド実行の様子(数分かかります):

---------ここから---------
$ cd /opt/support/t2-c2/ && ./01_init.sh
Cleaning up...
Deleting student10-step-server...
Booting student10-step-server...
...(中略)...
Waiting for guest OS to be ready........
Associating floating IP...
Associated floating IP: <Floating IP>

Use the following command to login student10-step-server
=> ssh -i ~/default.pem root@<Floating IP>
$ ssh -i ~/default.pem root@<Floating IP>
---------ここまで---------

Presenter Notes

> Lesson1: Ansibleのインストール(1)

Ansibleは、OSが提供するパッケージやPythonのpipを利用するなど、いくつかの方法でインストールすることができますが、 ここではPythonのvirtualenvを利用して、仮想実行環境にAnsibleをインストールする方法を紹介します。

pipを利用すると、Ansibleが依存しているモジュール(Jinja2など)もあわせてインストールされます。

コマンド実行の様子:

---------ここから---------
[root@student11-step-server ~]# cd $HOME && virtualenv venv
[root@student11-step-server ~]# source /root/venv/bin/activate
(venv)[root@student11-step-server ~]# pip install ansible
Downloading/unpacking ansible
  Downloading ansible-1.8.2.tar.gz (754kB): 754kB downloaded
...(中略)...
Successfully installed ansible paramiko jinja2 PyYAML pycrypto ecdsa markupsafe
Cleaning up...
(venv)[root@student11-step-server ~]# ansible --version
ansible 1.8.2
  configured module search path = None
---------ここまで---------

Presenter Notes

> Lesson1: Ansibleのインストール(2)

Ansibleのpingモジュールを利用して動作確認を行います。 ここではリモートホストではなく、ローカルホストにpingモジュールを摘要します。

コマンド実行の様子(コマンドプロンプトは一部省略しています):

---------ここから---------
(venv)# cd $HOME
(venv)# echo "localhost ansible_connection=local" > ansible_hosts
(venv)# ansible localhost -i ansible_hosts -m ping
localhost | success >> {
    "changed": false,
    "ping": "pong"
}
---------ここまで---------

実行結果が success となっていれば、動作確認成功です。

Presenter Notes

> Lesson1: Ansibleのインストール(3)

OpenStackのクライアントライブラリをインストールして、novaの操作が可能であることを確認します。このインストールにもpipを利用します。 novaコマンドで、仮想マシンのリストが取得できればインストール成功です。 踏み台となる student11-step-server と、テスト用の student11-test-server が起動していることが確認できます。

コマンド実行の様子:

---------ここから---------
(venv)# pip install python-novaclient==2.16.0
(venv)# pip install python-neutronclient==2.3.4
(venv)# source $HOME/openrc
(venv)# nova list
+--------------------------------------+-----------------------+--------+------------+-------------+---------------------------------+
| ID                                   | Name                  | Status | Task State | Power State | Networks                        |
+--------------------------------------+-----------------------+--------+------------+-------------+---------------------------------+
| 16b659aa-abe5-4d08-88ee-3803aae1b1cd | student11-step-server | ACTIVE | -          | Running     | work-net=10.0.0.1, 118.67.96.82 |
| cdac9e6e-7b2a-44ec-a18f-be6e7ea3b11e | student11-test-server | ACTIVE | -          | Running     | work-net=10.0.0.3               |
+--------------------------------------+-----------------------+--------+------------+-------------+---------------------------------+
---------ここまで---------

SecurityWarning が出力される場合がありますが、体験ラウンジでは無視してください。

Presenter Notes

> Lesson1: Ansibleのインストール(4)

Ansibleの基本動作を設定する $HOME/.ansible.cfg の新規作成と、操作対象ホストを記述した ansible_hosts[test-server] グループのメンバーとして student11-test-server のIPアドレスを追記します。IPアドレスについては、 nova list の出力結果取得したアドレスを指定してください。

設定ファイルを作成する($HOME/.ansible.cfg):

---------ここから---------
[defaults]
forks = 10
host_key_checking = False
gathering = smart
transport = smart
library = /root:/root/venv/lib/python2.6/site-packages/ansible/modules/core:/root/venv/lib/python2.6/site-packages/ansible/modules/extras
---------ここまで---------

インベントリファイルの修正($HOME/ansible_hosts):

---------ここから---------
localhost ansible_connection=local
[test-server]
10.0.0.3
---------ここまで---------

Presenter Notes

> Lesson1: Ansibleのインストール(5)

test-serverグループに対して遠隔操作が可能であることを、pingモジュールを利用して確認します。

コマンド実行の様子:

---------ここから---------
(venv)# ansible test-server -i ansible_hosts -m ping -u root --private-key=default.pem
10.0.0.3 | success >> {
  "changed": false,
  "ping": "pong"
}
---------ここまで---------

環境構成:

+-------------+                +-------------+
| step-server |                | test-server |
+------+------+                +------+------+
       |                              |
       | .1                           | .3
+------+------------------------------+------+
                                   10.0.0.0/24

Presenter Notes

> Lesson2: 仮想マシンの起動(1)

Ansibleを利用して仮想マシンを起動します。仮想マシンの起動には、Playbookを利用します。AnsibleのPlaybookは、1つ1つの作業をまとめた手順書のようなものです。

ansible-playbook コマンドを実行した分だけ仮想マシンが作成・起動してきます。

コマンド実行の様子:

---------ここから---------
(venv)# wget -O nova_compute.py http://goo.gl/rQXudE
(venv)# wget -O create_vm.yml http://goo.gl/foPjQw
(venv)# ansible-playbook -i ansible_hosts create_vm.yml
PLAY [localhost] ******************************************************
GATHERING FACTS *******************************************************
ok: [localhost]
TASK: [ansible_python_interpreter setup] ******************************
ok: [localhost]
TASK: [get uuid for generate hostname] ********************************
changed: [localhost]
TASK: [creating server] ***********************************************
changed: [localhost]
PLAY RECAP ************************************************************
localhost              : ok=4    changed=2    unreachable=0    failed=0
---------ここまで---------

Presenter Notes

> Lesson2: 仮想マシンの起動(2)

PlaybookはYAML形式で記述されており、いくつかのセクションに分かれています。OSの環境変数などもPlaybook内に記述して利用することができます。

仮想マシンが、無事に起動したかどうかを nova list コマンドで確認してみましょう。

Playbook(create_vm.yml):

---------ここから---------
---
- hosts: localhost

vars:
  auth:
    url: "{{ lookup('env', 'OS_AUTH_URL') }}"
    region_name: "{{ lookup('env', 'OS_REGION_NAME') }}"
    tenant_name: "{{ lookup('env', 'OS_TENANT_NAME') }}"
    username: "{{ lookup('env', 'OS_USERNAME') }}"
    password: "{{ lookup('env', 'OS_PASSWORD') }}"
  spec:
    host_prefix: "{{ lookup('pipe', 'hostname | cut -b 1-9') }}"
    flavor_ram: 1024
    flavor_name: "standard.xsmall"
    image_name: "centos-base"
    key_name: "default"
    secgroups: "default"

tasks:
- name: ansible_python_interpreter setup
  set_fact: ansible_python_interpreter="{{ lookup('pipe', 'which python') }}"
- name: get uuid for generate hostname
  command: /usr/bin/uuidgen
  register: result_uuid
- name: creating server
  nova_compute:
    state: present
    auth_url: "{{ auth.url }}"
    region_name: "{{ auth.region_name }}"
    login_tenant_name: "{{ auth.tenant_name }}"
    login_username: "{{ auth.username }}"
    login_password: "{{ auth.password }}"
    flavor_ram: "{{ spec.flavor_ram }}"
    flavor_include: "{{ spec.flavor_name }}"
    image_name: "{{ spec.image_name }}"
    key_name: "{{ spec.key_name }}"
    name: "{{ spec.host_prefix }}-{{ result_uuid.stdout }}"
    security_groups: "{{ spec.secgroups }}"
    insecure: True
---------ここまで---------

Presenter Notes

> Lesson3: Dynamic Inventory (1)

仮想マシンを起動するたびに、ansible_hostsファイルを変更するのは面倒です。そこで、Ansibleのもつ強力な機能であるダイナミックインベントリを利用して動的にインベントリファイルを生成します。

ダイナミックインベントリは、文字通り動的にインベントリファイルを生成するプログラムです。OpenStackを利用する場合は、novaのAPIから操作対象とする仮想マシンのリストを取得します。

コマンド実行の様子:

---------ここから---------
(venv)# wget -O inventory.py http://goo.gl/v6K6lX
(venv)# chmod +x inventory.py
(venv)# wget -O inventory.ini http://goo.gl/PIRgk9
---------ここまで---------

inventory.iniファイルのhostname_prefixを自身の環境にあわせてstudentNN-testに修正):

---------ここから---------
[test]
hostname_prefix = student11-test
---------ここまで---------

Presenter Notes

> Lesson3: Dynamic Inventory (2)

実際にダイナミックインベントリを利用してみます。pingモジュールを利用して、[test]グループの各仮想マシンをAnsibleから操作可能であることを確認します。 create_vm.yml を何度実行した後でも、操作対象となる仮想マシンの増加に動的に追随できます。

コマンド実行の様子:

---------ここから---------
(venv)# cd $HOME
(venv)# ansible test -i inventory.py -m ping -u root --private-key default.pem
10.0.0.4 | success >> {
    "changed": false,
    "ping": "pong"
}

10.0.0.1 | success >> {
    "changed": false,
    "ping": "pong"
}
---------ここまで---------

Presenter Notes

> Lesson4: 運用オペレーション(1)

ここまで構築した環境を利用して、仮想マシン群にパッケージをインストールするオペレーションを実施してみます。 パッケージをインストールするPlaybook(sample.yml)を作成します。非常に単純な構造です。

sample.yml:

---------ここから---------
---
- hosts: test

  vars:
    packages:
    - httpd
    - jq
    - mysql-server
    - zsh

  tasks:
  - yum: name={{ item }} state=latest
    with_items: packages
---------ここまで---------

Presenter Notes

> Lesson4: 運用オペレーション(2)

実際にPlaybook( sample.yml )を実行してみます。Playbookに記載したパッケージ(httpd,jq,mysql-server,zsh)がインストールされます。

コマンド実行の様子:

---------ここから---------
(venv)# ansible-playbook -i inventory.py -u root --private-key default.pem sample.yml

PLAY [test] *******************************************************************

GATHERING FACTS ***************************************************************
ok: [10.0.0.4]
ok: [10.0.0.1]

TASK: [yum name={{ item }} state=latest] **************************************
changed: [10.0.0.4] => (item=httpd,jq,mysql-server,zsh)
changed: [10.0.0.1] => (item=httpd,jq,mysql-server,zsh)

PLAY RECAP ********************************************************************
10.0.0.1                   : ok=2    changed=1    unreachable=0    failed=0
10.0.0.4                   : ok=2    changed=1    unreachable=0    failed=0
---------ここまで---------

Presenter Notes

> 後片付け

起動した仮想マシンをすべて削除します。

下記のように、操作用仮想マシンからログアウトして、仮想マシンを削除するスクリプトを実行します。

注意) 99_cleanup.sh を実行するホストが osdt-lounge-console-vm.novalocal であることを事前に確認してください。

コマンド実行の様子:

---------ここから---------
[root@student11-step-server ~]# logout
Connection to 118.67.96.82 closed.

$ hostname
osdt-lounge-console-vm.novalocal
$ cd /opt/support/t2-c2/ && ./99_cleanup.sh
Deleting student11-step-server
Deallocating da778dd3-db98-4477-ae25-dc6fcebaf86d...
Deleted floatingip: da778dd3-db98-4477-ae25-dc6fcebaf86d
---------ここまで---------

Presenter Notes

> まとめ

  • Ansible利用すると、さまざまなオペレーションを自動化することができます
  • Ansibleは、ダイナミックインベントリを利用することで、OpenStackのような外部の管理システムと連携できます
  • Ansibleに、まとまった仕事をさせるための手順書はPlaybookと呼ばれます
  • PlaybookはYAML形式で書かれており、非常に単純で可読性が高いのが特徴です

Presenter Notes

おつかれさまでした

Presenter Notes