環境準備
# 創建一個叫web的文件夾并進入(相當于新建一個工作目錄)[lyk@controller ~]$ mkdir web && cd web?# 創建Ansible的配置文件ansible.cfg[lyk@controller web]$ cat > ansible.cfg <<'EOF'[defaults]remote_user = lykinventory = ./inventory?[privilege_escalation]become = Truebecome_user = rootbecome_method = sudobecome_ask_pass = FalseEOF?[lyk@controller web]$ cat > inventory <<'EOF'controllernode1node2node3node4EOF
Ansible 角色(把重復任務打包成 “模塊”)
# 用ansible-galaxy創建一個叫lyk的角色(生成標準化的目錄結構)[lyk@controller web 11:28:45]$ ansible-galaxy init lyk- Role lyk was created successfully?[lyk@controller web 11:30:29]$ sudo yum install -y tree[lyk@controller web 11:31:09]$ tree lyklyk├── defaults│?? └── main.yml├── files├── handlers│?? └── main.yml├── meta│?? └── main.yml├── README.md├── tasks│?? └── main.yml├── templates├── tests│?? ├── inventory│?? └── test.yml└── vars└── main.yml?
Ansible 角色目錄位置
默認role使用以下三個目錄:
~/.ansible/roles
/usr/share/ansible/roles
/etc/ansible/roles
優先級從上到下依次降低。
可以在ansible.cfg配置文件[defaults]塊中通過變量roles_path定義role位置:
[defaults]roles_path ?= ./roles......
多個路徑使用冒號分隔:
roles_path = /etc/ansible/roles:/home/student/web/roles
創建角色
# 創建一個存放角色的文件夾roles[lyk@controller web]$ mkdir roles?# 創建一個叫apache的角色(用來部署apache服務)[lyk@controller web]$ ansible-galaxy init apache- apache was created successfully?# 把apache角色移到roles文件夾(方便統一管理)[lyk@controller web]$ mv apache/ roles?# 也可以直接使用以下命令將角色放置到指定目錄(一步到位)[lyk@controller web]$ ansible-galaxy init apache --init-path=./roles?# 查看角色列表[lyk@controller web]$ ansible-galaxy list# /home/student/web/roles- apache, (unknown version)[lyk@controller web]$ cd roles/apache/?
從tasks開始,tasks/main.yml內容如下:
---# tasks file for apache- name: install webyum:name: "{{ web_package }}"state: latest?- name: "start {{ web_service }}"service:name: "{{ web_service }}"state: startedenabled: yes?- name: prepare motdtemplate:src: motd.j2dest: /etc/motd?- name: prepare lyk sitetemplate:src: lyk.conf.j2dest: /etc/httpd/conf.d/lyk.confnotify:- restart_web?- name: prepare DocumentRoot file:path: "/var/www/html/{{ ansible_hostname }}" state: directory?- name: prepare index.htmltemplate:src: index.html.j2dest: "/var/www/html/{{ ansible_hostname }}/index.html"--定義了部署 apache 的步驟:安裝軟件、啟動服務、生成歡迎頁、配置虛擬主機等。--比如:name: install web 是 “安裝 web 軟件”,yum模塊用來裝軟件,service模塊用來啟動服務。
defaults/main.yml 內容如下:
---# defaults file for apacheweb_package: httpdweb_service: httpd??--定義了web_package: httpd(要安裝的軟件名是 httpd)、web_service: httpd(服務名是 httpd)。--好處是:如果以后要換軟件(比如 nginx),改這里的變量就行,不用改任務列表。
templates/motd.j2 內容如下:
hello guys!Welcome to {{ ansible_fqdn }}!??--motd.j2:登錄提示模板,{{ ansible_fqdn }}會自動替換成主機名(比如 node1.lyk.cloud);?
templates/lyk.conf.j2 內容如下:
# {{ ansible_managed }} <VirtualHost *:80>ServerAdmin lyk@{{ ansible_fqdn }}ServerName {{ ansible_fqdn }}ErrorLog logs/{{ ansible_hostname }}-error.logCustomLog logs/{{ ansible_hostname }}-common.log commonDocumentRoot /var/www/html/{{ ansible_hostname }}/<Directory /var/www/html/{{ ansible_hostname }}/>Options +Indexes +FollowSymlinks +IncludesOrder allow,denyAllow from all</Directory> </VirtualHost>--lyk.conf.j2:apache 虛擬主機配置模板,自動生成對應主機的網站配置;
templates/index.html.j2 內容如下:
Welcome to {{ ansible_fqdn }} !--index.html.j2:網頁首頁模板,顯示 “Welcome to 主機名”。
handlers/main.yml 內容如下:
--- # handlers file for apache - name: restart_webservice:name: "{{ web_service }}"state: restarted--定義了restart_web(重啟 web 服務),當虛擬主機配置文件修改后,會自動觸發這個操作(通過notify: - restart_web調用)。
meta/main.yml 內容如下:
--- galaxy_info:author: lykdescription: lyk webcompany: lyk worldlicense: license (GPLv2, CC-BY, etc)min_ansible_version: 2.4platforms:- name: Fedoraversions:- all- 25- name: SomePlatformversions:- allgalaxy_tags: [apache,web] dependencies: []--記錄角色作者、支持的系統版本等信息(類似 “說明書”)
調用角色(用 playbook 執行角色)
[lyk@controller apache 11:52:16]$ vim playbook.yml[lyk@controller web 11:54:10]$ curl http://node2/ Welcome to node2.lyk.cloud !
系統角色(用現成的 “官方模塊”)
# 安裝系統自帶的角色(比如時間同步、防火墻等預定義角色) [lyk@controller web 13:31:28]$ sudo yum install -y rhel-system-roles # 查看系統角色的位置(這些是現成的,不用自己寫) [lyk@controller web 13:38:58]$ ls -1 /usr/share/ansible/roles/# 修改ansible.cfg,讓Ansible能找到系統角色 [lyk@controller web 13:46:30]$ vim ansible.cfg 1 [defaults] 2 remote_user = lyk 3 inventory = ./inventory 4 roles_path = ./roles:/usr/share/ansible/roles/ 5 6 [privilege_escalation] 7 become = True 8 become_user = root 9 become_method = sudo 10 become_ask_pass = False # 編輯playbook,用系統角色同步所有主機的時間 [lyk@controller web 13:48:16]$ vim playbook.yml 1 - name: Manage timesync with servers2 hosts: all 3 vars: 4 timesync_ntp_servers: 5 - hostname: ntp.aliyun.com6 iburst: true 7 roles: 8 - rhel-system-roles.timesync --簡單說:系統角色是別人寫好的 “現成工具”,比如時間同步角色,不用自己寫任務,直接配置變量就能用,省時省力
負載均衡(用角色部署 haproxy 實現多機分流)
# 查看如何搜索Ansible角色(幫助命令) [lyk@controller web 14:08:47]$ ansible-galaxy role search --help# 搜索作者geerlingguy的角色(他是Ansible社區知名作者,角色質量高) [lyk@controller web 14:09:13]$ ansible-galaxy role search --author geerlingguy # 安裝他的haproxy角色(負載均衡工具),放在當前roles目錄 [lyk@controller web 14:16:20]$ ansible-galaxy role install geerlingguy.haproxy --roles-path ./roles# 重命名角色(把長名字改成haproxy,方便引用) [lyk@controller web 14:18:02]$ mv roles/geerlingguy.haproxy/ roles/haproxy# 也可以從本地文件安裝角色(比如離線環境) [lyk@controller web 14:13:27]$ ansible-galaxy install http://192.168.42.100/%E8%BD%AF%E4%BB%B6/ansible-role-haproxy-1.3.1.tar.gz# 查看已安裝的角色 [lyk@controller web 14:19:01]$ ls roles/ ansible-role-haproxy-1.3.1 apache haproxy# 下載haproxy角色的說明文檔(README.md)到本地查看(sz是上傳下載命令) [lyk@controller web 14:22:37]$ sz roles/haproxy/README.md # 編輯主機列表,把主機分組(LBs是負載均衡服務器,WEBs是網頁服務器) [lyk@controller web 14:24:59]$ vim inventory 1 [LBs]2 controller # controller作為負載均衡器3 4 [WEBs]5 node[1:4] # node1到node4作為網頁服務器# 編輯playbook,部署負載均衡和網頁服務 [lyk@controller web 14:26:17]$ vim playbook.yml 1 - name: deploy LB #部署負載均衡器2 hosts: LBs # 在負載均衡服務器(controller)上執行3 vars: # 配置后端網頁服務器(node1到node4)4 haproxy_backend_servers:5 - name: node16 address: 10.1.8.11:80 # node1的IP和端口7 - name: node28 address: 10.1.8.12:809 - name: node310 address: 10.1.8.13:8011 - name: node412 address: 10.1.8.14:8013 roles:14 - haproxy # 調用haproxy角色部署負載均衡15 - name: deploy apache #部署網頁服務16 hosts: WEBs # 在網頁服務器(node1-4)上執行17 roles:18 - apache # 調用之前的apache角色部署網頁服務# 在node1上關閉可能占用80端口的nginx,啟動httpd(確保網頁服務正常) [root@node1 ~ 14:39:46]# systemctl stop nginx.service [root@node1 ~ 14:39:54]# systemctl start httpd [root@node1 ~ 14:40:04]# systemctl status httpd ● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: active (running) since 二 2025-08-19 14:37:14 CST; 2min 58s ago# 執行playbook,部署負載均衡和網頁服務 [lyk@controller web 14:40:18]$ ansible-playbook playbook.yml # 測試負載均衡效果:訪問controller(負載均衡器),會輪流顯示node1-4的網頁 [lyk@controller web 14:40:33]$ curl http://controller/ Welcome to node2.lyk.cloud ! [lyk@controller web 14:41:35]$ curl http://controller/ Welcome to node3.lyk.cloud ! [lyk@controller web 14:41:37]$ curl http://controller/ Welcome to node4.lyk.lyk.cloud ! [lyk@controller web 14:41:38]$ curl http://controller/ Welcome to node1.lyk.cloud !
簡單說:負載均衡就是 “分流”,用戶訪問 controller(負載均衡器)時,會自動分配到 node1-4 中的一個,避免單臺服務器壓力太大。這里用現成的 haproxy 角色快速實現,不用自己寫負載均衡配置。
總結
整個過程就是:用 Ansible 角色把重復的部署任務(比如裝 apache、配置負載均衡)打包成 “模塊”,然后通過 playbook 在指定主機上調用這些模塊,實現批量、自動化部署。角色的好處是 “一次編寫,多次使用”,大大簡化了復雜環境的管理。