Ansible Tower Administration Guide Release Ansible Tower 2.4.3 ...
ChefからAnsibleへ引っ越したい人のためのAnsible入門
-
Upload
iwashi86 -
Category
Technology
-
view
1.144 -
download
1
Transcript of ChefからAnsibleへ引っ越したい人のためのAnsible入門
Chef から Ansible へ引っ越したい
人のための Ansible 入門
July Tech Festa 2015/7/26@iwashi86 / Yoshimasa Iwase
1https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU-5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
6
2014 年前半の裏側
https://www.flickr.com/photos/torkildr/3462607995/in/photolist-6gYLHR-4H1hyC-2Wrvx-65cUp7-5RvGZs-6NAXg-n6mHgT-6iUZPe-Je5v9-9v7Kgx-5fipyz-iygJ-cKbUb-ac3oaX-NhE1s-bjtT-2XQgfL-JebAB-82PXBP-6gYLjx-2kAaZ-cfXKY1-mZJBc2-8XH6Na-4YVJXw-7YNxq-bf2wtK-exjsm-cEeN1-6h3W3W-4PGC7o-3M87z-5nSsLu-cqqwcb-8NwzC-eWnwZ-akqkB-8cd3Np-icgBtX-tCk6d-2JXe1q-dX67NU-7MriLM-a6kpxQ-mMwb-5fnQef-DqpnY-8b8puq-9cggqL-YD7Db
7
ある理由で移行
https://www.flickr.com/photos/torkildr/3462607995/in/photolist-6gYLHR-4H1hyC-2Wrvx-65cUp7-5RvGZs-6NAXg-n6mHgT-6iUZPe-Je5v9-9v7Kgx-5fipyz-iygJ-cKbUb-ac3oaX-NhE1s-bjtT-2XQgfL-JebAB-82PXBP-6gYLjx-2kAaZ-cfXKY1-mZJBc2-8XH6Na-4YVJXw-7YNxq-bf2wtK-exjsm-cEeN1-6h3W3W-4PGC7o-3M87z-5nSsLu-cqqwcb-8NwzC-eWnwZ-akqkB-8cd3Np-icgBtX-tCk6d-2JXe1q-dX67NU-7MriLM-a6kpxQ-mMwb-5fnQef-DqpnY-8b8puq-9cggqL-YD7Db
14https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5gCQp-nRdqb-7ESvZP-5eMSN-4izRk-gdCx68-7H5QhG-hm25eq-gdCArW-gdCvG6-99Q3YA-gdD9sZ-4iA9c-8uzbUL-7hWskX-24apZ-6JCtXT-765WDT-7cpma4-765UzM-8wAnxv-8xtXNE-23HQ3r-79kxLp-9uu261-6JgUhP-62GZde-6HTovP-7xJsr-tXPfoF-6JkZB3-3aWJ47-6JkZtY-5fFxrT-5fKTRL-bzSKLU-RTQ8y-hGmu1-5fKTgm-5fFvFn-3D3gk9-769MNG
完全に忘れた・・・メンテ辛い・・・
16https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5gCQp-nRdqb-7ESvZP-5eMSN-4izRk-gdCx68-7H5QhG-hm25eq-gdCArW-gdCvG6-99Q3YA-gdD9sZ-4iA9c-8uzbUL-7hWskX-24apZ-6JCtXT-765WDT-7cpma4-765UzM-8wAnxv-8xtXNE-23HQ3r-79kxLp-9uu261-6JgUhP-62GZde-6HTovP-7xJsr-tXPfoF-6JkZB3-3aWJ47-6JkZtY-5fFxrT-5fKTRL-bzSKLU-RTQ8y-hGmu1-5fKTgm-5fFvFn-3D3gk9-769MNG
ruby で書けるからと言ってrecipe を調子に乗って自由に書きすぎた…
17https://www.flickr.com/photos/ro_buk/4207903199/in/photolist-7pQB2a-7oP9vq-8xbiHx-7Ajmwj-8zemoB-7ehuXP-94aHzE-93jvSN-5gCQp-nRdqb-7ESvZP-5eMSN-4izRk-gdCx68-7H5QhG-hm25eq-gdCArW-gdCvG6-99Q3YA-gdD9sZ-4iA9c-8uzbUL-7hWskX-24apZ-6JCtXT-765WDT-7cpma4-765UzM-8wAnxv-8xtXNE-23HQ3r-79kxLp-9uu261-6JgUhP-62GZde-6HTovP-7xJsr-tXPfoF-6JkZB3-3aWJ47-6JkZtY-5fFxrT-5fKTRL-bzSKLU-RTQ8y-hGmu1-5fKTgm-5fFvFn-3D3gk9-769MNG
ruby で書けるからと言ってrecipe を調子に乗って自由に書きすぎた…
チーム全体の学習コスト高い…
22
本日のゴール( 主に Chef 利用経験のあるご自身が )
Chef から Ansible へ移行する第一歩を踏み出せる気分になること
https://www.flickr.com/photos/opopododo/2571337302/in/photolist-4VdLZL-7b3bhQ-e9gbB-rCxB4-74Qv6t-7qFu1J-djqaWe-7qFjRU-9qhzWG-4zQ58L-7TjN4c-xvKpv-8a6rY5-5Zgg2m-foXf8P-52o5Gc-7qgahb-46ZCmT-7z9gq6-29XcLr-gok6wW-d47M9o-7g3JQC-eWLKj-7FigNd-7GjPxg-8KmWjQ-mFWxJV-9vvqNJ-5NpC4G-7reTfX-dkwWyU-iRpzkL-7fdVJk-dND4jW-exLA6M-fS1km-bdD5hM-qrK89n-7dCcE4-pVyBQ7-drMZqC-4y7cC7-pcvQqb-rEN56p-4WdiMB-pLTQeU-pLWNDL-7uPUoT-gtsSos
23
本日の流れ
• Ansible とは(概要)• Ansible の基本的な使い
方• Ansible の応用的な使い
方https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU-5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
24
本日の流れ
• Ansible とは(概要)• Ansible の基本的な使い
方• Ansible の応用的な使い
方https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU-5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
28
Application Service Orchestration(デプロイ・ノード間連携な
ど)System Configuration
( OS やミドルの構成管理など)
Bootstrapping ( OS の初期インストールな
ど)
Provisioning Tool Chain
引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)
29
Application Service Orchestration(デプロイ・ノード間連携な
ど)System Configuration
( OS やミドルの構成管理など)
Bootstrapping ( OS の初期インストールな
ど)
Provisioning Tool Chain
引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)
30
Application Service Orchestration(デプロイ・ノード間連携な
ど)System Configuration
( OS やミドルの構成管理など)
Bootstrapping ( OS の初期インストールな
ど)
Provisioning Tool Chain
引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)
31
Application Service Orchestration(デプロイ・ノード間連携な
ど)System Configuration
( OS やミドルの構成管理など)
Bootstrapping ( OS の初期インストールな
ど)
Provisioning Tool Chain
引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)
32
Application Service Orchestration(デプロイ・ノード間連携な
ど)System Configuration
( OS やミドルの構成管理など)
Bootstrapping ( OS の初期インストールな
ど)
Provisioning Tool Chain
引用元: Provisioning Toolchain by Lee Thompon (Velocity 2010)
37引用 http://www.ansible.com/home
エージェント不要SSH 等があれば OK
構成管理のみならずデプロイ・オーケストレーションそして冪等性も対応
数時間で使える人間 ( 非 ruby プログラマ )も読みやすい
39
Ansible Chef
エージェント エージェントレス
エージェントとサーバ
接続プロトコル SSH など SSH など記述方法 YAML Ruby
柔軟さ △ ○
シンプルさ ○ △
テンプレート形式
Jinja2 erb
共用 Ansible Galaxy Community Cookbook
(参考)開発言語
Python Ruby
Ansible と Chef の比較
40
本日の流れ
• Ansible とは(概要)• Ansible の基本的な使い
方• Ansible の応用的な使い
方https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU-5kMcmT-priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
42
インストール// RedHat 系 (EPEL 導入後 )$ sudo yum install ansible
// Ubuntu 等$ sudo apt-get install software-properties-common$ sudo apt-add-repository ppa:ansible/ansible$ sudo apt-get update$ sudo apt-get install ansible
// Mac OS$ brew update$ brew install ansible
Python がある前提
45
設定ファイル
inventory
playbook
ansible.cfg
実行対象を設定するファイルini 形式で記述task( 実施する処理 ) をまとめて記述したファイル
Ansible 自体の設定ファイル// 今回は省略
46
設定ファイル
inventory
playbook
ansible.cfg
実行対象を設定するファイルini 形式で記述task( 実施する処理 ) をまとめて記述したファイル
Ansible 自体の設定ファイル// 今回は省略
47
inventory ファイルmail.example.com
[webservers]foo.example.combar.example.com
[dbservers]db[01:05].example.com
48
inventory ファイルmail.example.com
[webservers]foo.example.combar.example.com
[dbservers]db[01:05].example.com
シングルのホスト(SSH で接続するホスト名 )
49
inventory ファイルmail.example.com
[webservers]foo.example.combar.example.com
[dbservers]db[01:05].example.com
シングルのホスト(SSH で接続するホスト名 )
グループ名複数のホストを束ねており、
複数ホストに対してまとめて
処理を実行する場合に便利
50
inventory ファイルmail.example.com
[webservers]foo.example.combar.example.com
[dbservers]db[01:05].example.com
シングルのホスト(SSH で接続するホスト名 )
グループ名複数のホストを束ねており、
複数ホストに対してまとめて
処理を実行する場合に便利
簡略化したまとめ指定も可能
51
続: inventory ファイルexample.com ansible_ssh_port=5555
// その他の設定ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible_ssh_private_key_file=/foo/bar/XX
ssh のポート番号
52
続: inventory ファイルexample.com ansible_ssh_port=5555
// その他の設定ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible_ssh_private_key_file=/foo/bar/XX
ssh のポート番号
ssh の接続先 IP
53
続: inventory ファイルexample.com ansible_ssh_port=5555
// その他の設定ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible_ssh_private_key_file=/foo/bar/XX
ssh のポート番号
ssh の接続先 IP
ssh で接続するユーザ名
54
続: inventory ファイルexample.com ansible_ssh_port=5555
// その他の設定ansible_ssh_host=192.168.1.50
ansible_ssh_user=hoge
ansible_ssh_private_key_file=/foo/bar/XX
ssh のポート番号
ssh の接続先 IP
ssh で接続するユーザ名
ssh で利用する秘密鍵ファイル
56
ホスト名 : jtf(VitualBox 上の
VM)
ローカルMacbook
使ってみる
ansible jtf -i host.ini -m ping
-i インベントリファイル
ホストを指定 モジュール
( ホスト上で実行される )
$ cat host.inijtf
57
ansible jtf -i host.ini -a ‘uname -a’
ホスト名 : jtf(VitualBox 上の
VM)
ローカルMacbook
続:使ってみる
ansible jtf -i host.ini –m setup
chef でお馴染みの「 ohai 」を内部で利用
しホスト情報を取得
58
設定ファイル
inventory
playbook
ansible.cfg
実行対象を設定するファイルini 形式で記述task( 実施する処理 ) をまとめて記述したファイル
Ansible 自体の設定ファイル// 今回は省略
59
Playbook
---- hosts: jtf sudo: yes tasks: - apt: name=sl update_cache=yes
対象ホスト
sudo で
以下のタスク群を実行
「誰に対して、どういう条件で、何を実行」を YAMLで記述
60
Playbook
---- hosts: jtf sudo: yes tasks: - apt: name=sl update_cache=yes
chef でいう ResourcesAnsible では Module と呼ぶ
重要なので、後に高頻度で利用するモジュールを紹介
「誰に対して、どういう条件で、何を実行」を YAMLで記述
61
Playbook - vars
---- hosts: jtf vars: username: jtf_user tasks: - user: name={{ username }}
変数を渡したいとき
62
Playbook - vars
---- hosts: jtf vars: username: jtf_user tasks: - user: name={{ username }}
変数を渡したいとき
task で使う変数を組みこむ
63
Playbook - handler
tasks: - apt: name=nginx notify: restart nginxhandlers: - name: restart nginx service: name=nginx state=restarted
chef でいう Notification アクション
64
Playbook - handler
tasks: - apt: name=nginx notify: restart nginxhandlers: - name: restart nginx service: name=nginx state=restarted
chef でいう Notification アクション
65
Playbook - handler
tasks: - apt: name=nginx notify: restart nginxhandlers: - name: restart nginx service: name=nginx state=restarted
chef でいう Notification アクション
66
Playbook - handler
tasks: - apt: name=nginx notify: restart nginxhandlers: - name: restart nginx service: name=nginx state=restarted
chef でいう Notification アクション
#Chef だとこんな感じpackage “nginx” do action :install notifies :reload, ‘service[nginx]’end
service “nginx” do :reload => trueend
67
Playbook - loop
tasks: - apt: name={{ item }} with_items: - gcc - make - git
chef だと ruby 構文で頑張っていたところ
68
Playbook - loop
tasks: - apt: name={{ item }} with_items: - gcc - make - git
chef だと ruby 構文で頑張っていたところ
#Chef だとこんな感じ%w{gcc make git}.each do |pkg| package pkg do action : install endend
69
Playbook - when
tasks: - apt: name=apache2 state=latest when: ansible_os_family == “Debian”
- apt: name=httpd state=latest when: ansible_os_family == “RedHat”
条件分岐したい場合に利用、 Chef だと if/unless など
補足: ansible_os_family は、 ansible 実行時に 自動で収集・設定される変数
70
Playbook - when
tasks: - apt: name=apache2 state=latest when: ansible_os_family == “Debian” - apt: name=httpd state=latest when: ansible_os_family == “RedHat”
条件分岐したい場合に利用、 Chef だと if/unless など
Chef だと” package” で抽象化されていた。Ansibleへ移行時は注意。
72
fileファイル・ディレクトリの作成や変更
(Chef でいう file + directory + link)
- file: path=/etc/foo.conf owner=foo group=foo mode=0644
- file: path=/etc/some_directory state=directory mode=0755
73
copyansible を実行するホストから
対象のホストにファイルをコピーするChef でいう cookbook_file
- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644
74
templateChef のテンプレートと同様
変数を埋め込める file モジュールテンプレー卜は erb ではなく jinja2
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644
erb: <%= hoge %>jinja2: {{ hoge }}
75
script対象ホストでスクリプトを実行する
creates は chef の creates と一緒。tasks:# 冪等性無し- script: my_command.sh
# 冪等性有り- script: my_command.sh creates=/tmp/done.txt
76
get_urlURLからファイルをダウンロードする既にファイルが存在していた場合はダウンロードをスキップできる
(Chef でいう remote_file)
tasks:- name: download foo.conf get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440
79
ディレクトリ構成 Best Practice・ Chef には environment があるが、 Ansible にはない・対応としては、ディレクトリ構成のベストプラクティスが 公開されているのでそれで吸収可能production # inventory file for プロダクション
staging # inventory file for ステージ
group_vars/ group1 # グループごとの変数をまとめておくhost_vars/ hostname1 # ホスト固有の値を設定する
site.yml # 全ての起点の playbookwebservers.yml # playbook for web サーバdbservers.yml # playbook for db サーバ
80
続:ディレクトリ構成 Best Practice・ role単位で構築していくのが基本・以下の例は nginx の例
roles/ nginx/ # ロールごとに作成 (Chef でいうクックブック単位 ) tasks/ # 実行したい処理 main.yml # nginx のインストール処理 handlers/ # main.yml # notify で呼ばれるハンドラ templates/ nginx.conf.j2 # nginx のコンフィグファイル files/ bar.txt # 変数不要で配備したいファイル vars/ main.yml # このロールの変数を設定
82
Dynamic Inventry・ 管理ホストが多くなると、 Inventry 管理が大変 ・特にクラウド上のホストは生成・破棄の繰り返し・ Inventry には静的ファイルの他、スクリプト指定可能
// AWS を利用するためのキー情報$ export AWS_ACCESS_KEY_ID=’xxxxxxxxx.......'$ export AWS_SECRET_ACCESS_KEY='yyyyy.......’
// 動的にホストを取得するスクリプト取得 (公式が用意 )$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
// 実行$ ansible all -i ec2.py -m ping
83
Dynamic Inventry・ 管理ホストが多くなると、 Inventry 管理が大変 ・特にクラウド上のホストは生成・破棄の繰り返し・ Inventry には静的ファイルの他、スクリプト指定可能
// AWS を利用するためのキー情報$ export AWS_ACCESS_KEY_ID=’xxxxxxxxx.......'$ export AWS_SECRET_ACCESS_KEY='yyyyy.......’
// 動的にホストを取得するスクリプト取得 (公式が用意 )$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py$ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
// 実行$ ansible all -i ec2.py -m ping
静的ファイルの代わりにスクリプト指定
85
Ansible でデプロイまでやってみる仕込み ・ nginxから Rails アプリの指定はシンボリックリンク 例: /usr/local/app ・本当のアプリは、タイムスタンプ名のディレクトリへ 例: /usr/local/20150726-131500
シンボリックリンク
86
Ansible でデプロイまでやってみる
旧
新
条件: ・ Nginx をリバースプロキシとして利用 ・ Nginx の背後には Rails アプリ ・旧 /新の切り替えをなるべく Blue Green に行いたい
87
- name: デプロイ先のディレクトリを timestamp とするために、 timestamp を得る command: date '+%Y%m%d-%H%I%S' register: date_output
- name: timestamp 名のディレクトリの PATH 名を作る command: echo "/usr/local/{{ date_output.stdout }}" register: release_path
# name: release_path のディレクトリを作成し、任意の方法でアプリ配備
- name: 最新版の PATH にシンボリックリンクを貼る file: src=”{{ release_path }}" dest="/usr/local/app” state=link
デプロイまでする playbook例
補足 1 : capistrano 等の責務を ansible で対応するイメージ。 ロールバックなども書けば対応可能。補足 2: 上記は説明用で完全なコードで無い点に注意
88
インフラ TDD したい!・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester 等
1. Ansible2. Serverspec / Infratester
89
インフラ TDD したい!・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester 等
describe package(‘httpd’) it { should be_installed }end
describe port(80) do it { should be_listening }end
90
インフラ TDD したい!・ホワイトボックスアプローチ ⇒ ・ブラックボックスアプローチ ⇒ Infratester 等
describe server(:app) do describe http('http://app') do It "responds content including 'This is app server'" do expect(response.body).to include(‘This is app server’) end it "responds OK 200" do expect(response.status).to eq(200) end endend
92
本日のゴール( 主に Chef 利用経験のあるご自身が )
Chef から Ansible へ移行する第一歩を踏み出せる気分になること
https://www.flickr.com/photos/opopododo/2571337302/in/photolist-4VdLZL-7b3bhQ-e9gbB-rCxB4-74Qv6t-7qFu1J-djqaWe-7qFjRU-9qhzWG-4zQ58L-7TjN4c-xvKpv-8a6rY5-5Zgg2m-foXf8P-52o5Gc-7qgahb-46ZCmT-7z9gq6-29XcLr-gok6wW-d47M9o-7g3JQC-eWLKj-7FigNd-7GjPxg-8KmWjQ-mFWxJV-9vvqNJ-5NpC4G-7reTfX-dkwWyU-iRpzkL-7fdVJk-dND4jW-exLA6M-fS1km-bdD5hM-qrK89n-7dCcE4-pVyBQ7-drMZqC-4y7cC7-pcvQqb-rEN56p-4WdiMB-pLTQeU-pLWNDL-7uPUoT-gtsSos
おしまい