- 命名由來:小說 Ender’s Game (安德的遊戲 or 戰爭遊戲)
- 官網上的 slogan
Automation for everyone
- 一個自動化工具,幫你完成組態管理、程式部署等工作
- 實現 Infrastructure as code (IaC)
- 其他類似的工具: Puppet, SaltStack, Chef, Terraform
優點:
- 只要有 ssh 跟 python 就可以運作
- 以 Yaml 格式編寫
- 被管理的 server 不需要另外安裝 agent
系統需求#
控制端
- Python 2 (version 2.7) or Python 3 (versions 3.5 and higher)
被管理端
- SSH
- Python 2 (version 2.6 or later) or Python 3 (version 3.5 or later)
先安裝 python 的套件管理工具 pip 或 pip3,再用 pip 安裝 ansible
建立一個資料夾來放 ansible 需要的檔案
1
| $ mkdir hello-ansible; cd hello-ansible;
|
用 vagrant 開一個測試機
1
2
| $ vagrant init ubuntu/trusty64
$ vagrant up
|
設定組態檔 ansible.cfg
,直接指定資料夾中的 hosts 為主要的主機清單
1
2
| [defaults]
inventory = hosts
|
設定 inventory 主機清單 hosts
,variables 配合 vagrant 的預設值
1
2
3
4
5
6
7
8
9
| all:
hosts:
server-01:
ansible_ssh_host: 127.0.0.1
vars:
ansible_user: vagrant
ansible_ssh_port: 2222
ansible_ssh_private_key_file: .vagrant/machines/default/virtualbox/private_key
ansible_ssh_extra_args: "-o StrictHostKeyChecking=no"
|
ping 主機
1
2
3
4
5
6
7
8
| $ ansible all -m ping
server-01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
|
對所有的主機下指令
1
2
3
| $ ansible all -m command -a 'echo Hello World.'
server-01 | CHANGED | rc=0 >>
Hello World.
|
Playbook#
Playbook 的翻譯是「劇本」,就如同字面上的意思,把你想要命令主機做的事情一件一件到 Playbook 中,讓 ansible 幫你一一的完成這些工作。
建立 ping.yml
鍵入你要處理的工作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ---
- hosts: "{{ variable_host | default('all') }}"
tasks:
- name: Ping server
ping:
register: result
- name: Print result
debug:
msg: "{{ result }}"
- name: Show uptime
command: uptime
register: uptime
- name: Print uptime
debug:
msg: "{{ uptime.stdout }}"
# vim: set filetype=yaml.ansible:
|
下指令 ansible-playbook ping.yml
就能看到執行結果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| $ ansible-playbook ping.yml
PLAY [all] *********************************************************************
TASK [Ping server] *************************************************************
ok: [server-01]
TASK [Print result] ************************************************************
ok: [server-01] => {
"msg": {
"changed": false,
"failed": false,
"ping": "pong"
}
}
TASK [Show uptime] *************************************************************
changed: [server-01]
TASK [Print uptime] ************************************************************
ok: [server-01] => {
"msg": " 14:59:19 up 1:53, 1 user, load average: 0.00, 0.01, 0.05"
}
PLAY RECAP *********************************************************************
server-01 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
一些寫 shell script 時要自己處理的事情,Ansible 或是一些 Module 都有了,不再需要重複造輪子
拿 playbook 跟 shell script 比較,一切都變得更加有結構性
剛開始使用時,其實也還不確定對工作效率的改善有多大的差距,就是一步一步的試下去
Reference#