一、ansible-playbook介紹:
playbook是由一個或多個"play"組成的列表。play的主要功能在於將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來將,所謂的task無法是調用ansible的一個module。將多個paly組織在一個playbook中,即可以讓他們聯通起來按事先編排的機制同唱一台大戲。
1、playbook基礎組件:
hosts
1
|
playbook中的每一個paly的目的都是為了讓某個或某些以某個指定用戶的身份執行任務。hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分割主機組。
|
user
1
|
remote_user則用於指定遠程主機上的執行任務的用戶。
|
任務列表:
1
|
play的主體部分是task list. task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務后再開始第二個。
|
action
1
|
任務執行過程
|
handlers
1
|
用於當前關注的資源發生變化時采取一定指定的操作
|
2、實例:
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
27
28
29
30
31
32
33
34
35
36
37
38
|
[root@node1 playbook]
# cat web.yml
- hosts:
test
\\主機組,在
/etc/ansible/hosts
定義
remote_user: root \\遠端執行任務的用戶
tasks: \\任務
- name:
install
httpd \\任務描述
command
: yum -y
install
httpd \\調用ansible的
command
模塊安裝httpd
- name: provide httpd.conf \\任務描述
copy: src=
"/root/httpd.conf"
dest=
"/etc/httpd/conf/httpd.conf"
\\調用ansible的copy模塊,httpd安裝完成后將事先准備好的httpd.conf文件復制到
/etc/httpd/conf
目錄下
tags: conf \\給此任務打標記,可單獨執行標記的任務,使用 ansible-playbook -C 命令執行
notify: \\文件內容變更通知
- server restart \\通知到指定的任務
- name: server start \\任務描述
service: name=httpd state=started enabled=
true
\\調用ansible的service模塊的屬性定義安裝完成httpd以后httpd服務的管理
handlers: \\定義接受關注的資源變化后執行的動作
- name: server restart \\任務描述
service: name=httpd state=restarted \\當關注的資源發生變化后調用service模塊,采取的響應的動作
執行過程如下:
[root@node1 playbook]
# ansible-playbook web.yml
PLAY [
test
] *******************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.2.13]
TASK: [
install
httpd] *********************************************************
changed: [172.16.2.13]
TASK: [provide httpd.conf] ****************************************************
changed: [172.16.2.13]
TASK: [server start] **********************************************************
changed: [172.16.2.13]
NOTIFIED: [server restart] ****************************************************
changed: [172.16.2.13]
PLAY RECAP ********************************************************************
172.16.2.13 : ok=5 changed=4 unreachable=0 failed=0
|
二、ansible的roles介紹:
ansible的roles用於層次性、結構化地組織palybook。roles能夠根據層次型結構自動裝載變量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。
rules的組成:
1
2
3
4
5
6
7
8
9
10
|
root@node1 playbook]
# tree roles/
roles/ \\ansible所有的信息都放到此目錄下面對應的目錄中
└── nginx \\角色名稱
├── default \\為當前角色設定默認變量時使用此目錄,應當包含一個main.yml文件;
├── files \\存放有copy或script等模塊調用的文件
├── handlers \\此目錄總應當包含一個main.yml文件,用於定義各角色用到的各handler
├── meta \\應當包含一個main.yml,用於定義角色的特殊設定及其依賴關系;1.3及以后版本支持
├── tasks \\至少包含一個名為main.yml的文件,定義了此角色的任務列表,可使用include指令
├── templates \\template模塊會自動在此目錄中尋找Jinja2模板文件
└── vars \\應當包含一個main.yml文件,用於定義此角色用到的變量
|
roles介紹完了,那么我們就利用ansible的roles來配置nginx
1、首先按照上面的要求創建要用到的目錄
1
|
[root@node1 playbook]
# mkdir -pv roles/nginx/{tasks,files,templates,handlers,vars,meta,default}
|
2、准備nginx配置文件
1
2
3
4
5
6
7
|
准備nginx.conf配置文件,使用模板文件配置
[root@node1 playbook]
# cd roles/nginx/templates/
[root@node1 ~]
# ansible all -m setup | grep ansible_processor_cores
"ansible_processor_cores"
: 1, \\獲取ansible的要調用的相關函數
[root@node1 playbook]
# cd roles/nginx/templates/ \\模板文件一定要放到此目錄
[root@node1 templates]
# vim nginx.conf
worker_processes {{ ansible_processor_cores }}; \\調用獲取到的函數
|
1
2
3
|
准備nginx的default.conf文件
[root@node1 playbook]
# ls -l roles/nginx/files/
-rw-r--r--. 1 root root 1290 Nov 12 2014 default.conf
|
3、准備nginx的rpm包
1
2
3
|
[root@node1 playbook]
# ls -l roles/nginx/files/
-rw-r--r--. 1 root root 1290 Nov 12 2014 default.conf
-rw-r--r--. 1 root root 319456 Mar 29 20:44 nginx-1.4.7-1.el6.ngx.x86_64.rpm
|
4、在tasks目錄中配置任務列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@node1 playbook]
# cd roles/nginx/tasks/
[root@node1 tasks]
# vim main.yml
- name: copy nginx.rpm
copy: src=nginx-1.4.7-1.el6.ngx.x86_64.rpm dest=
/tmp/nginx-1
.4.7-1.el6.ngx.x86_64.rpm
- name:
install
nginx
shell: yum -y
install
/tmp/nginx-1
.4.7-1.el6.ngx.x86_64.rpm
- name: provides nginx.conf
template: src=nginx.conf dest=
/etc/nginx/nginx
.conf
tags: nginxconf
notify:
- server restart
- name: provides default.conf
copy: src=default.conf dest=
/etc/nginx/conf
.d
/default
.conf
tags: nginxconf
- name: server start
service: name=nginx enabled=
true
state=started
|
5、在handlers目錄中配置定義handler信息
1
2
3
4
|
[root@node1 playbook]
# cd roles/nginx/handlers/
[root@node1 handlers]
# vim main.yml
- name: server restart
service: name=nginx state=restarted
|
6、在roles同一級目錄中創建site.yml文件
1
2
3
4
5
|
[root@node1 playbook]
# cat site.yml
- hosts: nginx
remote_user: root
roles:
- nginx
|
7、應用配置:
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
27
|
[root@node1 playbook]
# ansible-playbook site.yml
PLAY [nginx] ******************************************************************
GATHERING FACTS ***************************************************************
ok: [172.16.2.13]
TASK: [nginx | copy nginx.rpm] ************************************************
ok: [172.16.2.13]
TASK: [nginx |
install
nginx] *************************************************
changed: [172.16.2.13]
TASK: [nginx | provides nginx.conf] *******************************************
changed: [172.16.2.13]
TASK: [nginx | provides default.conf] *****************************************
changed: [172.16.2.13]
TASK: [nginx | server start] **************************************************
changed: [172.16.2.13]
NOTIFIED: [nginx | server restart] ********************************************
changed: [172.16.2.13]
PLAY RECAP ********************************************************************
172.16.2.13 : ok=7 changed=5 unreachable=0 failed=0
|
8、在node2主機上查看nginx是否已啟動
1
2
|
[root@node2 ~]
# ss -tpln | grep 80
LISTEN 0 128 *:80 *:*
users
:((
"nginx"
,8934,8),(
"nginx"
,8936,8))
|
9、roles目錄總體結構:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@node1 playbook]
# tree roles/
roles/
└── nginx
├── default
├── files
│ ├── default.conf
│ └── nginx-1.4.7-1.el6.ngx.x86_64.rpm
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
│ └── nginx.conf
└── vars
|
到此ansible常用的知識已介紹完畢,僅個人學習總結,大家有疑問的話可以一起交流。
注:轉載自:linux運維部落 » ansible-playbook