Upload
taro-hirose
View
2.268
Download
1
Embed Size (px)
Citation preview
Ansible説明会1. Ansibleとは
2. Ansibleの特徴
3. Ansibleの用語解説
※この資料は以下のようなAnsible初心者を対象としています
✤ Ansibleを触ってみたい、導入したいと考えている方 ✤ サーバー構築とかやってる方 ✤ サーバーデプロイを効率化したい方 ✤ Chefは辛い方
✤ Ansibleって響きが気になる方
Ansibleとは
“Ansible is Simple IT Automation”
SIMPLE AGENTLESS POWERFUL
Automate in hours - not weeks - with Ansible's
human-readable IT automation language.
Ansible uses SSH instead of agents. More efficient, more secure and less to
manage.
App deployment, configuration
management and orchestration - all from
one system.
qt: http://www.ansible.com/home
なぜやるの? 1) 構成管理✤ ドキュメントが古い
✤ 更新も面倒
✤ Snapshot, AMIが秘伝のタレ化
✤ 何が動いているのか分からない
✤ まっさらなOSから環境構築できない
✤ このサーバは「どうあるべき」なのか
Ansibleの特徴
“Ansible is Simple IT Automation”
SIMPLE AGENTLESS POWERFUL
Automate in hours - not weeks - with Ansible's
human-readable IT automation language.
Ansible uses SSH instead of agents. More efficient, more secure and less to
manage.
App deployment, configuration
management and orchestration - all from
one system.
qt: http://www.ansible.com/home
Ansibleの特徴
“Ansible is Simple IT Automation”
✤ 定義はYAML(≒設定ファイル) ✤ プログラムですら無いため学習障壁が少ない
SIMPLE
Automate in hours - not weeks - with Ansible's
human-readable IT automation language.
--- - hosts: webservers tasks: - name: yum install nginx yum: pkg=nginx state=installed
Ansibleの特徴
“Ansible is Simple IT Automation”
✤ agentインストール不要 ✤ 運用管理サーバでansible*コマンドが使えればOK
✤ Pythonが入っていれば導入可能
✤ 専用のserverやagentの運用管理不要 ✤ 常駐するプロセスはなし
AGENTLESS
Ansible uses SSH instead of agents. More efficient, more secure and less to
manage.
Ansibleの特徴
“Ansible is Simple IT Automation”
✤ 構成管理だけでなくOrchestrationとしても使えるので、ちょっとした操作や調査の支援ツールにもなる
✤ 高機能だが、スモールスタートで始めることも可能
POWERFUL
App deployment, configuration
management and orchestration - all from
one system.
柔軟な実行方法✤ 指定したタイミングで実行 ✤ 複数並列実行 ✤ 必要な処理だけをone-linerでadhocに実行
✤ Push型だけでなくPull型もサポート (ansible-pull)
Ansibleの特徴
“Ansible is Simple IT Automation”
冪等性✤ 記載したDSLの定義の状態に収束してくれる ✤ ある操作を何回行っても結果は同じ ✤ 変更がなければ処理をスキップする
以下がインストールされていること ・nginx
・java
・zabbix_agentd サービスが起動していること ・nginx
・zabbix_agentd
主なコマンド✤ ansible
✤ Adhocに実行する
✤ ansible-playbook ✤ 作成した定義 (playbook) を実行する
# コマンド実行例
$ ansible -m 'ping' webservers ansible-test02 | success >> { "changed": false, "ping": "pong" }
# dry-run $ ansible-playbook hands-on00.yml --check --diff … PLAY RECAP ******************************************************************** ansible-test02 : ok=2 changed=0 unreachable=0 failed=0
# execute $ ansible-playbook hands-on00.yml … PLAY RECAP ******************************************************************** ansible-test02 : ok=2 changed=0 unreachable=0 failed=0
Inventory HostAnsibleで管理するホストをini形式で記載する
✤ ホストのグルーピングが可能
# 例: example.com サイトをAnsibleで管理する
mail.example.com [webservers] foo.example.com bar.example.com
Playbook実行する処理の内容をYAML形式で記載する
✤ 最初はplaybookとinventry hostさえあればOK
--- - hosts: webservers tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest
- name: write the apache config file template: src=templates/httpd.j2 dest=/etc/httpd.conf notify: - restart apache
- name: ensure apache is running (and enable it at boot) service: name=httpd state=started enabled=yes handlers: - name: restart apache service: name=httpd state=restarted
Task (Tasks lists)具体的な処理を、実行する順に配列で記載する
✤ 基本は name と module のセットを記載する
✤ 実行条件やトリガー (notify/handler) を加えることも可能 ✤ 実行条件: [when, changed_when, ignore_errors, always_runなど]
✤ トリガー: handlers で記載した処理の名前をnotifyで指定
--- - hosts: webservers tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest
- name: write the apache config file template: src=templates/httpd.j2 dest=/etc/httpd.conf notify: - restart apache
- name: ensure apache is running (and enable it at boot) service: name=httpd state=started enabled=yes handlers: - name: restart apache service: name=httpd state=restarted
ModuleTasksで指定した処理を実行する汎用ライブラリ
✤ Modules are “idempotent” (冪等性)
✤ Core Modulesだけでも必要な作業は大体カバーできる--- - hosts: webservers tasks: - name: ensure apache is at the latest version yum: pkg=httpd state=latest
- name: write the apache config file template: src=templates/httpd.j2 dest=/etc/httpd.conf notify: - restart apache
- name: ensure apache is running (and enable it at boot) service: name=httpd state=started enabled=yes handlers: - name: restart apache service: name=httpd state=restarted
代表的なModule✤ yum / apt : パッケージ管理 (インストール, 削除など)
✤ service : サービス操作 (起動, 停止, 再起動など)
✤ file : ファイル操作 (作成, 削除, 属性変更など)
✤ copy : ファイルをコピー
✤ template : ファイルを雛形としてファイル生成 (後述)
✤ shell : 任意のshellコマンドを実行(※冪等性は自分で担保) ✤ 具体的な操作の他、“register” を併用して条件分岐に利用する等の使い方もある
公式ドキュメントにModuleの一覧と説明があるので、詳しくは以下を参照ください。
http://docs.ansible.com/ansible/modules_by_category.html
共通化 (Include / Role)✤ Include:
✤ tasksやhanderls等を別ファイルとして切り出し、一つのRoleとしてまとめておくことで再利用しやすくする
--- - hosts: webservers tasks: - include: apache.yml - include: deploy.yml site=service_A - include: deploy.yml site=service_B
共通化 (Include / Role)✤ Role:
✤ task, vars, files, templates, handlers一式を共通化
✤ playbookからは roles 一発で呼び出しできる ✤ 複数サーバに適用する、汎化させるなどの用途で活用
# playbook
--- - hosts: webservers roles: - common - webserver
# ディレクトリ構成
hosts webservers.yml roles/ common/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/ webservers/ …
共通化 (Template / Variable)✤ Template:
✤ 変数をbindして配布できる ✤ ホスト毎に異なるようなファイルを配布するときに活用 ✤ 書式は “Jinja2”
# files/etc/motd.j2
################################################## !!! Production server {{ ansible_hostname }} !!! ##################################################
__| __|_ ) _| ( / Amazon Linux AMI ___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2015.03-release-notes/
共通化 (Template / Variable)✤ Variable:
✤ 条件分岐やTemplateで利用する変数を定義し呼出可能 ✤ 書式はYAML
✤ playbook, inventry host, varsなど様々な箇所で指定可能
✤ OS層の下回りの情報はansibleが自動で取得し呼出可能 (Facts) ✤ 利用可能な変数は `ansible hostname -m setup` で確認可能
✤ Chefで言う ohai# Variables
innodb_buffer_pool_size: 6144M innodb_log_file_size: 2048M max_connections: 1000 …
$ ansible ansible-test02 -m 'setup'
ansible-test02 | success >> { "ansible_facts": { "ansible_all_ipv4_addresses": [ "172.31.xx.xx" ], "ansible_all_ipv6_addresses": [], "ansible_architecture": "x86_64", "ansible_bios_date": "NA", "ansible_bios_version": "NA", "ansible_cmdline": { "KEYTABLE": "us", "LANG": "ja-JP.UTF-8",
Installation1. サーバログイン
1. サーバ (Ansible: 1, Target: 1) へのSSH接続 ✤ 接続情報は個別にお渡しします
2. Ansible実行用の鍵作成と配布 1. Ansibleサーバ上で`ssh-keygen` で作成 (パスフレーズなし)
2. ec2-user@target:/home/ec2-user/.ssh/authorized_keys に 公開鍵 (id_rsa.pub) をcopy
3. Ansibleサーバの /etc/hosts に Targetサーバを PrivateIP で記載 ( `sudo vim /etc/hosts` )
4. Ansible → Target へのssh接続確認
3. Ansibleインストール 1. `sudo pip install ansible` 2. `sudo mkdir /etc/ansible && sudo chown ec2-user:ec2-user /etc/ansible && cd /etc/
ansible` 3. `touch hosts` 4. `wget https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg `
Ansible手始め1. Inventory Hostを記載
2. Ansibleコマンドを試し打ち
✤ `ansible TARGET -m 'ping'` ✤ `ansible TARGET -m 'setup'`
# /etc/ansible/hosts
[webservers] ansible-target0x
BestPractice
Best Practices Directory Layout - Ansible Documentation
production # Inventory Hostはグループごとに作成 staging # 〃
group_vars/ # グループ用の変数の格納場所 group1 # group2 # host_vars/ # ホスト用の変数の格納場所 hostname1 # hostname2 #
library/ # 自作Moduleの格納場所 (optional) filter_plugins/ # 自作Filter Pluginの格納場所 (optional)
site.yml # master Playbook webservers.yml # Playbook dbservers.yml # Playbook
roles/ # ロール (Role) の格納場所 common/ # “common” ロール tasks/ # Taskの格納場所 main.yml # <-- Taskがもし多くなる場合は小さく分ける handlers/ # Handlerの格納場所 main.yml # <-- 〃 templates/ # Templateの格納場所 ntp.conf.j2 # <------- Templateファイル名は *.j2 files/ # Fileの格納場所 bar.txt # foo.sh # vars/ # Varsの格納場所 main.yml # defaults/ # main.yml # Varsのデフォ値 (group/host_varsで上書き可) meta/ # ロールの依存関係があれば定義
Hands On1(20min)
1. 運用ツールをインストール ✤ telnet, wget, rsync, tree, tcpdump,
sysstat, dstat, vim-enhanced, git, htop
2. バナーを配置 ✤ /etc/motd
3. Nginx install ✤ yum install ✤ 自動起動有効
4. Deploy ✤ page upload (適当なhtml)
Hands On3(30min)
1. Swapfileを作成 ✤ 512MBのswapfileを作成
✤ swaponでスワップ追加
✤ boot時に自動マウント
✤ ※冪等性は担保すること
2. 運用ツールを追加 ✤ htop, glances, tmux ✤ ag (the-silver-searcher)
3. Deploy (from github) ✤ yteraoka/ansible-tutorial ✤ /var/www/ 以下にdeploy
✤ Nginx設定ファイル編集→restart