一、ansible中playbook(劇本)
官方文檔:
Ansible playbooks — Ansible Community Documentation
1、playbook的基本結構
一個基本的playbook由以下幾個主要部分組成
hosts: 定義要執行任務的主機組或主機。
become: 是否需要使用超級用戶權限(如 sudo)。
vars: 在 Playbook 中定義變量。tasks: 任務列表,指定要執行的操作。
注:playbook:由一個play或者多個play組成,一個paly可以包含多個task任務
ansible中playbook的文件結尾是.yml格式后綴
示例:
---
- name: Playbook名稱hosts: 主機組become: true # 是否需要使用管理員權限(sudo)vars: # 可選部分,定義變量variable_name: valuetasks: # 任務列表- name: 任務1名稱module_name: # Ansible模塊名稱parameter1: value1parameter2: value2- name: 任務2名稱module_name:parameter1: value1name: Playbook或Play的名稱,通常用于描述Playbook的作用。
hosts: 要運行任務的主機組。可以是inventory中定義的主機組,也可以是單個主機(如localhost)
become: 設為true時,任務將以管理員權限(sudo)執行。
vars: 定義變量,在Playbook中全局可用。
tasks: 包含一個或多個任務,每個任務由名稱和模塊組成。每個任務都會通過特定的模塊來執行指定的操作。
2、安裝和啟動nginx
[master-61 root ~/playbook] # cat nginx.yml
---
- name: install nginxhosts: webbecome: truetasks:- name: install nginxyum:name: nginxstate: present- name: start nginxservice:name: nginxstate: startedenabled: true
?在執行playbook腳本時報錯了如下:
web7主機出現系統的文件系統被掛載為只讀模式,導致沒法執行yml腳本
解決方法:登錄上web-7主機,將文件系統重新掛載為讀寫模式
檢查文件系統的掛載狀態,確認是否為只讀模式
[web-7 root ~] # mount | grep ' / '
/dev/mapper/centos-root on / type xfs (ro,relatime,attr2,inode64,noquota)ro 表示只讀,這就意味著文件系統被掛載為只讀模式重新掛載為讀寫模式,重新掛載根文件系統(/)為讀寫模式
[web-7 root ~] # mount -o remount,rw /
[web-7 root ~] # df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 979M 0 979M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.5M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/mapper/centos-root 37G 2.1G 35G 6% /
/dev/sda1 1014M 140M 875M 14% /boot
tmpfs 199M 0 199M 0% /run/user/0
[web-7 root ~] # ls /root/
anaconda-ks.cfg .bash_history .bash_profile .cshrc .pki/ .tcshrc
.ansible/ .bash_logout .bashrc network.sh .ssh/ .viminfo
重新執行playbook
先執行命令檢查一下是否正常
[master-61 root ~/playbook] # ansible-playbook -C nginx.yml PLAY [install nginx] **********************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
執行劇本
[master-61 root ~/playbook] # ansible-playbook nginx.yml PLAY [install nginx] **********************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.7]TASK [install nginx] **********************************************************************************
changed: [172.16.1.7]TASK [start nginx] ************************************************************************************
changed: [172.16.1.7]PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
驗證web-7機器是否安裝啟動成功
二、ansible中roles角色
1、roles介紹
roles相當于是在ansible中playbooks的目錄組織結構。它可以將任務(tasks)、變量(vars)、文件(files)、模板(templates)、處理器(handlers)、默認值(defaults)、以及其他資源分組到一個單獨的目錄中,提升代碼的可維護性。
2、roles目錄結構如下
my_role/
├── defaults/
│ └── main.yml # 默認變量
├── files/ # 存放靜態文件
├── handlers/
│ └── main.yml # 任務完成后的處理器
├── meta/
│ └── main.yml # 角色的元數據,例如依賴關系
├── tasks/
│ └── main.yml # 主要的任務文件
├── templates/ # 存放 Jinja2 模板文件
├── tests/
│ └── test.yml # 測試腳本
└── vars/└── main.yml # 存放變量
每個目錄的用途如下:
defaults/main.yml:定義角色的默認變量,變量值可以被 Playbook 或其它角色覆蓋。
files/:存放一些靜態的文件,可以通過 copy 或 template 模塊來部署到目標主機。
handlers/main.yml:用于定義觸發特定條件時執行的處理器。通常是服務的重啟、重載等操作。
meta/main.yml:描述角色的元數據,如角色的依賴關系、作者信息等。
tasks/main.yml:包含角色的任務,定義了這個角色執行的具體工作。
templates/:存放 Jinja2 模板文件。你可以在角色中使用模板來動態生成文件。
tests/test.yml:用于測試角色是否正常工作,通常會包含一些驗證任務,確保角色行為符合預期。
vars/main.yml:存放角色的變量,這些變量在 Playbook 中可以覆蓋。
3、創建roles角色
命令:ansible-galaxy init 角色名
(11:04:31)[master-61 root /etc/ansible/roles] # ansible-galaxy init my_role
- Role my_role was created successfully
(11:04:35)[master-61 root /etc/ansible/roles] #
(11:04:38)[master-61 root /etc/ansible/roles] # tree my_role/
my_role/
├── defaults
│?? └── main.yml
├── files
├── handlers
│?? └── main.yml
├── meta
│?? └── main.yml
├── README.md
├── tasks
│?? └── main.yml
├── templates
├── tests
│?? ├── inventory
│?? └── test.yml
└── vars└── main.yml8 directories, 8 files
4、使用roles角色
roles角色的執行流程:
定義tasks任務?--> 定義jinja2模板,作為配置文件用 --> 定義變量 --> 定義觸發 --> 定義roles的yml文件 -->檢查yml語法 --> 執行roles.yml文件 --> 查看nginx服務啟動狀態
4.1定義任務,在task/main.yml文件中定義任務
(14:45:56)[master-61 root /etc/ansible/roles/nginx] # cat tasks/main.yml ---
- name: "Install wget"yum:name: "wget"state: "present"- name: "Download nginx package"get_url:url: "http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.18.0-1.el7.ngx.x86_64.rpm"dest: "/etc/ansible/roles/nginx/files/"
- name: "Copy nginx package to /tmp"copy:src: "nginx-1.18.0-1.el7.ngx.x86_64.rpm"dest: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"- name: "Install nginx from rpm package"yum:name: "/tmp/nginx-1.18.0-1.el7.ngx.x86_64.rpm"state: "latest"- name: "Configure nginx"template:src: "nginx.conf.j2"dest: "/etc/nginx/nginx.conf"tags:- "nginxconf"notify:- "Reload nginx configuration"- name: "Start nginx service"service:name: "nginx"state: "started"enabled: true
4.2?定義templates生成配置文件
(16:23:43)[master-61 root /etc/ansible/roles/nginx] # cat templates/nginx.conf.j2
user nginx; # 設置 Nginx 服務的系統使用用戶
worker_processes {{ ansible_processor_vcpus }}; # 工作進程數error_log /var/log/nginx/error.log warn; # Nginx 的錯誤日志
pid /var/run/nginx.pid; # Nginx 啟動時的 PIDevents {worker_connections 1024; # 每個進程允許的最大連接數
}http { # HTTP 請求配置,一個 http 可以包含多個 serverinclude /etc/nginx/mime.types; # 定義 Content-Typedefault_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main; # 訪問日志sendfile on; # 高效文件傳輸keepalive_timeout 65; # 客戶端與服務端的超時時間server { # HTTP 服務,一個 server 可以配置多個 locationlisten {{ nginx_config.nginx_port }}; # 服務監聽端口server_name localhost; # 主機名、域名location / {root /usr/share/nginx/html; # 頁面存放目錄index index.html index.htm; # 默認頁面}error_page 500 502 503 504 /50x.html; # 錯誤頁面重定向location = /50x.html {root /usr/share/nginx/html; # 頁面存放的目錄}}include /etc/nginx/conf.d/*.conf; # 包含其他配置文件
}
4.3定義變量,在vars/main.yml文件中定義變量
(14:49:48)[master-61 root /etc/ansible/roles/nginx] # vim vars/main.yml
---
nginx_config:nginx_port:888
4.4?定義觸發
(16:25:55)[master-61 root /etc/ansible/roles/nginx] # cat handlers/main.yml
---
- name: reload new config service: name: nginxstatr: restarted
4.5定義劇本文件
(16:26:42)[master-61 root /etc/ansible/roles/nginx] # cat roles.yml
- hosts: webremote_user: rootroles: - nginx
4.6?檢查yml文件語法是否正確,如果報錯需要檢查對應配置文件
(16:27:11)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook --syntax-check roles.yml playbook: roles.yml
4.7?執行roles.yml文件
(10:48:31)[master-61 root /etc/ansible/roles/nginx] # ansible-playbook roles.yml PLAY [web] ********************************************************************************************TASK [Gathering Facts] ********************************************************************************
ok: [172.16.1.8]
ok: [172.16.1.7]TASK [nginx : Install wget] ***************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Download nginx package] *************************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Install nginx from rpm package] *****************************************************************
ok: [172.16.1.7]
ok: [172.16.1.8]TASK [Configure nginx] ********************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]TASK [Start nginx service] ****************************************************************************
changed: [172.16.1.7]
changed: [172.16.1.8]PLAY RECAP ********************************************************************************************
172.16.1.7 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.8 : ok=6 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
4.8 檢查服務啟動狀態
web-7和web-8中nginx服務都正常啟動
網頁訪問也正常