[ chusiang@l9k ~ ] $ cat .profile
# Author: 凍仁翔 / chusiang (at) drx.tw
# Blog: http://note.drx.tw
# Modified: 2017-03-09 15:54
2/e
關於我
• 凍仁翔 (@chusiang_lai)。
• 1 年年以上的 Ansible 使⽤用經驗。
• ⽬目前有在維護的 Roles:
• php7 (php-fpm)
• switch-apt-mirror
• vim-and-vi-mode
• zabbix-agent
2
坐穩囉
要開始了了!
3
Outline
I. 現代 IT ⼈人是什什麼?
4
Outline
I. 現代 IT ⼈人是什什麼?
II. 導入⾃自動化組態的好處是什什麼?
5
Outline
I. 現代 IT ⼈人是什什麼?
II. 導入⾃自動化組態的好處是什什麼?
III. Ansible 是什什麼?
6
Outline
I. 現代 IT ⼈人是什什麼?
II. 導入⾃自動化組態的好處是什什麼?
III. Ansible 是什什麼?
IV. 怎麼部署 Ansible 環境?
7
Outline
I. 現代 IT ⼈人是什什麼?
II. 導入⾃自動化組態的好處是什什麼?
III. Ansible 是什什麼?
IV. 怎麼部署 Ansible 環境?
V. 怎麼操作 Ansible?
8
Outline
I. 現代 IT ⼈人是什什麼?
II. 導入⾃自動化組態的好處是什什麼?
III. Ansible 是什什麼?
IV. 怎麼部署 Ansible 環境?
V. 怎麼操作 Ansible?
VI. Q & A
9
Ⅰ. 現代 IT ⼈人是什什麼?
10
DevOps
現代 IT ⼈人是什什麼?
11
以前的 IT ⼈人 現代的 IT ⼈人
從裝機到架站 需耗費數⼩小時 (hr) 不⽤用 30 分 (min)
上班
每天敲敲指令、裝裝機器,
常常忘了了改過什什麼
寫 code 當總統

寫 code 管機器
下班 寫不完的⼯工作⽇日記
幫⾃自⼰己寫⼯工具 

(為了了提早下班)
Ⅱ. 導入⾃自動化組態的好處是什什麼?
12
※ 註:組態 = Configuration management (CM)
導入 Ansible ⾃自動化組態,
我們可以減少服務中斷時間
、測試基礎建設、降低意外
風險,更更可以讓開發、測試
和正式環境無縫接軌。
圖片來來源 - Ansible as Automation Glue
13
"⼯工⼈人" 組態 ⾃自動化組態
重複組態的⼈人⼒力力成本 ⾼高 低
⼈人為失誤風險 ⾼高 低
可測試性 難 易易
模組化 難 易易
提早下班 難 易易
導入⾃自動化組態的好處是什什麼?
14
Ⅲ. Ansible 是什什麼?
15
Ansible 取名⾃自知名⼩小說

《安德的遊戲》,是
虛構的超光速通訊裝置。
有了了它我們就可以像 Ender

指揮戰艦般的操控伺服器。
電影海海報 - https://goo.gl/4xftZT
16
Ansible 是近年年來來知名度不
斷上升的 DevOps ⾃自動化
軟體,雖然⾃自 2013 年年創立⾄至
今不到 4 年年,但由於其採⽤用

無代理理程式的架構,部署
靈活,程式碼易易讀,因⽽而
迅速成為受矚⽬目的 DevOps
⼯工具。
iThome - http://goo.gl/yJbWtz
17
Ansible 是什什麼?
• 與 Puppet, SaltStack, Chef 並列列其四的⾃自動化組態設定
⼯工具 (Infrastructure as Code),其簡單易易⽤用的特性讓⼈人⼀一
⽤用就愛上,在 DevOps 界也佔有⼀一席之地。
• 使⽤用 Push 架構,只需 Python 和 SSH 即可操作,不⽤用額
外裝 Angent。



• Python 陣營的組態設定⼯工具。
18
Ⅳ. 怎麼部署 Ansible 環境?
19
觀念念、安裝、設定
Ansible 是怎麼運作的?
透過 inventory 定義 Managed node,並藉由 SSH 與 Python 進⾏行行溝通。
20
怎麼安裝 Ansible?
• 只需在 Control Machine 安裝 Ansible;Managed node
則要有 Python 2.5+ 和 SSH。
21
# Debian & Ubuntu (apt).
$ sudo apt-get install ansible
# RHEL & CentOS (yum).
$ sudo yum install ansible
# Mac OS X (homebrew).
$ brew install ansible
# Python (pip).
$ sudo pip install ansible
怎麼設定 Ansible?
• 藉由 ansible.cfg 來來設定 inventory (host file) 檔案路路徑、
Managed node (被控端) 使⽤用者名稱、SSH ⾦金金鑰 … 等。
22
$ vim ansible.cfg
[defaults]
# 指定 inventory 檔案路路徑。
hostfile = hosts
# 遠端使⽤用者名稱
remote_user = docker
#private_key_file = ~/.ssh/id_rsa
# host_key_checking: 不詢問加入 ssh ⾦金金鑰
host_key_checking = False
inventory 是什什麼?
• 主要⽤用來來定義 Managed node (被控端) 主機位址與群組,
也可⽤用來來設定 ssh 連線資訊。
23
$ vim hosts
# ansible_ssh_host: 遠端 SSH 主機位址。
# ansible_ssh_port: 遠端 SSH 埠⼝口 (Port)。
# ansible_ssh_user: 遠端 SSH 使⽤用者名稱。
# ansible_ssh_private_key_file: 本機 SSH 私鑰檔路路徑。
# ansible_ssh_pass: 遠端 SSH 密碼 (建議改⽤用私鑰)。
[dev]
ansible-demo ansible_ssh_host=127.0.0.1 ansible_ssh_pass=pwd
[test]
ansible-test ansible_ssh_host=172.10.10.1 ansible_ssh_port=2222
[prod]
ansible-prod ansible_ssh_host=10.10.10.1 ansible_ssh_user=deploy
Ⅴ. 怎麼操作 Ansible?
24
Ad-Hoc command, Playbook* (Module)
Ad-Hoc
command
and
25
Playbook
Ad-Hoc command 是什什麼?
• 簡短 (臨臨時性) 的指令,與⼀一般的 command line 操作模式
雷同,⼀一次只透過⼀一⾏行行指令進⾏行行操作。
26
# ⼀一般的 command line
$ ping ansible-demo.local
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.037 ms
--- localhost ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.037/0.037/0.037/0.000 ms
$ echo Hello World
Hello World
Ad-Hoc command 是什什麼?
• Ansible -m 後的各項參參數請參參考官⽅方⽂文件 -

Module Index。
27
# ansible <主機名稱> -m <各項參參數>
$ ansible all -m ping
ansible-demo.local | SUCCESS => {
"changed": false,
"ping": "pong"
}
$ ansible all -m command -a "echo Hello World"
ansible-demo.local | SUCCESS | rc=0 >>
Hello World
Playbooks 是什什麼?
• 比 Shell Script 更更具結構化的腳
本語⾔言,是⼀一鍵部署的好物。
• 使⽤用 YAML 格式,寫 code 就
如同寫⽂文件,簡單易易讀。
• 通常會有 Play, Task, Module。
• 可使⽤用 Jinja2 (template 系統)
表達式,並⽀支援變數、判斷式

、迴圈等語法。
Baby Playbook Onesie - http://goo.gl/GKJvXn
28
Playbooks 是什什麼?
• ⼀一份 Playbook 可以有多個 Play 和 多個 Tasks。
• 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。

























29
$ vim example.yml
---
- name: This is a Super-basic playbook.
hosts: all
tasks:
- name: Hello World
command: echo "Hello World"
- name: Install Vim & Emacs
become: yes
apt: name={{ item }} state=present
with_items:
- vim
- emacs
# 去去,emacs 走。
- name: use vi-mode in readline
become: yes
lineinfile: dest=/etc/inputrc line="set editing-mode vi"
Playbooks 是什什麼?
• ⼀一份 Playbook 可以有多個 Play 和 多個 Tasks。
• 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。

























30
$ vim example.yml
---
- name: This is a Super-basic playbook.
hosts: all
tasks:
- name: Hello World
command: echo "Hello World"
- name: Install Vim & Emacs
become: yes
apt: name={{ item }} state=present
with_items:
- vim
- emacs
# 去去,emacs 走。
- name: use vi-mode in readline
become: yes
lineinfile: dest=/etc/inputrc line="set editing-mode vi"
Play
Playbooks 是什什麼?
• ⼀一份 Playbook 可以有多個 Play 和 多個 Tasks。
• 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。

























31
$ vim example.yml
---
- name: This is a Super-basic playbook.
hosts: all
tasks:
- name: Hello World
command: echo "Hello World"
- name: Install Vim & Emacs
become: yes
apt: name={{ item }} state=present
with_items:
- vim
- emacs
# 去去,emacs 走。
- name: use vi-mode in readline
become: yes
lineinfile: dest=/etc/inputrc line="set editing-mode vi"
Task 1
Task 2
Task 3
Playbooks 是什什麼?
• ⼀一份 Playbook 可以有多個 Play 和 多個 Tasks。
• 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。

























32
$ vim example.yml
---
- name: This is a Super-basic playbook.
hosts: all
tasks:
- name: Hello World
command: echo "Hello World"
- name: Install Vim & Emacs
become: yes
apt: name={{ item }} state=present
with_items:
- vim
- emacs
# 去去,emacs 走。
- name: use vi-mode in readline
become: yes
lineinfile: dest=/etc/inputrc line="set editing-mode vi"
Module
Playbooks 是什什麼?
• 執⾏行行 example.yml playbook。
33
$ ansible-playbook example.yml
PLAY [This is a Super-basic playbook.] *****************************************
TASK [setup] *******************************************************************
ok: [ansible-demo.local]
TASK [Hello World] *************************************************************
changed: [ansible-demo.local]
TASK [Install Vim & Emacs] *****************************************************
changed: [ansible-demo.local] => (item=[u'vim', u'emacs'])
TASK [use vi-mode in readline] *************************************************
changed: [ansible-demo.local]
PLAY RECAP *********************************************************************
ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0
Playbooks 是什什麼?
• 執⾏行行 example.yml playbook。
34
$ ansible-playbook example.yml
PLAY [This is a Super-basic playbook.] *****************************************
TASK [setup] *******************************************************************
ok: [ansible-demo.local]
TASK [Hello World] *************************************************************
changed: [ansible-demo.local]
TASK [Install Vim & Emacs] *****************************************************
changed: [ansible-demo.local] => (item=[u'vim', u'emacs'])
TASK [use vi-mode in readline] *************************************************
changed: [ansible-demo.local]
PLAY RECAP *********************************************************************
ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0
Setup
總結 (Recap)
Module
35
http://docs.ansible.com/ansible/list_of_commands_modules.html
Docs » commands Modules
有 yes 就⼀一定要⽤用
實 戰 演 練
Practice
39
請⾄至 https://goo.gl/EYJ40O 取得 Control Machine*1、Managed node*2 之練習環境。
透過 Ansible 和 Jupyter 操控 Managed node
40
Q & A
嚴禁拍打餵食
42
E N D

Automate with Ansible basic (2/e)

  • 1.
    [ chusiang@l9k ~] $ cat .profile # Author: 凍仁翔 / chusiang (at) drx.tw # Blog: http://note.drx.tw # Modified: 2017-03-09 15:54 2/e
  • 2.
    關於我 • 凍仁翔 (@chusiang_lai)。 •1 年年以上的 Ansible 使⽤用經驗。 • ⽬目前有在維護的 Roles: • php7 (php-fpm) • switch-apt-mirror • vim-and-vi-mode • zabbix-agent 2
  • 3.
  • 4.
    Outline I. 現代 IT⼈人是什什麼? 4
  • 5.
    Outline I. 現代 IT⼈人是什什麼? II. 導入⾃自動化組態的好處是什什麼? 5
  • 6.
    Outline I. 現代 IT⼈人是什什麼? II. 導入⾃自動化組態的好處是什什麼? III. Ansible 是什什麼? 6
  • 7.
    Outline I. 現代 IT⼈人是什什麼? II. 導入⾃自動化組態的好處是什什麼? III. Ansible 是什什麼? IV. 怎麼部署 Ansible 環境? 7
  • 8.
    Outline I. 現代 IT⼈人是什什麼? II. 導入⾃自動化組態的好處是什什麼? III. Ansible 是什什麼? IV. 怎麼部署 Ansible 環境? V. 怎麼操作 Ansible? 8
  • 9.
    Outline I. 現代 IT⼈人是什什麼? II. 導入⾃自動化組態的好處是什什麼? III. Ansible 是什什麼? IV. 怎麼部署 Ansible 環境? V. 怎麼操作 Ansible? VI. Q & A 9
  • 10.
    Ⅰ. 現代 IT⼈人是什什麼? 10 DevOps
  • 11.
    現代 IT ⼈人是什什麼? 11 以前的IT ⼈人 現代的 IT ⼈人 從裝機到架站 需耗費數⼩小時 (hr) 不⽤用 30 分 (min) 上班 每天敲敲指令、裝裝機器, 常常忘了了改過什什麼 寫 code 當總統 寫 code 管機器 下班 寫不完的⼯工作⽇日記 幫⾃自⼰己寫⼯工具 (為了了提早下班)
  • 12.
  • 13.
  • 14.
    "⼯工⼈人" 組態 ⾃自動化組態 重複組態的⼈人⼒力力成本⾼高 低 ⼈人為失誤風險 ⾼高 低 可測試性 難 易易 模組化 難 易易 提早下班 難 易易 導入⾃自動化組態的好處是什什麼? 14
  • 15.
  • 16.
  • 17.
    Ansible 是近年年來來知名度不 斷上升的 DevOps⾃自動化 軟體,雖然⾃自 2013 年年創立⾄至 今不到 4 年年,但由於其採⽤用
 無代理理程式的架構,部署 靈活,程式碼易易讀,因⽽而 迅速成為受矚⽬目的 DevOps ⼯工具。 iThome - http://goo.gl/yJbWtz 17
  • 18.
    Ansible 是什什麼? • 與Puppet, SaltStack, Chef 並列列其四的⾃自動化組態設定 ⼯工具 (Infrastructure as Code),其簡單易易⽤用的特性讓⼈人⼀一 ⽤用就愛上,在 DevOps 界也佔有⼀一席之地。 • 使⽤用 Push 架構,只需 Python 和 SSH 即可操作,不⽤用額 外裝 Angent。
 
 • Python 陣營的組態設定⼯工具。 18
  • 19.
    Ⅳ. 怎麼部署 Ansible環境? 19 觀念念、安裝、設定
  • 20.
    Ansible 是怎麼運作的? 透過 inventory定義 Managed node,並藉由 SSH 與 Python 進⾏行行溝通。 20
  • 21.
    怎麼安裝 Ansible? • 只需在Control Machine 安裝 Ansible;Managed node 則要有 Python 2.5+ 和 SSH。 21 # Debian & Ubuntu (apt). $ sudo apt-get install ansible # RHEL & CentOS (yum). $ sudo yum install ansible # Mac OS X (homebrew). $ brew install ansible # Python (pip). $ sudo pip install ansible
  • 22.
    怎麼設定 Ansible? • 藉由ansible.cfg 來來設定 inventory (host file) 檔案路路徑、 Managed node (被控端) 使⽤用者名稱、SSH ⾦金金鑰 … 等。 22 $ vim ansible.cfg [defaults] # 指定 inventory 檔案路路徑。 hostfile = hosts # 遠端使⽤用者名稱 remote_user = docker #private_key_file = ~/.ssh/id_rsa # host_key_checking: 不詢問加入 ssh ⾦金金鑰 host_key_checking = False
  • 23.
    inventory 是什什麼? • 主要⽤用來來定義Managed node (被控端) 主機位址與群組, 也可⽤用來來設定 ssh 連線資訊。 23 $ vim hosts # ansible_ssh_host: 遠端 SSH 主機位址。 # ansible_ssh_port: 遠端 SSH 埠⼝口 (Port)。 # ansible_ssh_user: 遠端 SSH 使⽤用者名稱。 # ansible_ssh_private_key_file: 本機 SSH 私鑰檔路路徑。 # ansible_ssh_pass: 遠端 SSH 密碼 (建議改⽤用私鑰)。 [dev] ansible-demo ansible_ssh_host=127.0.0.1 ansible_ssh_pass=pwd [test] ansible-test ansible_ssh_host=172.10.10.1 ansible_ssh_port=2222 [prod] ansible-prod ansible_ssh_host=10.10.10.1 ansible_ssh_user=deploy
  • 24.
    Ⅴ. 怎麼操作 Ansible? 24 Ad-Hoccommand, Playbook* (Module)
  • 25.
  • 26.
    Ad-Hoc command 是什什麼? •簡短 (臨臨時性) 的指令,與⼀一般的 command line 操作模式 雷同,⼀一次只透過⼀一⾏行行指令進⾏行行操作。 26 # ⼀一般的 command line $ ping ansible-demo.local PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.037 ms --- localhost ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.037/0.037/0.037/0.000 ms $ echo Hello World Hello World
  • 27.
    Ad-Hoc command 是什什麼? •Ansible -m 後的各項參參數請參參考官⽅方⽂文件 -
 Module Index。 27 # ansible <主機名稱> -m <各項參參數> $ ansible all -m ping ansible-demo.local | SUCCESS => { "changed": false, "ping": "pong" } $ ansible all -m command -a "echo Hello World" ansible-demo.local | SUCCESS | rc=0 >> Hello World
  • 28.
    Playbooks 是什什麼? • 比Shell Script 更更具結構化的腳 本語⾔言,是⼀一鍵部署的好物。 • 使⽤用 YAML 格式,寫 code 就 如同寫⽂文件,簡單易易讀。 • 通常會有 Play, Task, Module。 • 可使⽤用 Jinja2 (template 系統) 表達式,並⽀支援變數、判斷式
 、迴圈等語法。 Baby Playbook Onesie - http://goo.gl/GKJvXn 28
  • 29.
    Playbooks 是什什麼? • ⼀一份Playbook 可以有多個 Play 和 多個 Tasks。 • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 29 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: dest=/etc/inputrc line="set editing-mode vi"
  • 30.
    Playbooks 是什什麼? • ⼀一份Playbook 可以有多個 Play 和 多個 Tasks。 • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 30 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: dest=/etc/inputrc line="set editing-mode vi" Play
  • 31.
    Playbooks 是什什麼? • ⼀一份Playbook 可以有多個 Play 和 多個 Tasks。 • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 31 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: dest=/etc/inputrc line="set editing-mode vi" Task 1 Task 2 Task 3
  • 32.
    Playbooks 是什什麼? • ⼀一份Playbook 可以有多個 Play 和 多個 Tasks。 • 此例例⽤用到了了 Play*1, Task*3 和 Module*3 (command, apt, lineinfile)。
 
 
 
 
 
 
 
 
 
 
 
 
 32 $ vim example.yml --- - name: This is a Super-basic playbook. hosts: all tasks: - name: Hello World command: echo "Hello World" - name: Install Vim & Emacs become: yes apt: name={{ item }} state=present with_items: - vim - emacs # 去去,emacs 走。 - name: use vi-mode in readline become: yes lineinfile: dest=/etc/inputrc line="set editing-mode vi" Module
  • 33.
    Playbooks 是什什麼? • 執⾏行行example.yml playbook。 33 $ ansible-playbook example.yml PLAY [This is a Super-basic playbook.] ***************************************** TASK [setup] ******************************************************************* ok: [ansible-demo.local] TASK [Hello World] ************************************************************* changed: [ansible-demo.local] TASK [Install Vim & Emacs] ***************************************************** changed: [ansible-demo.local] => (item=[u'vim', u'emacs']) TASK [use vi-mode in readline] ************************************************* changed: [ansible-demo.local] PLAY RECAP ********************************************************************* ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0
  • 34.
    Playbooks 是什什麼? • 執⾏行行example.yml playbook。 34 $ ansible-playbook example.yml PLAY [This is a Super-basic playbook.] ***************************************** TASK [setup] ******************************************************************* ok: [ansible-demo.local] TASK [Hello World] ************************************************************* changed: [ansible-demo.local] TASK [Install Vim & Emacs] ***************************************************** changed: [ansible-demo.local] => (item=[u'vim', u'emacs']) TASK [use vi-mode in readline] ************************************************* changed: [ansible-demo.local] PLAY RECAP ********************************************************************* ansible-demo.local : ok=4 changed=3 unreachable=0 failed=0 Setup 總結 (Recap)
  • 35.
  • 36.
  • 38.
    Docs » commandsModules 有 yes 就⼀一定要⽤用
  • 39.
    實 戰 演練 Practice 39
  • 40.
    請⾄至 https://goo.gl/EYJ40O 取得Control Machine*1、Managed node*2 之練習環境。 透過 Ansible 和 Jupyter 操控 Managed node 40
  • 42.
  • 43.