环境准备
# 创建一个叫web的文件夹并进入(相当于新建一个工作目录) [lyk@controller ~]$ mkdir web && cd web # 创建Ansible的配置文件ansible.cfg [lyk@controller web]$ cat > ansible.cfg <<'EOF' [defaults] remote_user = lyk inventory = ./inventory [privilege_escalation] become = True become_user = root become_method = sudo become_ask_pass = False EOF [lyk@controller web]$ cat > inventory <<'EOF' controller node1 node2 node3 node4 EOF
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 lyk lyk ├── 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 web yum: name: "{{ web_package }}" state: latest - name: "start {{ web_service }}" service: name: "{{ web_service }}" state: started enabled: yes - name: prepare motd template: src: motd.j2 dest: /etc/motd - name: prepare lyk site template: src: lyk.conf.j2 dest: /etc/httpd/conf.d/lyk.conf notify: - restart_web - name: prepare DocumentRoot file: path: "/var/www/html/{{ ansible_hostname }}" state: directory - name: prepare index.html template: src: index.html.j2 dest: "/var/www/html/{{ ansible_hostname }}/index.html" --定义了部署 apache 的步骤:安装软件、启动服务、生成欢迎页、配置虚拟主机等。 --比如:name: install web 是 “安装 web 软件”,yum模块用来装软件,service模块用来启动服务。
-
defaults/main.yml 内容如下:
--- # defaults file for apache web_package: httpd web_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.log CustomLog logs/{{ ansible_hostname }}-common.log common DocumentRoot /var/www/html/{{ ansible_hostname }}/ <Directory /var/www/html/{{ ansible_hostname }}/> Options +Indexes +FollowSymlinks +Includes Order allow,deny Allow 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_web service: name: "{{ web_service }}" state: restarted --定义了restart_web(重启 web 服务),当虚拟主机配置文件修改后,会自动触发这个操作(通过notify: - restart_web调用)。
-
meta/main.yml 内容如下:
--- galaxy_info: author: lyk description: lyk web company: lyk world license: license (GPLv2, CC-BY, etc) min_ansible_version: 2.4 platforms: - name: Fedora versions: - all - 25 - name: SomePlatform versions: - all galaxy_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 servers 2 hosts: all 3 vars: 4 timesync_ntp_servers: 5 - hostname: ntp.aliyun.com 6 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: node1 6 address: 10.1.8.11:80 # node1的IP和端口 7 - name: node2 8 address: 10.1.8.12:80 9 - name: node3 10 address: 10.1.8.13:80 11 - name: node4 12 address: 10.1.8.14:80 13 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 Server Loaded: 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 在指定主机上调用这些模块,实现批量、自动化部署。角色的好处是 “一次编写,多次使用”,大大简化了复杂环境的管理。