****前言****
前段時(shí)間總結(jié)了ansible的基本配置與使用,那么說到了ansible的話呢,playbook是必不可少的,playbook在我看來就是一個(gè)花花公子-playboy!
****playbook的介紹****
Playbooks are a completely different way to use ansible than in adhoc task execution mode, and are particularly powerful.
顧名思義,playbooks是一個(gè)"劇本",不同于ansible的使用方式,它是按照編排的任務(wù)智能地執(zhí)行,并且非常強(qiáng)大!
Simply put, playbooks are the basis for a really simple configuration management and multi-machine deployment system, unlike any that already exist, and one that is very well suited to deploying complex applications.
簡(jiǎn)單地來說呢,playbooks適合簡(jiǎn)單的配置管理以及多服務(wù)器機(jī)器的管理,同時(shí)還可以處理部署復(fù)雜的應(yīng)用。
要是服務(wù)器不僅僅復(fù)雜,數(shù)量上還是成千上萬的呢,還是推薦使用重量級(jí)又古老文明的saltstack。
傳送ansible文檔詳解
自動(dòng)化運(yùn)維之a(chǎn)nsible
****playbook基礎(chǔ)語法****
playbook使用了YAML格式的語法,該語法還是相當(dāng)簡(jiǎn)單的,可以體驗(yàn)出程序構(gòu)造或執(zhí)行的過程。那么還是具體查看簡(jiǎn)單的一個(gè)實(shí)例!
在docker服務(wù)器組使用root用戶執(zhí)行更新源命令,如下:
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "初始化更新源列表"
command: apt-get update
語法注意:"-"以及":"后面都需要一個(gè)空格。
語法已經(jīng)主意了吧~~~該注意該注意的內(nèi)容了,從上面的實(shí)例額可以看出有兩個(gè)必須的屬性,那就是服務(wù)器主機(jī)hosts以及遠(yuǎn)程用戶remote_user,有了它們就可以干點(diǎn)其它事了tasks,自然而然在playbook執(zhí)行任務(wù)是需要通過模塊的來操控的。
使用命令檢查yaml的語法
ansible-playbook main.yml --syntax-check

****playbook模塊化task****
(⊙v⊙)嗯~~~模塊化的理論就不一一說明了,實(shí)踐通過時(shí)間來領(lǐng)悟理論精華。該是動(dòng)手的時(shí)候了!
- command
# 在docker服務(wù)器組執(zhí)行一條命令
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "初始化更新源列表"
command: apt-get update
說明:name的屬性就是一個(gè)任務(wù)的昵稱,自定義。
- shell
# 在docker服務(wù)器組執(zhí)行shell命令
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "刪除/home/alic/demo.sh"
shell: rm -f /home/alic/demo.sh
- script
# 在docker服務(wù)器組執(zhí)行控制節(jié)點(diǎn)本地的shell腳本
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "被控節(jié)點(diǎn)執(zhí)行控制節(jié)點(diǎn)的shell腳本"
script: ../scripts/alic.sh

- copy
# 將控制節(jié)點(diǎn)的文件上傳到docker服務(wù)器【被控節(jié)點(diǎn)】上
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "控節(jié)點(diǎn)文件cp到被控制節(jié)點(diǎn)服務(wù)器"
copy:
src=/etc/ansible/hosts
dest=/etc/ansible/hosts
owner=root
group=root
mode=0644
注意:src代表控制節(jié)點(diǎn)路徑,dest代表被控節(jié)點(diǎn)路徑,其它的為可選項(xiàng)目,顧名思義。
- yum
# 在docker用戶組以root用戶安裝vim編輯器
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "我正在在centOS安裝vim呢~~~"
yum: name=vim state=latest
說明:name為安裝某某的名稱,state則為安裝的版本,yum該模塊僅僅適合contOS相似的發(fā)行版,對(duì)于ubuntu呢,還是推薦使用原生的bash咯~~~
- service
# 在docker用戶組以root用戶重啟apache2
- hosts: docker
remote_user: root
gather_facts: True
tasks:
- name: "我正在啟動(dòng)apache2服務(wù)器~~~"
service: name=apache2 state=restarted
說明:service的狀態(tài)與我們平常使用的多了-ed stsrted stoped restarted
- notify 與 handlers
使用一句英文更好地闡述兩者的關(guān)系
The things listed in the notify
section of a task are called handlers.
還是說一下中文吧~~~
notify是一個(gè)通知,實(shí)質(zhì)上也是一個(gè)任務(wù),不同的是使用handlers定義的任務(wù),handlers里面定義的任務(wù)相當(dāng)于定義方法,提高復(fù)用性!
- hosts: docker
remote_user: root
tasks:
- name: "test notify"
shell: ls
notify:
- restart apache2
handlers:
- name: restart apache2
service: name=apache2 state=restarted
- vars
先說明一下,很明顯vars模塊用戶聲明變量
# vars 變量的定義與使用
- hosts: docker
remote_user: root
vars:
config_path: "/root/application/sise.conf"
tasks:
- name: "test notify"
command: touch {{config_path}}
然而說到變量還可以這樣使用:在yml使用變量,在執(zhí)行playbook命令是額外賦值,注意記得加上引號(hào) "{{var}}"
ansible-playbook main.yml --extra-vars hosts=docker
hosts: "{{hosts}}"
remote_user: root
vars:
- dir_name: "public"
tasks:
- name: create dir
shell: mkdir {{dir_name}}

- when
(⊙o⊙)嗯~~~,when在運(yùn)維時(shí)是一個(gè)重點(diǎn),不同Linux的發(fā)行版呢,有些命令就不一樣,但都是了解到了條件即可switch地處理。好比如yum只有centOS,RedHat等發(fā)行版才具有的包管理命令工具
重點(diǎn):when主要用于處理不同的操作系統(tǒng)與處理邏輯上。
- hosts: docker
remote_user: root
tasks:
- name: "我正在紅帽子安裝vim呢~~~"
yum: name=vim state=latest
when: ansible_os_family == "RedHat"
- with_items
# 便利迭代 + when
- hosts: docker
remote_user: root
tasks:
- command: echo {{ item }}
with_items: [ 0, 2, 4, 6, 8, 10 ]
when: item > 5

****Tips and Tricks For Ansible-book Command****
1 查看任務(wù)所指定的host列表
$ ansible-playbook main.yml --list-hosts

2 If you need to specify a password to sudo, run ansible-playbook
with --ask-pass
or when using the old sudo syntax --ask-sudo-pass
即當(dāng)你使用普通用戶執(zhí)行命令需要輸入密碼時(shí)可使用
$ ansible-playbook main.ym --ask-sudo-pass --ask-pass

3 獲取docker server-group主機(jī)的所有基本信息
既然可以獲取主機(jī)信息 當(dāng)時(shí)用when的時(shí)候,該命令就其很大作用了!
$ ansible docker -m setup

4 直接通過ansible-playbook命令來指定主機(jī)
$ ansible-playbook playbook.yml --limit docker
嘿嘿~~~這個(gè)野蠻好的( ⊙o⊙ )哇,有時(shí)候我想在某臺(tái)服務(wù)器搭建nginx的話,task只寫好模板,需要的服務(wù)器就在執(zhí)行命令指定host或服務(wù)器組即可!
****Demo實(shí)踐目錄樹****

自動(dòng)化運(yùn)維之a(chǎn)nsible
****價(jià)值源于技術(shù),貢獻(xiàn)源于分享****