Ansible 角色管理

环境准备

 # 创建一个叫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 在指定主机上调用这些模块,实现批量、自动化部署。角色的好处是 “一次编写,多次使用”,大大简化了复杂环境的管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值