ansible quickstart
Post on 27-May-2015
2.846 Views
Preview:
DESCRIPTION
TRANSCRIPT
Ansible ~ Quick Start ~
Internet Initiative Inc. Hideki Saito (@saito_hideki)
1 ver1.1
目次‣ 自己紹介
‣ はじめに
‣ Ansibleについて
- インストールする
- 使ってみる
- 「仕事」をさせてみる
‣ まとめ
2
自己紹介‣ 氏名: 齊藤 秀喜(さいとう ひでき)
- 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
はじめに‣ Ansibleは物理・仮想・クラウド基盤に対して「人」が行う仕事を
自動化するためのソフトウェアで構成管理ツールと呼ばれることもあります。
‣ これまで作業手順書や、それをスクリプト言語などでコード化して実行してきた個々の作業を「仕事」としてまとめて管理できるという特徴があります。
‣ システムの構成管理をする目的で導入しますが、Ansibleだけで全てをカバーできるわけではありませんのでご注意を。
‣ 本セッションでは、Ansibleの仕組みと導入方法の一例、そして簡単な仕事をさせるまでの流れをご紹介します。
4
Ansibleについて
5
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
さまざまな仕組みを協調動作させる
世の中には、さまざまなタイプの構成管理ツールがありますが、ここでは大きく2つに分けてみます。
これまで脈々と培ってきた「手順書」ベースの仕事を自動化する必要があるのであれば、選択肢は従来型のほうが適しています(現時点では)。
‣ 作業の自動化を主眼とした構成管理ツール スクリプトなど従来のツールの延長線上にあるもの
- Puppet�(ruby…)
- Chef (ruby…)
- Capistrano (ruby…)
- Ansible(python!!!) 今回ご紹介します
‣ クラウド基盤の構成管理を行うためのツール さまざまな出自の異なるクラウド基盤の制御とAPI共通化に注力したもの
- Apache libcloud
- Deltacloud
- Rightscale
- SCALR
7
構成要素(キーワード)
‣ module - サービスの起動停止などansibleに行わせる作業を外部モジュールとして管
理する
‣ playbook - 作業(module)の一連の流れをまとめたもの
‣ plugin - moduleの実行失敗時のcallbackなどansibleそのものの機能を提供する
‣ inventory - 操作対象ノードリスト
hostsファイル的なもの
8
Ansibleをインストールする
9
導入から稼働まで(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
導入から稼働まで(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
導入から稼働まで(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
導入から稼働まで(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
Ansibleを使ってみる
14
Ansible実行ノードから構成管理対象ノードに対してモジュールからpythonの実行コードを生成してsftpで転送し、ssh経由で実行する。
モジュール実行の仕組み(リモート)
15
16
pythonの実行系を持たないスイッチなどのネットワークデバイスを操作する場合の代表的な動きは以下の通り。実行コードはAnsibleノード上に生成され実行される。
モジュール実行の仕組み(ローカル経由でリモート)
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サービスを操作用モジュール群
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
モジュールを使ってみる
‣ 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" ]}
apacheやmysqlのインストールを行い、適切に設定してサービスを起動する。など1つ1つの「作業」をまとめて、「ブログサーバを構築して利用者に提供する」といったように抽象化したものを、ここでは「仕事」と呼ぶことにすると…
AnsibleのPlaybookで仕事をさせてみる(1)
ブログサーバサービスを 利用者に提供する
nginxを インストール・構築する
MySQLを インストール・設定する
PHPをインストールする
WordPressを インストール・設定する
仕事小道具
小道具
小道具
小道具
小さな仕事・作業
これがAnsibleのPlaybookで 行える「仕事」
20
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
対象サーバにそのまま置けば良いファイルを定義
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
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
まとめ‣ 構成管理ツール「Ansible」について概要を説明しました
‣ Ansibleのインストール方法と実行環境(virtualenv)について紹介しました
‣ Ansibleがターゲットノードに対して操作を実行する仕組みを簡単に解説しました
‣ Ansibleのモジュール群についてカテゴリ別に説明しました
‣ Playbookの役割と構造、実行方法について紹介しました
24
参考‣ 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
ご清聴ありがとうございました
26
top related