Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Ansible入門
!
the simplest way to automate IT
の前に
Infrastructure as Code
Infrastructure as Code
• 手順書ベースに構築・管理をしてきたインフラ
• これをコードで管理しようという流れ
• もちろん自動化する → Ansible !!
• 手順がすべてコードに
• インフラもコードレビュー
• ...
Immutable Infrastructure
Immutable Infrastructure
• 不変な、状態を持たない、廃棄可能な
• クラウドなこの時代の流れ
• ベキトウセイとはいえ状態を管理するのは大変

→ならしなければいいじゃん

 →つくったらさわらない
• つくって、切り...
Immutable Infrastructure
• ステートレス/ステートフル
• DBといったものは難しい
• アプリケーション設計時点で考えを盛り込んどか
んとあかん
• まずステートレスなモノを対象に
本題
Ansibleってなに?
• 構成管理系ツール
• ChefとかPuppetとかと同じ感じのもの
• Pythonさんでつくられている
• つかっているところ
構成管理系=>IT自動化
• Configuration Management

もちろん構成管理としても
• Application Deployment

デプロイ自動化もこの子でできる
• Continuous Delivery (with...
他構成管理ツールとの違い
• yamlで記述するのでわかりやすい
• 対象サーバにクライアントを入れる必要がない

python2.4 + sshさえつながればOK
• ファイル構成が簡単
インストール
$ sudo yum install ansible
!
他OSはこちら

http://docs.ansible.com/intro_installation.html#installing-the-control-machine
必要なもの 環境
• ホスト
• Python 2.6以上
• クライアント
• Python 2.4以上
• Python 2.4の場合はpython-simplejsonも
必要もの ファイル
• Inventory
• 対象となるホストを書く
• playbook
• 何するのかを書く
Inventory
mail.example.com
!
[webservers] #グルーピング
foo.example.com #ホストを書く
bar.example.com
!
[dbservers]
one.example.com
tw...
playbook
- hosts: webservers #[webservers]グループを対象にする
vars: #playbookでの変数も設定可能
http_port: 80
max_clients: 200
remote_user: ...
dry run
$ ansible-playbook -i ${INVENTORY_FILE} {PLAYBOOK} --check
実行
$ ansible-playbook -i ${INVENTORY_FILE} {PLAYBOOK}
結果(中身違うごめん)
PLAY [zabbix_server] **********************************************************
GATHERING FACTS **************...
それぞれについてもう
ちょっと詳しく
Inventory
• Inventory range
• group
• host variables
• group variables
Inventory rage
[webservers]
www[01:50].example.com #範囲指定もできる
!
!
[databases]
db-[a:f].example.com #こんな範囲指定もできる
group
[atlanta]
host1
host2
!
[raleigh]
host2
host3
!
[southeast:children] #グルーピング
atlanta
raleigh
!
[usa:children] #グループを...
Host Variables
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
!
#ホストごとの変...
Group Variables
[atlanta]
host1
host2
!
[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com
...
playbook
• include
• roles
• conditions
• loop
• tags
• prompts
• error handling
include
tasks:
!
- include: tasks/foo.yml
- include: tasks/bar.yml
!
#playbookがでかくなりすぎないように
roles
- hosts: webservers
roles:
- common
- webservers
!
#グループにロールを割り当てるイメージ?
#次資料の構成にすると勝手に自分のロールのディレクトリ配下を見てくれる?
roles
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files...
conditionals
tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -t now
when: ansible_os_family == De...
loop
- name: add user testuser1
user: name=testuser1 state=present groups=wheel
- name: add user testuser2
user: name=test...
loop
users:
alice:
name: Alice Appleworth
telephone: 123-456-7890
bob:
name: Bob Bananarama
telephone: 987-654-3210
!
task...
tags
tasks:
!
- yum: name={{ item }} state=installed
with_items:
- httpd
- memcached
tags:
- packages
!
- template: src=te...
prompts
vars_prompt: #ユーザに入力させた値を使う
- name: "release_version"
prompt: "Product release version"
default: 1.0" #デフォルト値の設定
̶...
error handling
- name: this command prints FAILED when it fails
command: /usr/bin/example-command -x -y -z
register: comma...
taskに記述する
Module
Modules
http://docs.ansible.com/modules_by_category.html
• All Modules
• Cloud Modules
• Commands Modules
• Database Modul...
たくさんある。
使いそうなものを
ピックアップ
module yum
- name: install the latest version of Apache #最新版をいれろー
yum: name=httpd state=latest
!
- name: remove the Apache...
module service
# Example action to start service httpd, if not running #起動
- service: name=httpd state=started
!
# Example...
module command
# Example from Ansible Playbooks.
- command: /sbin/shutdown -t now
!
# Run the command if the specified file ...
module shell
# Execute the command in remote shell; stdout goes to the specified
# file on the remote.
- shell: somescript.s...
module mysql_db
# Create a new database with name 'bobdata'
- mysql_db: name=bobdata state=present
!
# Copy database dump ...
module mysql_user
# Create database user with name 'bob' and password '12345' with all database
privileges
- mysql_user: n...
module mysql_replication
# Stop mysql slave thread
- mysql_replication: mode=stopslave
!
# Get master binlog file name and ...
module copy
# Example from Ansible Playbooks
- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo
group=foo mode=...
module fetch
# Store file into /tmp/fetched/host.example.com/tmp/somefile
- fetch: src=/tmp/somefile dest=/tmp/fetched
!
# Sp...
module file
- file: path=/etc/foo.conf owner=foo group=foo mode=0644
- file: src=/file/to/link/to dest=/path/to/symlink owner=...
module replace
- replace: dest=/etc/hosts regexp='(s+)old.host.name(s+.*)?$'
replace='1new.host.name2' backup=yes
!
- repl...
module template
# Example from Ansible Playbooks
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin
group=wh...
module irc
- irc: server=irc.example.net channel="#t1" msg="Hello world"
!
- local_action: irc port=6669
channel="#t1"
msg...
こんなかんじ
個人的に
Chef/Pupeet
より使いやすそう
公式マニュアルも
わかりやすい
こっちを
使ってみませんか?
インフラもCI
serverspec/Infrataster
おまけ
!
公式にディレクトリ構成の
ベストプラクティスもあがってます
とりあえずみとけ。
• 公式サイト

http://www.ansible.com/home
• 第1回Ansible勉強会

http://ansible-users.connpass.com/event/5968/presentation/...
Ansible入門
Upcoming SlideShare
Loading in …5
×

Ansible入門

社内勉強会向けの資料です。

  • Login to see the comments

Ansible入門

  1. 1. Ansible入門 ! the simplest way to automate IT
  2. 2. の前に
  3. 3. Infrastructure as Code
  4. 4. Infrastructure as Code • 手順書ベースに構築・管理をしてきたインフラ • これをコードで管理しようという流れ • もちろん自動化する → Ansible !! • 手順がすべてコードに • インフラもコードレビュー • DevOps • バージョン管理
  5. 5. Immutable Infrastructure
  6. 6. Immutable Infrastructure • 不変な、状態を持たない、廃棄可能な • クラウドなこの時代の流れ • ベキトウセイとはいえ状態を管理するのは大変
 →ならしなければいいじゃん
  →つくったらさわらない • つくって、切り替えて、廃棄
 ブルーグリーンデプロイメント
  7. 7. Immutable Infrastructure • ステートレス/ステートフル • DBといったものは難しい • アプリケーション設計時点で考えを盛り込んどか んとあかん • まずステートレスなモノを対象に
  8. 8. 本題
  9. 9. Ansibleってなに? • 構成管理系ツール • ChefとかPuppetとかと同じ感じのもの • Pythonさんでつくられている • つかっているところ
  10. 10. 構成管理系=>IT自動化 • Configuration Management
 もちろん構成管理としても • Application Deployment
 デプロイ自動化もこの子でできる • Continuous Delivery (with Jenkins, etc.)
 継続的デリバリーにも • Cloud & Amazon (AWS, EC2) Automation
 クラウドにも
  11. 11. 他構成管理ツールとの違い • yamlで記述するのでわかりやすい • 対象サーバにクライアントを入れる必要がない
 python2.4 + sshさえつながればOK • ファイル構成が簡単
  12. 12. インストール $ sudo yum install ansible ! 他OSはこちら
 http://docs.ansible.com/intro_installation.html#installing-the-control-machine
  13. 13. 必要なもの 環境 • ホスト • Python 2.6以上 • クライアント • Python 2.4以上 • Python 2.4の場合はpython-simplejsonも
  14. 14. 必要もの ファイル • Inventory • 対象となるホストを書く • playbook • 何するのかを書く
  15. 15. Inventory mail.example.com ! [webservers] #グルーピング foo.example.com #ホストを書く bar.example.com ! [dbservers] one.example.com two.example.com three.example.com
  16. 16. playbook - hosts: webservers #[webservers]グループを対象にする vars: #playbookでの変数も設定可能 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 #notifyの実行コマンド service: name=httpd state=restarted
  17. 17. dry run $ ansible-playbook -i ${INVENTORY_FILE} {PLAYBOOK} --check
  18. 18. 実行 $ ansible-playbook -i ${INVENTORY_FILE} {PLAYBOOK}
  19. 19. 結果(中身違うごめん) PLAY [zabbix_server] ********************************************************** GATHERING FACTS *************************************************************** ok: [192.168.34.10] TASK: [be sure mysql-server is installed] ************************************* ok: [192.168.34.10] TASK: [be sure zabbix is installed] ******************************************* ok: [192.168.34.10] TASK: [be sure zabbix-server is installed] ************************************ ok: [192.168.34.10] : PLAY RECAP ******************************************************************** 192.168.34.10 : ok=14 changed=0 unreachable=0 failed=0 #okは既に設定されているからやらなかった、changedは変更したってこと(ベキトウセイ)
  20. 20. それぞれについてもう ちょっと詳しく
  21. 21. Inventory • Inventory range • group • host variables • group variables
  22. 22. Inventory rage [webservers] www[01:50].example.com #範囲指定もできる ! ! [databases] db-[a:f].example.com #こんな範囲指定もできる
  23. 23. group [atlanta] host1 host2 ! [raleigh] host2 host3 ! [southeast:children] #グルーピング atlanta raleigh ! [usa:children] #グループをさらにグループ southeast northeast southwest northwest
  24. 24. Host Variables [atlanta] host1 http_port=80 maxRequestsPerChild=808 host2 http_port=303 maxRequestsPerChild=909 ! #ホストごとの変数を設定できる #playbookで使用できる
  25. 25. Group Variables [atlanta] host1 host2 ! [atlanta:vars] ntp_server=ntp.atlanta.example.com proxy=proxy.atlanta.example.com ! #グループごとの変数も設定できる
  26. 26. playbook • include • roles • conditions • loop • tags • prompts • error handling
  27. 27. include tasks: ! - include: tasks/foo.yml - include: tasks/bar.yml ! #playbookがでかくなりすぎないように
  28. 28. roles - hosts: webservers roles: - common - webservers ! #グループにロールを割り当てるイメージ? #次資料の構成にすると勝手に自分のロールのディレクトリ配下を見てくれる?
  29. 29. roles site.yml webservers.yml fooservers.yml roles/ common/ files/ templates/ tasks/ handlers/ vars/ meta/ webservers/ files/ templates/ tasks/ handlers/ vars/ meta/
  30. 30. conditionals tasks: - name: "shutdown Debian flavored systems" command: /sbin/shutdown -t now when: ansible_os_family == Debian ! # OSがDebian familyの場合のみ実行する
  31. 31. loop - name: add user testuser1 user: name=testuser1 state=present groups=wheel - name: add user testuser2 user: name=testuser2 state=present groups=root ! #上を下に書き換えられる ! - name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel' } - { name: 'testuser2', groups: 'root' }
  32. 32. loop users: alice: name: Alice Appleworth telephone: 123-456-7890 bob: name: Bob Bananarama telephone: 987-654-3210 ! tasks: - name: Print phone records debug: msg="User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})" with_dict: users ! #Hashもつかえます
  33. 33. tags tasks: ! - yum: name={{ item }} state=installed with_items: - httpd - memcached tags: - packages ! - template: src=templates/src.j2 dest=/etc/foo.conf tags: - configuration ! # ansible-playbook -t ${tag} で指定したtagのtaskだけを実行する # ansible-playbook --tags configuration,packages" で複数指定もできる
  34. 34. prompts vars_prompt: #ユーザに入力させた値を使う - name: "release_version" prompt: "Product release version" default: 1.0" #デフォルト値の設定 ̶ vars_prompt: - name: "some_password" prompt: "Enter password" private: yes #パスワードをログに残さない ! - name: "release_version" prompt: "Product release version" private: no
  35. 35. error handling - name: this command prints FAILED when it fails command: /usr/bin/example-command -x -y -z register: command_result failed_when: "'FAILED' in command_result.stderr ! #切り戻しに使えそうです
  36. 36. taskに記述する Module
  37. 37. Modules http://docs.ansible.com/modules_by_category.html • All Modules • Cloud Modules • Commands Modules • Database Modules • Files Modules • Internal Modules • Inventory Modules • Messaging Modules • Monitoring Modules • Net Infrastructure Modules • Network Modules • Notification Modules • Packaging Modules • Source Control Modules • System Modules • Utilities Modules • Web Infrastructure Modules • Windows Modules
  38. 38. たくさんある。 使いそうなものを ピックアップ
  39. 39. module yum - name: install the latest version of Apache #最新版をいれろー yum: name=httpd state=latest ! - name: remove the Apache package #けせー yum: name=httpd state=absent ! - name: install the latest version of Apache from the testing repo #testingリポジトリからいれろー? yum: name=httpd enablerepo=testing state=present ! - name: upgrade all packages #全アップデート yum: name=* state=latest ! - name: install the nginx rpm from a remote repo #nginxのリポジトリ追加 yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release- centos-6-0.el6.ngx.noarch.rpm state=present ! - name: install nginx rpm from a local file #ローカルファイルからのインストール yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
  40. 40. module service # Example action to start service httpd, if not running #起動 - service: name=httpd state=started ! # Example action to stop service httpd, if running #停止 - service: name=httpd state=stopped ! # Example action to restart service httpd, in all cases #再起動 - service: name=httpd state=restarted ! # Example action to reload service httpd, in all cases #再読み込み - service: name=httpd state=reloaded ! # Example action to enable service httpd, and not touch the running state #サービス有効 - service: name=httpd enabled=yes ! # Example action to start service foo, based on running process /usr/bin/foo #statusコマンドがないやつ - service: name=foo pattern=/usr/bin/foo state=started #はプロセスを見て確認 ! # Example action to restart network service for interface eth0 #ネトワ再起動 - service: name=network state=restarted args=eth0
  41. 41. module command # Example from Ansible Playbooks. - command: /sbin/shutdown -t now ! # Run the command if the specified file does not exist. - command: /usr/bin/make_database.sh arg1 arg2 creates=/path/to/database ! # You can also use the 'args' form to provide the options. This command # will change the working directory to somedir/ and will only run when # /path/to/database doesn't exist. - command: /usr/bin/make_database.sh arg1 arg2 args: chdir: somedir/ creates: /path/to/database ! # so variables like $HOME and operations like "<", ">", "¦", and "&" will not work #(use the shell module if you need these features).
  42. 42. module shell # Execute the command in remote shell; stdout goes to the specified # file on the remote. - shell: somescript.sh >> somelog.txt ! # Change the working directory to somedir/ before executing the command. - shell: somescript.sh >> somelog.txt chdir=somedir/ ! # You can also use the 'args' form to provide the options. This command # will change the working directory to somedir/ and will only run when # somedir/somelog.txt doesn't exist. - shell: somescript.sh >> somelog.txt args: chdir: somedir/ creates: somelog.txt ! #command through a shell (/bin/sh) on the remote node
  43. 43. module mysql_db # Create a new database with name 'bobdata' - mysql_db: name=bobdata state=present ! # Copy database dump file to remote host and restore it to database 'my_db' - copy: src=dump.sql.bz2 dest=/tmp - mysql_db: name=my_db state=import target=/tmp/dump.sql.bz2
  44. 44. module mysql_user # Create database user with name 'bob' and password '12345' with all database privileges - mysql_user: name=bob password=12345 priv=*.*:ALL state=present ! # Creates database user 'bob' and password '12345' with all database privileges and 'WITH GRANT OPTION' - mysql_user: name=bob password=12345 priv=*.*:ALL,GRANT state=present ! # Ensure no user named 'sally' exists, also passing in the auth credentials. - mysql_user: login_user=root login_password=123456 name=sally state=absent ! # Specify grants composed of more than one word - mysql_user: name=replication password=12345 priv=*.*:"REPLICATION CLIENT" state=present
  45. 45. module mysql_replication # Stop mysql slave thread - mysql_replication: mode=stopslave ! # Get master binlog file name and binlog position - mysql_replication: mode=getmaster ! # Change master to master server 192.168.1.1 and use binary log 'mysql-bin.000009' with position 4578 - mysql_replication: mode=changemaster master_host=192.168.1.1 master_log_file=mysql-bin.000009 master_log_pos=4578
  46. 46. module copy # Example from Ansible Playbooks - copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644 ! # Copy a new "ntp.conf file into place, backing up the original if it differs from the copied version - copy: src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes ! # Copy a new "sudoers" file into place, after passing validation with visudo - copy: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
  47. 47. module fetch # Store file into /tmp/fetched/host.example.com/tmp/somefile - fetch: src=/tmp/somefile dest=/tmp/fetched ! # Specifying a path directly - fetch: src=/tmp/somefile dest=/tmp/prefix-{{ ansible_hostname }} flat=yes ! # Specifying a destination path - fetch: src=/tmp/uniquefile dest=/tmp/special/ flat=yes ! # Storing in a path relative to the playbook - fetch: src=/tmp/uniquefile dest=special/prefix-{{ ansible_hostname }} flat=yes
  48. 48. module file - 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 - file: src=/tmp/{{ item.path }} dest={{ item.dest }} state=link with_items: - { path: 'x', dest: 'y' } - { path: 'z', dest: 'k' }
  49. 49. module replace - replace: dest=/etc/hosts regexp='(s+)old.host.name(s+.*)?$' replace='1new.host.name2' backup=yes ! - replace: dest=/home/jdoe/.ssh/known_hosts regexp='^old.host .name[^n]*n' owner=jdoe group=jdoe mode=644 ! - replace: dest=/etc/apache/ports regexp='^(NameVirtualHost¦Listen)s +80s*$' replace='1 127.0.0.1:8080' validate='/usr/sbin/apache2ctl -f %s -t'
  50. 50. module template # Example from Ansible Playbooks - template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644 ! # Copy a new "sudoers" file into place, after passing validation with visudo - template: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s ! #Templates are processed by the Jinja2 templating language
  51. 51. module irc - irc: server=irc.example.net channel="#t1" msg="Hello world" ! - local_action: irc port=6669 channel="#t1" msg="All finished at {{ ansible_date_time.iso8601 }}" color=red nick=ansibleIRC
  52. 52. こんなかんじ
  53. 53. 個人的に Chef/Pupeet より使いやすそう
  54. 54. 公式マニュアルも わかりやすい
  55. 55. こっちを 使ってみませんか?
  56. 56. インフラもCI serverspec/Infrataster
  57. 57. おまけ ! 公式にディレクトリ構成の ベストプラクティスもあがってます
  58. 58. とりあえずみとけ。 • 公式サイト
 http://www.ansible.com/home • 第1回Ansible勉強会
 http://ansible-users.connpass.com/event/5968/presentation/ • AnsibleTutorial
 http://yteraoka.github.io/ansible-tutorial/ • ansibleを使ってみる
 http://tdoc.info/blog/2013/04/20/ansible.html • Ansibleでもっとも重要な設定
 http://tdoc.info/blog/2013/12/14/ansible_most_important_thing.html

×