Ansible quickstart

3,603 views
3,409 views

Published on

Ansible Quickstart

Published in: Technology
0 Comments
25 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,603
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
67
Comments
0
Likes
25
Embeds 0
No embeds

No notes for slide

Ansible quickstart

  1. 1. Ansible ~ Quick Start ~ Internet Initiative Inc. Hideki Saito (@saito_hideki) 1 ver1.1
  2. 2. 目次 ‣ 自己紹介 ‣ はじめに ‣ Ansibleについて - 使ってみる ‣ インストールする 「仕事」をさせてみる まとめ 2
  3. 3. 自己紹介 ‣ 氏名: 齊藤 秀喜(さいとう ひでき) - ‣ 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
  4. 4. はじめに ‣ Ansibleは物理・仮想・クラウド基盤に対して「人」が行う仕事を 自動化するためのソフトウェアで構成管理ツールと呼ばれるこ ともあります。 ‣ これまで作業手順書や、それをスクリプト言語などでコード化し て実行してきた個々の作業を「仕事」としてまとめて管理できる という特徴があります。 ‣ システムの構成管理をする目的で導入しますが、Ansibleだけ で全てをカバーできるわけではありませんのでご注意を。 ‣ 本セッションでは、Ansibleの仕組みと導入方法の一例、そし て簡単な仕事をさせるまでの流れをご紹介します。 4
  5. 5. Ansibleについて 5
  6. 6. 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
  7. 7. さまざまな仕組みを協調動作させる 世の中には、さまざまなタイプの構成管理ツールがありますが、ここでは 大きく2つに分けてみます。 これまで脈々と培ってきた「手順書」ベースの仕事を自動化する必要があ るのであれば、選択肢は従来型のほうが適しています(現時点では)。 ‣ 作業の自動化を主眼とした構成管理ツール スクリプトなど従来のツールの延長線上にあるもの - Puppet�(ruby…) Chef (ruby…) Capistrano (ruby…) Ansible(python!!!) 今回ご紹介します ‣ クラウド基盤の構成管理を行うためのツール さまざまな出自の異なるクラウド基盤の制御とAPI共通化に注力したもの - Apache libcloud Deltacloud Rightscale SCALR 7
  8. 8. 構成要素(キーワード) ‣ module - サービスの起動停止などansibleに行わせる作業を外部モジュールとして管 理する ‣ playbook - 作業(module)の一連の流れをまとめたもの ‣ plugin - moduleの実行失敗時のcallbackなどansibleそのものの機能を提供する ‣ inventory - 操作対象ノードリスト hostsファイル的なもの 8
  9. 9. Ansibleをインストールする 9
  10. 10. 導入から稼働まで(ubuntu12.04lts編�[1]) 1. 必要となるパッケージ群をダウンロード 12.04のパッケージ版はv1.1と古く、OpenStack用のモジュールが提供され ていないためgithubからソースコード(v1.3.4)を取得してインストールする !  $ sudo apt-get install -y git python-pip python-virtualenv ! 2. virtualenv環境構築してAnsibleをインストール 1. virtualenv環境構築 ansibleをOS標準とは別のモジュールパスにインストールする ! ! ! ! ! $ virtualenv app New python executable in ansible/bin/python Installing distribute....done. Installing pip...done. $ source app/bin/activate (app) $ 2. ansibleが依存するモジュール群をインストール (app) $ pip install PyYAML jinja2 10
  11. 11. 導入から稼働まで(ubuntu12.04lts編�[2]) ! 3. githubからansibleを取得してインストール - v1.3.4をcheckoutする - この例ではモジュールはapp/share/ansible/にインストールされる (app) (app) (app) (app) (app) (app) $ mkdir src && cd src $ git clone https://github.com/ansible/ansible.git $ cd ansible $ git checkout -b v1.3.4 v1.3.4 Switched to a new branch 'v1.3.4’  $ python setup.py build <pythonのvirtualenv環境> modules modules(A) modules(B) python python-virtualenv(A) ~/app/ python-virtualenv(B) ~/hogehoge/ ! OS virtualenvの外側に影響を与えない 11
  12. 12. 導入から稼働まで(ubuntu12.04lts編�[3]) 3. 動作確認 1. インベントリファイルを作成 インベントリには操作対象となるホストのIPアドレスを記載する ※他にも様々な記載方法が可能 ! (app) $ echo “192.168.100.110” > hosts ! 2. pingモジュールで動作確認(successとなることを確認する) (app) $ ansible -i hosts all -u foo -k -m ping SSH password: ******** 192.168.100.110 | success >> { "changed": false, "ping": "pong" } ! -i: インベントリファイル名 -u: 対象ノードにsshログインするユーザ名 -k: 実行時にsshログインパスワードを入力するインタラクションを発生させる -m <モジュール名> 12
  13. 13. restarted 導入から稼働まで(ubuntu12.04lts編�[4]) ! 3. setupモジュールで操作対象サーバの情報を取得してみる 取得した情報は環境変数としてPlaybook内で利用可能 (app) $ ansible -i hosts all -u foo -k -m setup SSH 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
  14. 14. Ansibleを使ってみる 14
  15. 15. モジュール実行の仕組み(リモート) Ansible実行ノードから構成管理対象ノードに対してモジュール からpythonの実行コードを生成してsftpで転送し、ssh経由で 実行する。 15
  16. 16. モジュール実行の仕組み(ローカル経由でリモート) pythonの実行系を持たないスイッチなどのネットワークデバイ スを操作する場合の代表的な動きは以下の通り。実行コードは Ansibleノード上に生成され実行される。 16
  17. 17. Ansibleの外部モジュール 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サービスを操作用モジュール群 17
  18. 18. Ansibleの外部モジュールの使い方 ‣ ansible-docコマンドでモジュールのオプションを確認する [書式] ansible-doc <モジュール名> (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 18
  19. 19. モジュールを使ってみる ‣ serviceモジュールでターゲットホストのhttpdをリスタートしてみる (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" } ! ! ! ! ‣ yumモジュールを使ってlibselinux-pythonパッケージをインストールしてみる (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, prioritiesnLoading mirror speeds from cached hostfilen * base: ftp.jaist.ac.jpn * epel: ftp.kddilabs.jpn * extras: ftp.jaist.ac.jpn * updates: ftp.jaist.ac.jpn183 packages excluded due to repository priority protectionsnSetting up Install ProcessnResolving Dependenciesn--> Running transaction checkn---> Package libselinux-python.x86_64 0:2.0.94-5.3.el6_4.1 will be installedn--> Finished Dependency ResolutionnnDependencies Resolvedn n================================================================================n Package Arch Version Repository Size n================================================================================nInstalling:n libselinux-python x86_64 2.0.94-5.3.el6_4.1 updates 202 knnTransaction Summary n================================================================================nInstall 1 Package(s)nnTotal download size: 202 knInstalled size: 653 knDownloading Packages:nRunning rpm_check_debugnRunning Transaction Test nTransaction Test SucceedednRunning Transactionnr Installing : libselinux-python-2.0.94-5.3.el6_4.1.x86_64 1/1 nr Verifying : libselinux-python-2.0.94-5.3.el6_4.1.x86_64 1/1 nnInstalled:n libselinuxpython.x86_64 0:2.0.94-5.3.el6_4.1 nnComplete!n" ] } 19
  20. 20. AnsibleのPlaybookで仕事をさせてみる(1) apacheやmysqlのインストールを行い、適切に設定してサービスを起動する。など1 つ1つの「作業」をまとめて、「ブログサーバを構築して利用者に提供する」といったよ うに抽象化したものを、ここでは「仕事」と呼ぶことにすると… 小さな仕事・作業 仕事 小道具 nginxを インストール・構築する ブログサーバサービスを 利用者に提供する 小道具 MySQLを インストール・設定する 小道具 PHPをインストールする これがAnsibleのPlaybookで 行える「仕事」 小道具 WordPressを インストール・設定する 20
  21. 21. AnsibleのPlaybookで仕事をさせてみる(2) Playbookのディレクトリ構造 たとえば”wordpress-release”など「仕事」の名前 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/ Playbook内でで利用する環境変数を定義するファイル mysqlの設定・起動などの「小さな仕事」の単位をroles内で定義 実際に行う作業を定義 tasks内の作業結果をトリガーとして実施する必要のある 動作を定義。例えば、tasksでmy.cnfの修正作業を実施 場合に必要となる「mysqldの再起動」などを定義する my.cnfなどの設定ファイルのテンプレートを置く。テンプ レート中に{{ 環境変数 }} のように書くことでjinja2でパラ メータの置き換えが可能 対象サーバにそのまま置けば良いファイルを定義 小さな仕事-C/ site.yml Playbookが含む小さな仕事(roles内の仕事)のリストを定義 21
  22. 22. AnsibleのPlaybookで仕事をさせてみる(3) ブログサーバを構築して提供するPlaybookを実行してみる $ ansible-playbook -u root -k -i hosts site.yml SSH 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 22
  23. 23. ansibleのplaybook例 ‣ httpdをインストールして設定しスタートさせる 記述はYAML形式 --- - 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 23
  24. 24. まとめ ‣ 構成管理ツール「Ansible」について概要を説明しました ‣ Ansibleのインストール方法と実行環境(virtualenv)について 紹介しました ‣ Ansibleがターゲットノードに対して操作を実行する仕組みを 簡単に解説しました ‣ Ansibleのモジュール群についてカテゴリ別に説明しました ‣ Playbookの役割と構造、実行方法について紹介しました 24
  25. 25. 参考 ‣ Ansible - http://www.ansibleworks.com/docs/ - ‣ http://www.ansibleworks.com 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. 26. ご清聴ありがとうございました 26

×