您好,登錄后才能下訂單哦!
1.使用playbook有什么好處
2.認識playbook(自動部署nginx)(自動部署docker-ce社區(qū)版)
3.YAML語法
4.playbook文件結(jié)構(gòu)
5.在變更時執(zhí)行操作(handlers)
6.任務(wù)控制(tags)
7.playbook文件調(diào)試
8.案例:自動部署tomcat
9.Playbook變量定義與使用
10.playbok文件復(fù)用
11.流程控制
12.jinja模版渲染配置文件
1. 使用playbook有什么好處
Ansible真正的能力在于使用playbook,也就稱為劇本
當(dāng)我們在某個目錄下執(zhí)行某個命令的時候,那么我們可以使用ansible的ad hoc的模式快速執(zhí)行,而無不虛編寫文件或者劇本,但是對于配置的管理和應(yīng)用的部署,通常有很多的操作,單獨的去寫ad hoc命令麻煩很多,而且ad hoc適用于簡單命令的執(zhí)行,所以我們使用playbook去完成,如果ansible是工作中用到的工具,那么ploybook就是相當(dāng)于你使用ansible的說明書,而你的主機就是原材料,寫playbook就像寫說明書一樣,它是一個按順序執(zhí)行的一個過程,playbook和ad hoc完全不是一種模式,并且功能強大
Playbook的特點易讀的編排語言:它是用最主流的yaml格式去編寫的來實現(xiàn)應(yīng)用的編排,非常適合配置和應(yīng)用部署,也非常適合部署復(fù)雜的任務(wù),我們可以通過聲明式的內(nèi)容將復(fù)雜的工作通過playbook進行編排。
這個—syntax-check是檢查playbook的語法
[root@ansible playbook-test]# ansible-playbook nginx.yaml --syntax-check
playbook: nginx.yaml
[root@ansible playbook-test]# vim nginx.yaml
[root@ansible playbook-test]# cat nginx.yaml
---
- hosts: webservers
vars:
hello: Ansible
tasks:
- name: Add repo
yum_repository:
name: nginx
description: nginx repo
baseurl: http://nginx.org/packages/centos/7/$basearch/
gpgcheck: no
enabled:
- name: Install nginx
yum:
name: nginx
state: latest
- name: Copy nginx configuration file
copy:
src: ./site.conf
dest: /etc/nginx/conf.d/site.conf
- name: Start nginx
service:
name: nginx
state: started
- name: Create wwwroot directory
file:
dest: /var/www/html
state: directory
- name: Create test page index.html
shell: echo "hello {{hello}}" > /var/www/html/index.html
[root@ansible playbook-test]# ls
nginx.yaml site.conf
[root@ansible playbook-test]# vim site.conf
server {
listen 80;
server_name devops;
location / {
root /var/www/html;
index index.html; }
}
執(zhí)行playbook[root@ansible playbook-test]# ansible-playbook nginx.yaml
查看進程已經(jīng)啟動
[root@ansible playbook-test]# ansible webservers -m shell -a "ps -ef |grep nginx"
10.4.7.22 | SUCCESS | rc=0 >>
root 10713 1 0 16:46 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 10714 10713 0 16:46 ? 00:00:00 nginx: worker process
root 10849 10848 10 16:49 pts/1 00:00:00 /bin/sh -c ps -ef |grep nginx
root 10851 10849 0 16:49 pts/1 00:00:00 grep nginx
10.4.7.21 | SUCCESS | rc=0 >>
root 10953 1 0 16:46 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 10954 10953 0 16:46 ? 00:00:00 nginx: worker process
root 11088 11087 0 16:49 pts/1 00:00:00 /bin/sh -c ps -ef |grep nginx
root 11090 11088 0 16:49 pts/1 00:00:00 grep nginx
批量部署docker-ce社區(qū)版
這里運用的模塊就shell模塊和service,還是很簡單的。
---
- hosts: webservers
gather_facts: no
remote_user: root
tasks:
- name: install packages
shell: yum -y install yum-utils device-mapper-persistent-data lvm2
- name: docker packages
shell: wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- name: install docker-ce
shell: yum -y install docker-ce
- name: daocloud speed up
shell: curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
- name: systemctl start docker
service: name=docker state=started
測試查看是否安裝成功
[root@ansible ~]# ansible webservers -m shell -a "docker -v"
10.4.7.21 | SUCCESS | rc=0 >>
Docker version 19.03.5, build 633a0ea
10.4.7.22 | SUCCESS | rc=0 >>
Docker version 19.03.5, build 633a0ea
YAML語法格式
縮進表示層級關(guān)系
不支持制表符“tab” 縮進
通常開頭縮進2個空格
字符后縮進1個空格,如冒號,逗號等
“---”表示YAML格式,一個文件的開頭
“#”注釋
在變更時執(zhí)行操作(handlers)處理器
主要用于當(dāng)你出來某個操作變更時,它幫你觸發(fā)另一個任務(wù)
自動部署tomcat
1. 安裝jdk
2. 下載tomcat包
3. 解壓tomcat
4. 啟動
安裝tomcat
---
- hosts: webservers
gather_facts: no
vars:
tomcat_version: 9.0.29
tomcat_install_dir: /usr/local
tasks:
- name: Install java-1.8.0-openjdk.x86_64
shell: yum -y install java-1.8.0-openjdk.x86_64 state=present
- name: Download tomcat
get_url: url=http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.29/bin/apache-tomcat-9.0.29.tar.gz dest=/tmp
- name: Unarchive tomcat-{{ tomcat_version }}.tar.gz
unarchive:
src: /tmp/apache-tomcat-{{ tomcat_version }}.tar.gz
dest: "{{ tomcat_install_dir }}"
copy: no
- name: Start tomcat
shell: cd {{ tomcat_install_dir }} &&
mv apache-tomcat-{{ tomcat_version }} tomcat8 &&
cd tomcat8/bin && nohup ./startup.sh &
[root@ansible tomcat-playbook]# ansible-playbook tomcat.yaml
[root@ansible tomcat-playbook]# ansible webservers -m shell -a "ps -ef |grep tomcat"
Playbook變量定義與使用
命令行定義變量
列出主要的變量信息
[root@ansible tomcat-playbook]# ansible-playbook --list-tags tomcat.yaml
playbook: tomcat.yaml
play #1 (webservers): webservers TAGS: []
TASK TAGS: []
[root@ansible tomcat-playbook]# ansible-playbook --list-tasks tomcat.yaml
playbook: tomcat.yaml
play #1 (webservers): webservers TAGS: []
tasks:
Install java-1.8.0-openjdk.x86_64 TAGS: []
Download tomcat TAGS: []
Unarchive tomcat-{{ tomcat_version }}.tar.gz TAGS: []
Start tomcat TAGS: []
debug模塊在執(zhí)行期間打印語句,并且可用于調(diào)試變量或表達式,而不必停止playbook。
[root@ansible tomcat-playbook]# vim 1.yaml
---
- hosts: webservers
gather_facts: no
remote_user: root
tasks:
- name: test var
debug: msg="{{work_dir}}"
[root@ansible tomcat-playbook]# ansible-playbook 1.yaml -e work_dir=/usr/local
定義這個變量也有一定的要求,變量名是要以字母為開頭
還有一種在inventory中定義
在/etc/ansible/hosts去定義變量,為一組主機或者多個主機傳遞不同的變量
也可以單獨寫到/etc/ansible/group_vars/webservers.yml下,它默認會讀取你哪個組里面的變量,以yml的模式更方便
http_port: 8090
server_name: xiabanle
[root@ansible group_vars]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
8090
10.4.7.21 | SUCCESS | rc=0 >>
8090
[root@ansible group_vars]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
xiabanle
10.4.7.21 | SUCCESS | rc=0 >>
xiabanle
在playbook使用debug模塊去定義變量
---
- hosts: webservers
gather_facts: no
remote_user: root
vars:
- work_dir: /usr/local
- nginx_version: 1.16
tasks:
- name: Install nginx
debug: msg="{{work_dir}}/nginx/{{nginx_version}}"
[root@ansible tomcat-playbook]# ansible-playbook 1.yaml --syntax-check
playbook: 1.yaml
[root@ansible tomcat-playbook]# ansible-playbook 1.yaml
使用file模塊創(chuàng)建文件
---
- hosts: webservers
gather_facts: no
remote_user: root
vars:
- work_dir: /opt
- nginx_version: 1.11
tasks:
- name: create dir
file: "dest={{work_dir}}/nginx/{{nginx_version}} state=directory"
注冊變量—register
注冊變量就是將你某個任務(wù)執(zhí)行的結(jié)果保存到一個變量中,這樣的話就是能動態(tài)的獲取一個變量,例如執(zhí)行完一個任務(wù),返回有個狀態(tài),那么希望根據(jù)這個狀態(tài)異步處理,因為之前的變量由于對應(yīng)好了,很難知道這次獲取的什么變量。
這里有個debug就是專門調(diào)試變量用的,這里時創(chuàng)建文件的同時動態(tài)定義文件的時間
一般這種就是啟動兩個服務(wù),這兩個服務(wù)是有依賴關(guān)系的,只有啟動第一個服務(wù),第二個才能啟動起來,那這種情況下,就可以在啟動服務(wù)下加一個注冊變量,如果第一個服務(wù)啟動的時候會有pid,或者有其他的輸出然后用到定義的注冊變量。
---
- hosts: webservers
gather_facts: no
remote_user: root
vars:
- work_dir: /opt
tasks:
- name: register var
command: date +"%F %T"
register: datetime
- name: touch file
#debug: msg={{datetime}}
file: dest=/tmp/r_{{datetime.stdout}} state=touch
系統(tǒng)信息變量(fasts)
以系統(tǒng)變量調(diào)用主機名/主機IP并創(chuàng)建文件
這個可以通過set up去調(diào)用,來查看我們的ansible的接口api
[root@ansible test]# ansible webservers -m setup
---
- hosts: webservers
gather_facts: yes
remote_user: root
tasks:
- name: touch file
file: dest=/tmp/devops_{{ansible_hostname}} state=touch
playbok文件復(fù)用
將我們的文件進行復(fù)用,可以使用playbook中的incloud_tasks和import_tasks導(dǎo)入進來,這樣的好處就是,當(dāng)我們?nèi)懸粋€比較大的playbook時,可以將它分解成很多小的任務(wù),分解成小的任務(wù)之后呢,就能在其他的地方引用,第二個好處就是能組織playbook這些功能模塊,如果要寫一個大的劇本,可能是上百行,就不太好維護管理了,所以就有了include_tasks和import_tasks的實現(xiàn)來完成這些需求
Include和import的區(qū)別
都是導(dǎo)入文件的
Include(動態(tài)):在運行時導(dǎo)入
? --list-tags, --list-tasks 不會顯示到輸出
? 不能使用notify觸發(fā)來自include內(nèi)處理程序名稱(handlers)
Import*(靜態(tài)) :在playbook解析時預(yù)先導(dǎo)入,就是在playbook之前提前把預(yù)先的就導(dǎo)入進來了,
? 不能與循環(huán)一起使用
? 將變量用于目標(biāo)文件或角色名稱時,不能使用inventory(主機/主機組等)中的變量
復(fù)用案例:
安裝lnmp/lnmt
只需要將—import調(diào)用使用的的那個yaml就可以了
vim lnmp.yaml
---
- import_playbook: nginx.yaml
- import_playbook: mysql.yaml
- import_playbook: php.yaml
vim nginx.yaml
---
- hosts: webservers
gather_facts: no
remote_user: root
tasks:
- name: Install nginx
debug: msg="install nginx ... "
[root@ansible web]# ansible-playbook lnmp.yaml
Import導(dǎo)入的是playbook,而include的是導(dǎo)入的任務(wù)文件
[root@ansible web]# ansible-playbook test.yaml
---
- hosts: webservers
gather_facts: no
remote_user: root
tasks:
- name: task1
debug: msg="test1"
- name: task2
debug: msg="test2"
但是部署的任務(wù)這個tasks,任務(wù)比較多時就可以進行分解,可以分成獨立的文件,例如有兩個任務(wù),我將第一個tasks分解成一個文件,第二個分解成一個文件用include再導(dǎo)入進去
vim test.yaml
---
- hosts: webservers
gather_facts: no
remote_user: root
tasks:
- include_tasks: task1.yaml
- include_tasks: task2.yaml
vim task1.yaml
---
- name: tasks1
debug: msg="test1"
vim task2.yaml
---
- name: tasks2
debug: msg="test2"
流程控制
循環(huán)
批量創(chuàng)建用戶/文件/拷貝文件也可以使用
- name: create file
file: path=/tmp/{{item}} state=touch
with_items:
- "1.txt"
- "2.txt"
- "3.txt"
- "4.txt"
執(zhí)行效果
[root@hdss7-200 test-roles]# ansible-playbook -i hosts site.yaml --tags nginx
PLAY [roles] ***************************************************************************************************
TASK [nginx : create file] *************************************************************************************
changed: [10.4.7.22] => (item=1.txt)
changed: [10.4.7.22] => (item=2.txt)
changed: [10.4.7.22] => (item=3.txt)
changed: [10.4.7.22] => (item=4.txt)
PLAY RECAP *****************************************************************************************************
10.4.7.22 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
常用循環(huán)語句:
比如拷貝文件
- name: copy html
copy: src=/tmp/{item}} dest=/tmp
with_items:
- "a.html"
- "b.html"
- "c.html"
或者通配符,像一些拷貝一些目錄的tar.gz的壓縮包的時候比如比較多的時候就會用到可以使用fileglob,或者item,進行for循環(huán),進行批量執(zhí)行,簡化操作步驟。
- name: copy html
copy: src={{item}} dest=/tmp
with_fileglob:
- "/tmp/*.html"
模版
比如部署一個應(yīng)用,nginx,etcd,這些都有自己的配置文件,就比如將nginx,虛擬主機的配置文件,渲染到我們的nginx上,就可以使用template,這個模塊就專門支持jr模版
這里定義j2的模版,然后拷貝這個文件過去進行渲染
[root@hdss7-200 test-roles]# cat /tmp/nginx.conf
{% set domain_name = domain %}
server {
listen 80;
server_name {{ domain_name }};
location / {
root /usr/share/html;
}
}
定義的變量,進行傳遞
[root@hdss7-200 test-roles]# cat group_vars/roles.yaml
domain: www.xxxxx.com
定義的任務(wù)類型
- name: vire hosts
template: src=/tmp/nginx.conf dest=/etc/nginx/conf.d/
比如再傳遞端口的變量,在jinja里使用ansible的變量之間{{ }}去使用
[root@hdss7-200 test-roles]# cat /tmp/nginx.conf
{% set domain_name = domain %}
server {
listen {{ http_port }};
server_name {{ domain_name }};
location / {
root /usr/share/html;
}
}
我在ansible去定義這個變量
[root@hdss7-200 test-roles]# cat group_vars/roles.yaml
domain: "www.maidi.com"
http_port: "80"
執(zhí)行成功會將使用j2的模版將我們的配置文件拷貝過來,我們通過j2的模版和ansible定義變量就可以渲染很多我們的功能和需求
[root@hdss7-22 conf.d]# cat nginx.conf
server {
listen 80;
server_name www.maidi.com;
location / {
root /usr/share/html;
}
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。