入門Ansible(未発表箇所)

84
入門Ansible @takuan_osho

description

 

Transcript of 入門Ansible(未発表箇所)

Page 1: 入門Ansible(未発表箇所)

入門Ansible@takuan_osho

Page 2: 入門Ansible(未発表箇所)

Agenda๏ 自己紹介

๏ 本セッションについて

• 本セッションの対象者

• 本セッションで話すこと・話さないこと

๏ Ansibleとは何か?

• そもそもどういうものなのか?

• Ansibleを使うと何が嬉しいのか?

• 他の類似ツールとは何が違うのか?

• どんな企業が実際に使っているのか?

๏ Ansibleの基本的な使い方

• 具体例

• コマンドの種類と使い方

• playbook, inventory fileとは?

• ファイル分割の方法・ベストプラクティス

• 便利なコマンドラインオプション

• 実際に使って躓きやすいところ

Page 3: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 4: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 6: 入門Ansible(未発表箇所)

具体例๏ 前述のリポジトリのケースの説明✦ Vagrant、VirtualBoxを利用✦ リモートホストはUbuntu 12.04 LTS

✦ 設定する内容は以下の通り

• build-essentialなど各種パッケージをインストール

• apacheをインストール・起動• MySQLをインストール・起動

Page 8: 入門Ansible(未発表箇所)

ディレクトリ構成├── hosts└── setup.yml

Page 9: 入門Ansible(未発表箇所)

ディレクトリ構成├── hosts└── setup.ymlhosts = inventory filesetup.yml = playbook

Page 10: 入門Ansible(未発表箇所)

ファイルの中身├── hosts└── setup.yml

Page 11: 入門Ansible(未発表箇所)

ファイルの中身├── hosts (inventory file = INI形式)└── setup.yml

Page 12: 入門Ansible(未発表箇所)

hostsの中身

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 13: 入門Ansible(未発表箇所)

ファイルの中身├── hosts└── setup.yml (playbook = YAML形式)

Page 14: 入門Ansible(未発表箇所)

setup.ymlの中身(各種パッケージインストールの箇所)

---- hosts: all user: vagrant sudo: True

tasks: - name: 基本的なパッケージをインストール apt: pkg={{ item }} state=latest update_cache=yes tags: packages with_items: - build-essential (省略) - git

Page 15: 入門Ansible(未発表箇所)

setup.ymlの中身(apacheインストール・起動の箇所)

- name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache

- name: apacheを起動 service: name=apache2 state=started tags: apache

Page 16: 入門Ansible(未発表箇所)

setup.ymlの中身(MySQLインストール・起動の箇所)

- name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

- name: MySQLを起動 service: name=mysql state=started tags: mysql

Page 17: 入門Ansible(未発表箇所)

使用するコマンド

• 以下のコマンドを実行する• ansible-playbook -i hosts setup.yml

Page 18: 入門Ansible(未発表箇所)

結果PLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* changed: [192.168.33.50]

TASK: [apacheを起動] ******************************************************* ok: [192.168.33.50]

TASK: [MySQLのインストール] ********************************************************** changed: [192.168.33.50]

TASK: [MySQLを起動] ******************************************************** ok: [192.168.33.50]

PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=3 unreachable=0 failed=0

Page 19: 入門Ansible(未発表箇所)

もう一度同じコマンドを実行

ansible-playbook -i hosts setup.yml

Page 20: 入門Ansible(未発表箇所)

結果PLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** ok: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* ok: [192.168.33.50]

TASK: [apacheを起動] ******************************************************* ok: [192.168.33.50]

TASK: [MySQLのインストール] ********************************************************** ok: [192.168.33.50]

TASK: [MySQLを起動] ******************************************************** ok: [192.168.33.50]

PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=0 unreachable=0 failed=0

Page 21: 入門Ansible(未発表箇所)

結果(1度目)PLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* changed: [192.168.33.50]

TASK: [apacheを起動] ******************************************************* ok: [192.168.33.50]

TASK: [MySQLのインストール] ********************************************************** changed: [192.168.33.50]

TASK: [MySQLを起動] ******************************************************** ok: [192.168.33.50]

PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=3 unreachable=0 failed=0

Page 22: 入門Ansible(未発表箇所)

結果(2度目)PLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** ok: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* ok: [192.168.33.50]

TASK: [apacheを起動] ******************************************************* ok: [192.168.33.50]

TASK: [MySQLのインストール] ********************************************************** ok: [192.168.33.50]

TASK: [MySQLを起動] ******************************************************** ok: [192.168.33.50]

PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=0 unreachable=0 failed=0

Page 23: 入門Ansible(未発表箇所)

冪等性• 何回やっても結果が同じになること

• 今回の場合

• 1度目

• 各種パッケージ・apache・MySQLが新しくインストールされる(=changed)

• 2度目

• 各種パッケージ・apache・MySQLは既にインストールされているので無視される(=ok)

Page 24: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 25: 入門Ansible(未発表箇所)

コマンドの種類と使い方๏Ansible関連のコマンドは4種類ある1. ansible2. ansible-playbook3. ansible-doc4. ansible-pull

Page 26: 入門Ansible(未発表箇所)

コマンドの種類と使い方๏基本のコマンド - 2つ• ansible• ansible-playbook

๏リファレンス関連のコマンド - 1つ• ansible-doc

๏応用のコマンド - 1つ• ansible-pull

Page 27: 入門Ansible(未発表箇所)

基本のコマンド•どちらも使い方は似たようなもの• ansible 192.168.33.50 -i hosts -m ping

• ansible-playbook (-l local) -i hosts setup.yml

• 黄色 : 実行して欲しい処理を送る先   (=リモートホスト)の指定

• 橙色 : 実行して欲しい処理を送る先のリスト   (= inventory file)の指定

• 水色 : 実行して欲しい処理の中身   (= モジュール, playbook)の指定

Page 28: 入門Ansible(未発表箇所)

基本のコマンド๏ansibleコマンド• モジュール一つの命令だけ実行できる

• Adhocに実行できる๏ansible-playbookコマンド• playbookというYAML形式のファイルに書いてある分だけ複数の命令を実行できる

Page 29: 入門Ansible(未発表箇所)

モジュール?

Page 30: 入門Ansible(未発表箇所)

モジュールとは?๏リモートホストのリソースを制御したり、システムコマンドを実行するもの

๏独自のものを作ることも出来る๏(標準の)モジュールは冪等• リモートホストの状態を変更する必要が無い限り、変更は行わない

Page 31: 入門Ansible(未発表箇所)

モジュールの例(v1.3より一部)

๏ クラウド• cloudformation• digital_ocean• ec2• linode• rds• route53• s3

๏ コマンド• command• raw• script• shell

๏ データベース• mysql_db• postgres_db• redis• riak

๏ ファイル関連• copy• file• lineinfile• template

๏ パッケージング• apt• yum

๏ ソース管理• bzr• git• hg• subversion

๏ システム管理• ping• service• selinux

Page 32: 入門Ansible(未発表箇所)

モジュールの使い方

ansible local -m pingansible local -m command -a "/sbin/reboot -t now"ansible local -m service -a "name=httpd state=running"

Page 33: 入門Ansible(未発表箇所)

モジュールの使い方

ansible local -m pingansible local -m command -a "/sbin/reboot -t now"ansible local -m service -a "name=httpd state=running"

Page 34: 入門Ansible(未発表箇所)

リファレンス関連のコマンド

๏ansible-doc•基本的に公式ドキュメントの‘Ansible Modules’と同一

•オフラインで実行可能

Page 35: 入門Ansible(未発表箇所)

応用のコマンド

๏ansible-pull•基本push型のAnsibleにpull型の機能を持たせたコマンド

Page 36: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 37: 入門Ansible(未発表箇所)

playbook,inventory file

とは?

├── hosts└── setup.ymlhosts = inventory filesetup.yml = playbook

Page 38: 入門Ansible(未発表箇所)

inventory fileとは?๏処理して欲しい命令(module, playbook)を送る先(リモートホスト)のリスト

๏ INI形式で記述๏デフォルトでは/etc/ansible/hostsが利用される

• 無い場合、コマンドオプション等で指定する必要がある

Page 39: 入門Ansible(未発表箇所)

hostsの中身

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 40: 入門Ansible(未発表箇所)

hostsの中身

[production]192.168.33.52 ansible_ssh_user=vagrant ansible_ssh_port=22

[staging]192.168.33.51 ansible_ssh_user=vagrant ansible_ssh_port=22

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 41: 入門Ansible(未発表箇所)

local, stagingだけに処理を送りたい

[production]192.168.33.52 ansible_ssh_user=vagrant ansible_ssh_port=22

[staging]192.168.33.51 ansible_ssh_user=vagrant ansible_ssh_port=22

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 42: 入門Ansible(未発表箇所)

local, stagingだけに処理を送りたい

[production]192.168.33.52 ansible_ssh_user=vagrant ansible_ssh_port=22

[staging]192.168.33.51 ansible_ssh_user=vagrant ansible_ssh_port=22

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 43: 入門Ansible(未発表箇所)

local, stagingだけに処理を送りたい

ansible-playbook -i hosts setup.yml -l local,staging

Page 44: 入門Ansible(未発表箇所)

設定できるパラメータ๏ 事前に定義されている変数

• ansible_ssh_host

• ansible_ssh_port

• ansible_ssh_user

• ansible_ssh_pass

• ansible_connection

• ansible_ssh_private_key_file

• ansible_syslog_facility

• ansible_python_interpreter

• ansible_*_interpreter

Page 45: 入門Ansible(未発表箇所)

playbookとは?๏ 複数の‘play’で構成されている

๏ ‘play’の目的は以下の2つを関連(map)づけること

• ホストのグループ• ‘task’

๏ ‘task’とは「モジュールの呼び出し」

• つまり、実際に行う処理の内容が書かれている๏ YAML形式で記述

Page 46: 入門Ansible(未発表箇所)

playbookとは?---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 47: 入門Ansible(未発表箇所)

ホストとユーザ、sudoからの実行

---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 48: 入門Ansible(未発表箇所)

タスクリスト---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 49: 入門Ansible(未発表箇所)

Name---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 50: 入門Ansible(未発表箇所)

モジュール---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 51: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 52: 入門Ansible(未発表箇所)

ファイル分割の方法・ベストプラクティスについて๏何故ファイルの分割が必要になるか?•playbookの肥大化 → 見通しの悪さ•playbookの再利用・再配布のしやすさのため

•保守しやすい

Page 53: 入門Ansible(未発表箇所)

ファイル分割の方法・ベストプラクティスについて๏ファイル分割の方法は主に以下の種類がある

•includeディレクティブの使用•vars_filesディレクティブの使用•role機能の使用

Page 54: 入門Ansible(未発表箇所)

includeディレクティブ

๏具体例• https://github.com/takuan-osho/pyconapac2013-ansible-session/tree/master/step-01

๏playbook内のtasksの箇所にinclude: foo.ymlと書くとfoo.ymlに書かれた処理が読み込まれる

Page 55: 入門Ansible(未発表箇所)

includeディレクティブ

tasks: - include: packages.yml - include: apache.yml - include: mysql.yml

Page 56: 入門Ansible(未発表箇所)

vars_filesディレクティブ

๏具体例• https://github.com/takuan-osho/pyconapac2013-ansible-session/tree/master/step-02

๏特定の情報を別のファイルに切り出すようにできる

• ソースコード管理下に置きたくない情報(パスワードなど)を切り出すのにも使える

Page 57: 入門Ansible(未発表箇所)

vars_filesディレクティブ

---- hosts: all user: root vars: favcolor: blue vars_files: - /vars/external_vars.yml tasks: - name: this is just a placeholder action: command /bin/echo foo

Page 58: 入門Ansible(未発表箇所)

role機能๏具体例

• https://github.com/takuan-osho/pyconapac2013-ansible-session/tree/master/step-04

๏ includeディレクティブが基になっている

• ディレクトリ構成・ファイルを決められた形にしておくだけで自動的にファイルがincludeされる機能

Page 59: 入門Ansible(未発表箇所)

role機能---- hosts: all user: vagrant sudo: True roles: - foo

Page 60: 入門Ansible(未発表箇所)

role機能└── roles └── foo ├── files │ └── main.yml ├── handlers │ └── main.yml ├── tasks │ └── main.yml ├── templates │ └── main.yml └── vars └── main.yml

全てのmain.ymlが自動でincludeされる

Page 61: 入門Ansible(未発表箇所)

ベストプラクティスについて

๏公式ドキュメントの‘Best Practices’に詳細あり

•role機能を使ってplaybookを切り分けることが基本

•汎用性を重視しすぎないことがコツ

Page 62: 入門Ansible(未発表箇所)

ベストプラクティスについて

• 参考になるplaybookの例• https://github.com/ansible/ansible-examples

• https://github.com/edx/configuration• https://github.com/yteraoka/ansible-tutorial/tree/playbook

• Ansible AWXのplaybook

Page 63: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 64: 入門Ansible(未発表箇所)

便利なコマンドラインオプション๏ansible-playbookの場合• -t TAGS, --tags=TAGS• --skip-tags (New in version1.3)• -l SUBSET, --limit=SUBSET• -v, --verbose(-vvv for more)• -C, --check• -D, --diff

Page 65: 入門Ansible(未発表箇所)

-t TAGS,--tags=TAGS

๏ ansible-playbook -i hosts setup.yml -t apache

• playbook内で‘tags: apache’と記載された箇所のみ実行する

• 逆に‘tags: apache’の所だけ実行「しない」ようにするのが --skip-tagsオプション(v1.3から使用可)

Page 66: 入門Ansible(未発表箇所)

-t TAGS,--tags=TAGS

---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 67: 入門Ansible(未発表箇所)

-t TAGS,--tags=TAGS

---- hosts: all user: vagrant sudo: True  tasks: - name: apacheのインストール apt: pkg=apache2 state=latest update_cache=yes tags: apache  - name: MySQLのインストール apt: pkg=mysql-server-5.5 state=present update_cache=yes tags: mysql

Page 68: 入門Ansible(未発表箇所)

limit(-l SUBSET, --limit SUBSET)

• ansible-playbook -i hosts setup.yml-l local,staging

• inventory fileの中でlocal, stagingのグループだけに処理を実行させるようにする

Page 69: 入門Ansible(未発表箇所)

limit(-l SUBSET, --limit SUBSET)

[production]192.168.33.52 ansible_ssh_user=vagrant ansible_ssh_port=22

[staging]192.168.33.51 ansible_ssh_user=vagrant ansible_ssh_port=22

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 70: 入門Ansible(未発表箇所)

limit(-l SUBSET, --limit SUBSET)

[production]192.168.33.52 ansible_ssh_user=vagrant ansible_ssh_port=22

[staging]192.168.33.51 ansible_ssh_user=vagrant ansible_ssh_port=22

[local]192.168.33.50 ansible_ssh_user=vagrant ansible_ssh_port=22

Page 71: 入門Ansible(未発表箇所)

-v, --verbose(-vvv for more)

๏ verbose mode

• リモートホストの状態の変化やエラーメッセージなどを詳細に出力する

• -vvvのオプションを付けて実行するとより詳細な出力を得られる

Page 72: 入門Ansible(未発表箇所)

オプション無しの場合PLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* changed: [192.168.33.50]

TASK: [apacheを起動] ******************************************************* ok: [192.168.33.50]

TASK: [MySQLのインストール] ********************************************************** changed: [192.168.33.50]

TASK: [MySQLを起動] ******************************************************** ok: [192.168.33.50]

PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=3 unreachable=0 failed=0

Page 73: 入門Ansible(未発表箇所)

-v, --verboseの場合PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** ok: [192.168.33.50] TASK: [基本的なパッケージをインストール] ****************************************************** changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git) => {"changed": true, "item": "build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git"} TASK: [apacheのインストール] ********************************************************* changed: [192.168.33.50] => {"changed": true} TASK: [apacheを起動] ************************************************************* ok: [192.168.33.50] => {"changed": false, "name": "apache2", "state": "started"} TASK: [MySQLのインストール] ********************************************************** changed: [192.168.33.50] => {"changed": true} TASK: [MySQLを起動] ************************************************************** ok: [192.168.33.50] => {"changed": false, "name": "mysql", "state": "started"} PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=3 unreachable=0 failed=0

Page 74: 入門Ansible(未発表箇所)

-vvvの場合PLAY [all] ******************************************************************** (省略)TASK: [基本的なパッケージをインストール] ****************************************************** <192.168.33.50> ESTABLISH CONNECTION FOR USER: vagrant<192.168.33.50> EXEC ['ssh', '-tt', '-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/Users/taku/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', '192.168.33.50', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-1378945838.83-150453254074721 && chmod a+rx $HOME/.ansible/tmp/ansible-1378945838.83-150453254074721 && echo $HOME/.ansible/tmp/ansible-1378945838.83-150453254074721'"]<192.168.33.50> REMOTE_MODULE apt pkg=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git state=latest update_cache=yes<192.168.33.50> PUT /var/folders/zc/pv2v17_92v974vs5443sbgs00000gn/T/tmpq31N8W TO /home/vagrant/.ansible/tmp/ansible-1378945838.83-150453254074721/apt<192.168.33.50> EXEC ['ssh', '-tt', '-q', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=60s', '-o', 'ControlPath=/Users/taku/.ansible/cp/ansible-ssh-%h-%p-%r', '-o', 'Port=22', '-o', 'KbdInteractiveAuthentication=no', '-o', 'PasswordAuthentication=no', '-o', 'User=vagrant', '-o', 'ConnectTimeout=10', '192.168.33.50', '/bin/sh -c \'sudo -k && sudo -H -S -p "[sudo via ansible, key=ibflcvkpbpjbebfjuefckjhxeydiialv] password: " -u root /bin/sh -c \'"\'"\'/usr/bin/python /home/vagrant/.ansible/tmp/ansible-1378945838.83-150453254074721/apt; rm -rf /home/vagrant/.ansible/tmp/ansible-1378945838.83-150453254074721/ >/dev/null 2>&1\'"\'"\'\'']changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git) => {"changed": true, "item": "build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git"}(省略)PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=3 unreachable=0 failed=0

Page 75: 入門Ansible(未発表箇所)

-C, --check๏ Check Mode (‘Dry Run’)

• リモートホストの状態を変化させずに「実行するとどういう状態変化が起きるか」ということをチェックだけできる機能

• always_runディレクティブを使うと常にCheck Modeで実行する

• New in version 1.3• http://www.ansibleworks.com/docs/playbooks2.html#id31

Page 76: 入門Ansible(未発表箇所)

-C, --checkPLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* changed: [192.168.33.50]

TASK: [apacheを起動] ************************************************************* failed: [192.168.33.50] => {"failed": true}msg: cannot find 'service' binary or init script for service, possible typo in service name?, aborting

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** to retry, use: --limit @/Users/taku/setup.retry

192.168.33.50 : ok=3 changed=2 unreachable=0 failed=1

Page 77: 入門Ansible(未発表箇所)

コマンドの失敗を無視する方法

๏ ignore_errorsディレクティブを使用する

๏詳しくは公式ドキュメント‘Advanced Playbooks’内の ‘Ignoring Failed Commands’を参照

• http://www.ansibleworks.com/docs/playbooks2.html#id4

Page 78: 入門Ansible(未発表箇所)

-C, --checkPLAY [all] ********************************************************************

GATHERING FACTS *************************************************************** ok: [192.168.33.50]

TASK: [基本的なパッケージをインストール] ****************************************************** changed: [192.168.33.50] => (item=build-essential,libsqlite3-dev,libreadline6-dev,libgdbm-dev,zlib1g-dev,libbz2-dev,sqlite3,tk-dev,zip,git)

TASK: [apacheのインストール] ********************************************************* changed: [192.168.33.50]

TASK: [apacheを起動] ************************************************************* failed: [192.168.33.50] => {"failed": true}msg: cannot find 'service' binary or init script for service, possible typo in service name?, aborting...ignoring

TASK: [MySQLのインストール] ********************************************************** changed: [192.168.33.50]

TASK: [MySQLを起動] ************************************************************** failed: [192.168.33.50] => {"failed": true}msg: cannot find 'service' binary or init script for service, possible typo in service name?, aborting...ignoring

PLAY RECAP ******************************************************************** 192.168.33.50 : ok=6 changed=3 unreachable=0 failed=0

Page 79: 入門Ansible(未発表箇所)

-D, --diff

๏リモートホストのテンプレート出力ファイルを変更したとき、その変更内容を出力する

• --checkと併用すると強力

Page 80: 入門Ansible(未発表箇所)

-D, --diffTASK: [Set up sshd_config] **************************************************** --- before+++ after@@ -1,15 +1,15 @@ # Package generated configuration file # See the sshd_config(5) manpage for details # What ports, IPs and protocols we listen for-Port 22+Port 60223(省略) # Authentication: LoginGraceTime 120-PermitRootLogin yes+PermitRootLogin no StrictModes yes(省略) # Change to no to disable tunnelled clear text passwords-#PasswordAuthentication yes+PasswordAuthentication no

changed: [192.168.33.11]

PLAY RECAP ******************************************************************** 192.168.33.11 : ok=3 changed=2 unreachable=0 failed=0

Page 81: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 82: 入門Ansible(未発表箇所)

実際に使って躓きやすいところ

•エラーが出てそもそもAnsibleが動かない

•途中で実行が止まる•エラーの原因がよく分からない

Page 83: 入門Ansible(未発表箇所)

Ansibleの基本的な使い方

•具体例•コマンドの種類と使い方• playbook, inventory fileとは?•ファイル分割の方法・ベストプラクティス•便利なコマンドラインオプション•実際に使って躓きやすいところ

Page 84: 入門Ansible(未発表箇所)

Agenda๏ 自己紹介

๏ 本セッションについて

• 本セッションの対象者

• 本セッションで話すこと・話さないこと

๏ Ansibleとは何か?

• そもそもどういうものなのか?

• Ansibleを使うと何が嬉しいのか?

• 他の類似ツールとは何が違うのか?

• どんな企業が実際に使っているのか?

๏ Ansibleの基本的な使い方

• 具体例

• コマンドの種類と使い方

• playbook, inventory fileとは?

• ファイル分割の方法・ベストプラクティス

• 便利なコマンドラインオプション

• 実際に使って躓きやすいところ