Download pdf - Ansible quickstart

Transcript
Page 1: Ansible quickstart

Ansible ~ Quick Start ~

Internet Initiative Inc. Hideki Saito (@saito_hideki)

1 ver1.1

Page 2: Ansible quickstart

目次‣ 自己紹介

‣ はじめに

‣ Ansibleについて

- インストールする

- 使ってみる

- 「仕事」をさせてみる

‣ まとめ

2

Page 3: Ansible quickstart

自己紹介‣ 氏名: 齊藤 秀喜(さいとう ひでき)

- Twitter: @saito_hideki

- Blog: http://d.hatena.ne.jp/pyde/

‣ 勤務先: 株式会社インターネットイニシアティブ(IIJ)

- http://www.iij.ad.jp/

‣ 所属: 日本OpenStackユーザ会 ボードメンバー

‣ 趣味: Python/OpenStack /Ansible

‣ 仕事: クラウド基盤のちょっとした開発やちょっとした運用

- http://www.iij.ad.jp/GIO/

3

Page 4: Ansible quickstart

はじめに‣ Ansibleは物理・仮想・クラウド基盤に対して「人」が行う仕事を

自動化するためのソフトウェアで構成管理ツールと呼ばれることもあります。

‣ これまで作業手順書や、それをスクリプト言語などでコード化して実行してきた個々の作業を「仕事」としてまとめて管理できるという特徴があります。

‣ システムの構成管理をする目的で導入しますが、Ansibleだけで全てをカバーできるわけではありませんのでご注意を。

‣ 本セッションでは、Ansibleの仕組みと導入方法の一例、そして簡単な仕事をさせるまでの流れをご紹介します。

4

Page 5: Ansible quickstart

Ansibleについて

5

Page 6: Ansible quickstart

Ansibleとは?

‣ 何をするものなのか? - Pythonで書かれた*個々の作業*だけなく*まとまった仕事*の単位で自動

化を行うツール

- OS・ミドルウェア・アプリケーションのインストール・設定などの一連の作業をPlaybookとして1つにまとめてワンアクションで実行させることが可能

- 多数の外部モジュールが標準・オプションで提供されている

- 適用した作業に対する冪等性が担保されている(担保されていないモジュールもある)

- push型でエージェントレス。操作対象ノードにSSHでログインできれば最低限ど動作するため導入の敷居が低い

‣ 入手先は? - 公式サイト: http://www.ansibleworks.com/

- ソースコード: https://github.com/ansible/ansible

- githubのtagによるとv0.01のリリースは2009年

- 現時点(2013-12)で最新の安定版はv1.4.1

6

Page 7: Ansible quickstart

さまざまな仕組みを協調動作させる

世の中には、さまざまなタイプの構成管理ツールがありますが、ここでは大きく2つに分けてみます。

これまで脈々と培ってきた「手順書」ベースの仕事を自動化する必要があるのであれば、選択肢は従来型のほうが適しています(現時点では)。

‣ 作業の自動化を主眼とした構成管理ツール スクリプトなど従来のツールの延長線上にあるもの

- Puppet�(ruby…)

- Chef (ruby…)

- Capistrano (ruby…)

- Ansible(python!!!) 今回ご紹介します

‣ クラウド基盤の構成管理を行うためのツール さまざまな出自の異なるクラウド基盤の制御とAPI共通化に注力したもの

- Apache libcloud

- Deltacloud

- Rightscale

- SCALR

7

Page 8: Ansible quickstart

構成要素(キーワード)

‣ module - サービスの起動停止などansibleに行わせる作業を外部モジュールとして管

理する

‣ playbook - 作業(module)の一連の流れをまとめたもの

‣ plugin - moduleの実行失敗時のcallbackなどansibleそのものの機能を提供する

‣ inventory - 操作対象ノードリスト

hostsファイル的なもの

8

Page 9: Ansible quickstart

Ansibleをインストールする

9

Page 10: Ansible quickstart

導入から稼働まで(ubuntu12.04lts編�[1])

1. 必要となるパッケージ群をダウンロード 12.04のパッケージ版はv1.1と古く、OpenStack用のモジュールが提供されていないためgithubからソースコード(v1.3.4)を取得してインストールする

!

!

2. virtualenv環境構築してAnsibleをインストール 1. virtualenv環境構築

ansibleをOS標準とは別のモジュールパスにインストールする

!!!!!

2. ansibleが依存するモジュール群をインストール

 $ sudo apt-get install -y git python-pip python-virtualenv

$ virtualenv app New python executable in ansible/bin/python Installing distribute....done. Installing pip...done. $ source app/bin/activate (app) $

(app) $ pip install PyYAML jinja2

10

Page 11: Ansible quickstart

導入から稼働まで(ubuntu12.04lts編�[2])

!3. githubからansibleを取得してインストール

- v1.3.4をcheckoutする

- この例ではモジュールはapp/share/ansible/にインストールされる

(app) $ mkdir src && cd src (app) $ git clone https://github.com/ansible/ansible.git (app) $ cd ansible (app) $ git checkout -b v1.3.4 v1.3.4 (app) Switched to a new branch 'v1.3.4’  (app) $ python setup.py build

OS

python !

python-virtualenv(A) ~/app/

modules(A)

<pythonのvirtualenv環境>

modules

virtualenvの外側に影響を与えない

python-virtualenv(B) ~/hogehoge/

modules(B)

11

Page 12: Ansible quickstart

導入から稼働まで(ubuntu12.04lts編�[3])

3. 動作確認 1. インベントリファイルを作成

インベントリには操作対象となるホストのIPアドレスを記載する

※他にも様々な記載方法が可能

!!

2. pingモジュールで動作確認(successとなることを確認する)

(app) $ ansible -i hosts all -u foo -k -m pingSSH password: ********192.168.100.110 | success >> { "changed": false, "ping": "pong"}!-i: インベントリファイル名-u: 対象ノードにsshログインするユーザ名-k: 実行時にsshログインパスワードを入力するインタラクションを発生させる-m <モジュール名>

(app) $ echo “192.168.100.110” > hosts

12

Page 13: Ansible quickstart

導入から稼働まで(ubuntu12.04lts編�[4])

!3. setupモジュールで操作対象サーバの情報を取得してみる

取得した情報は環境変数としてPlaybook内で利用可能 (app) $ ansible -i hosts all -u foo -k -m setupSSH password: ********172.16.8.130 | success >> { "ansible_facts": { "ansible_all_ipv4_addresses": [ "192.168.122.1", "172.16.8.130", "169.254.169.254" ], "ansible_all_ipv6_addresses": [ "fe80::20c:29ff:fe8e:2665", "fe80::883d:a8ff:fead:cfaf" ], "ansible_architecture": "x86_64", "ansible_bios_date": "07/31/2013", "ansible_bios_version": "6.00", "ansible_br_ex": { "active": true,[省略]

13

restarted

Page 14: Ansible quickstart

Ansibleを使ってみる

14

Page 15: Ansible quickstart

Ansible実行ノードから構成管理対象ノードに対してモジュールからpythonの実行コードを生成してsftpで転送し、ssh経由で実行する。

モジュール実行の仕組み(リモート)

15

Page 16: Ansible quickstart

16

pythonの実行系を持たないスイッチなどのネットワークデバイスを操作する場合の代表的な動きは以下の通り。実行コードはAnsibleノード上に生成され実行される。

モジュール実行の仕組み(ローカル経由でリモート)

Page 17: Ansible quickstart

Ansibleの外部モジュール

17

Category Description

Cloud EC2/OpenStackの制御などクラウド基盤管理用モジュール群

Commands ターゲットノードで直接コマンド実行を行うためのモジュール群

Database MySQLなどのデータベース操作を行うためのモジュール群

Files ファイルシステム操作や設定ファイルの書き換えを行うためのモジュール群

Internal 非同期操作の進捗確認などAnsibleが内部利用するためのモジュール群

Inventory インベントリ情報の動的操作用モジュール群

Messaging AMQP操作用モジュール群

Monitoring 監視システム操作用モジュール群

Net Infrastructure 物理・仮想ネットワーク操作用モジュール群

Network 操作対象ノードからHTTP/FTPなどの通信を行うためのモジュール群

Notification IRC/EMailなどを使って通知を行うためのモジュール群)

Packaging yum/apt/pipなどのパッケージ操作を行うためのモジュール群

Source Control gitなどのリビジョンコントロールシステム操作用モジュール群

System OS操作用モジュール群

Utilities Ansibleの実行を一時停止させるなどのユーティリティモジュール群

Web Infrastructure djangoなどのWebサービスを操作用モジュール群

Page 18: Ansible quickstart

Ansibleの外部モジュールの使い方

‣ ansible-docコマンドでモジュールのオプションを確認する [書式] ansible-doc <モジュール名>

18

(app) $ ansible-doc file> FILE! Sets attributes of files, symlinks, and directories, or removes files/symlinks/directories. Many other modules support the same options as the [file] module - including [copy], [template], and [assemble].!Options (= is mandatory):!- force force the creation of the symlinks in two cases: the source file does not exist (but will appear later); the destination exists and a file (so, we need to unlink the "path" file and create symlink to the "src" file in place of it). (Choices: yes, no)<…>Notes: See also [copy], [template], [assemble]!- file: path=/etc/foo.conf owner=foo group=foo mode=0644- file: src=/file/to/link/to dest=/path/to/symlink owner=foo group=foo state=link

Page 19: Ansible quickstart

モジュールを使ってみる

‣ serviceモジュールでターゲットホストのhttpdをリスタートしてみる

!!!!

‣ yumモジュールを使ってlibselinux-pythonパッケージをインストールしてみる

19

(app) $ ansible -i hosts all -u foo -k -K -m service -a "name=httpd state=restarted"SSH password: ********sudo password [defaults to SSH password]: ********172.16.0.1 | success >> { "changed": true, "name": "httpd", "state": "started"}

(app) $ ansible -i hosts all -u foo -k -K -m yum -a "name=libselinux-python state=present"SSH password: ********sudo password [defaults to SSH password]: ********172.16.0.1 | success >> { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror, priorities\nLoading mirror speeds from cached hostfile\n * base: ftp.jaist.ac.jp\n * epel: ftp.kddilabs.jp\n * extras: ftp.jaist.ac.jp\n * updates: ftp.jaist.ac.jp\n183 packages excluded due to repository priority protections\nSetting up Install Process\nResolving Dependencies\n--> Running transaction check\n---> Package libselinux-python.x86_64 0:2.0.94-5.3.el6_4.1 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n libselinux-python x86_64 2.0.94-5.3.el6_4.1 updates 202 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package(s)\n\nTotal download size: 202 k\nInstalled size: 653 k\nDownloading Packages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r Installing : libselinux-python-2.0.94-5.3.el6_4.1.x86_64 1/1 \n\r Verifying : libselinux-python-2.0.94-5.3.el6_4.1.x86_64 1/1 \n\nInstalled:\n libselinux-python.x86_64 0:2.0.94-5.3.el6_4.1 \n\nComplete!\n" ]}

Page 20: Ansible quickstart

apacheやmysqlのインストールを行い、適切に設定してサービスを起動する。など1つ1つの「作業」をまとめて、「ブログサーバを構築して利用者に提供する」といったように抽象化したものを、ここでは「仕事」と呼ぶことにすると…

AnsibleのPlaybookで仕事をさせてみる(1)

ブログサーバサービスを 利用者に提供する

nginxを インストール・構築する

MySQLを インストール・設定する

PHPをインストールする

WordPressを インストール・設定する

仕事小道具

小道具

小道具

小道具

小さな仕事・作業

これがAnsibleのPlaybookで 行える「仕事」

20

Page 21: Ansible quickstart

Playbookのディレクトリ構造

AnsibleのPlaybookで仕事をさせてみる(2)

playbook名/ group_vars/ all roles/ 小さな仕事-A/ tasks/ main.yml handlers/ main.yml templates/ foo.conf.j2 bar.conf.j2 baz.conf.j2 file/ hogehoge.conf 小さな仕事-B/

小さな仕事-C/ site.yml

たとえば”wordpress-release”など「仕事」の名前

Playbook内でで利用する環境変数を定義するファイル

mysqlの設定・起動などの「小さな仕事」の単位をroles内で定義

実際に行う作業を定義

tasks内の作業結果をトリガーとして実施する必要のある動作を定義。例えば、tasksでmy.cnfの修正作業を実施場合に必要となる「mysqldの再起動」などを定義する

my.cnfなどの設定ファイルのテンプレートを置く。テンプレート中に{{ 環境変数 }} のように書くことでjinja2でパラメータの置き換えが可能

Playbookが含む小さな仕事(roles内の仕事)のリストを定義

21

対象サーバにそのまま置けば良いファイルを定義

Page 22: Ansible quickstart

AnsibleのPlaybookで仕事をさせてみる(3)

$ ansible-playbook -u root -k -i hosts site.ymlSSH password: ********!PLAY [Install Wordpress, MySQL, Nginx, and PHP-FPM] ***************************!GATHERING FACTS ***************************************************************ok: [192.168.100.110][省略]TASK: [Install Mysql package] *************************************************changed: [192.168.100.110] => (item=mysql-server,MySQL-python,libselinux-python,libsemanage-python)!TASK: [Create Mysql configuration file] ***************************************changed: [192.168.100.110][省略]PLAY RECAP ********************************************************************192.168.100.110 : ok=25 changed=24 unreachable=0 failed=0

ブログサーバを構築して提供するPlaybookを実行してみる

22

Page 23: Ansible quickstart

ansibleのplaybook例

‣ httpdをインストールして設定しスタートさせる

記述はYAML形式

23

---- hosts: webservers vars: http_port: 80 max_clients: 200 remote_user: root tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest - name: write the apache config file template: src=/srv/httpd.j2 dest=/etc/httpd.conf notify: - restart apache - name: ensure apache is running service: name=httpd state=started handlers: - name: restart apache service: name=httpd state=restarted

Page 24: Ansible quickstart

まとめ‣ 構成管理ツール「Ansible」について概要を説明しました

‣ Ansibleのインストール方法と実行環境(virtualenv)について紹介しました

‣ Ansibleがターゲットノードに対して操作を実行する仕組みを簡単に解説しました

‣ Ansibleのモジュール群についてカテゴリ別に説明しました

‣ Playbookの役割と構造、実行方法について紹介しました

24

Page 25: Ansible quickstart

参考‣ Ansible

- http://www.ansibleworks.com

- http://www.ansibleworks.com/docs/

- http://www.ansibleworks.com/docs/modules.html

‣ Example

‣ ansible-examples - https://github.com/ansible/ansible-examples

‣ openstack-ansible - https://github.com/yosshy/openstack-ansible

25

Page 26: Ansible quickstart

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

26