目錄
-
- 1. ansible執行方式
- 2. playbook中的變量的定義和引用
- 3. 引用變量
- 4. playbook
- 5. 第一觸發任務(handlers)
- 6. playbook中的循環
- 7. playbook中的判斷
1. ansible執行方式
通過ansible下發單個任務,這種執行方式:Ad-hoc,點對點!臨時任務,不複雜任務
1. mkdir httpd && cd httpd && vim httpd.yml -----建立目錄,進入目錄,編輯檔案
2. 讀取playbook檔案執行任務!字尾.yml或.yaml
3. ansible-playbook httpd.yml -----執行playbook檔案
4. ansible-playbook --syntax-check httpd.yml ----文法檢測
格式:
---
- hosts: webservers #主機組
tasks:
- name: "安裝apache"
yum: name=httpd state=latest
- name: "啟動apache"
service: name=httpd state=started enabled=yes
檢視ansible主機中遠端主機資訊
[[email protected] httpd]# ansible webservers --list-hosts
hosts (1):
192.168.179.131
修改任務傳回success顔色:
[[email protected] ~]# vim /etc/ansible/ansible.cfg -----編輯配置檔案
[colors]
ok=purple #改為紫色
2. playbook中的變量的定義和引用
定義變量:
在playbook檔案中可以使用vars元素來定義變量
==例如:定義一個名為port的變量,值為80==
---
- hosts: nginx
vars:
port: 80
3. 引用變量
在playbook的任何位置都可以引用變量,變量需要加{{}} 引用例如
---
- hosts: nginx
vars:
port: 80
tasks:
- name: "監聽端口{{ port }}"
shell: echo "{{ port }}"
## 在模闆檔案中引用變量
定義變量
---
- hosts: webservers
vars:
port: 8000
tasks:
- name: "發送檔案"
template: src=port.conf.j2 dest=/opt/port.conf
引用變量,編輯模闆檔案ort.conf.j2,通過template子產品變量讀入到模闆檔案中,并将檔案發送至被管理節點
# vim port.conf.j2
{{ port }}
我們也可以直接引用setup子產品的關鍵詞,當作變量,無需定義!
例如:
{{ ansible_hostname }}
4. playbook
給任務打标簽:
tags
一個任務可以擁有多個标簽
例子:
- name: "建立測試頁面"
shell: echo "nginx" > {{ ngx_root }}/index.html
tags:
- page
使用标簽:
[[email protected] ~]# ansible-playbook -t page nginx.yml
5. 第一觸發任務(handlers)
handlers:
handlers可以定義一些觸發任務,這些任務可以被其他任務引用!這些觸發任務隻會在引用的任務有更改時執行!
handlers定義的觸發任務,一般要寫到檔案的末尾!在其他任務中通過(notiy: 觸發任務名稱)引用
例子:
tasks:
- name: "推送模闆配置檔案"
template: src=nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf
tags:
- config-nginx
notify: reload-nginx
handlers:
- name: "reload-nginx"
shell: /usr/local/nginx/sbin/nginx -s reload
案例1
源碼部署nginx的playbook檔案内容,僅供參考
---
- hosts: webservers
vars:
ngx_root: /html
ngx_port: 8000
ngx_user: www
tasks:
- name: "安裝依賴環境"
yum: name=gcc,pcre-devel,openssl-devel state=latest
- name: "分發nginx源碼安裝包"
unarchive: src=nginx-1.18.0.tar.gz dest=/root/
- name: "安裝nginx"
shell: cd /root/nginx-1.18.0 && ./configure && make && make install
- name: "啟動nginx"
shell: /usr/local/nginx/sbin/nginx
ignore_errors: True
- name: "推送模闆配置檔案"
template: src=nginx.conf.j2 dest=/usr/local/nginx/conf/nginx.conf
tags: config-nginx
notify: reload-nginx
- name: "建立運作使用者"
user: name={{ ngx_user }}
tags: config-nginx
- name: "建立網站根目錄"
file: path={{ ngx_root }} state=directory group={{ ngx_user }} owner={{ ngx_user }}
tags: config-nginx
- name: "建立測試頁面"
shell: echo "{{ ngx_root }}" > {{ ngx_root }}/index.html
tags:
- page
- config-nginx
handlers:
- name: "reload-nginx"
shell: /usr/local/nginx/sbin/nginx -s reload
6. playbook中的循環
---
- hosts:
tasks:
- name: "安裝lamp相關元件"
yum: name={{ item }} state=latest
with_items:
- php
- php-mysql
- php-gd
- mysql
- mysql-server
說明: item會依次等于php php-mysql php-gd mysql mysql-server,會循環執行5次
7. playbook中的判斷
用when來給任務添加條件,當滿足條件才能執行任務,不滿足的節點不執行
例子:
---
- hosts: webservers
tasks:
- name: "滿足主機名為:node-161,建立node-161.txt檔案"
file: path=/opt/node-161.txt state=touch
when: ansible_hostname == "node-161"
- name: "滿足主機名為:node-162,建立node-162.txt檔案"
file: path=/opt/node-162.txt state=touch
when: ansible_hostname == "node-162"