Ansible自动化运维实战3——变量分离、Roles 角色开发与 Git 托管分发实战

1 分离外部变量

1.1 外部加载变量文件

vars_files:在 playbook 中手动指定加载外部独立 YAML 变量文件

bash 复制代码
[devops@server1 ansible]$ vim user.yml
bash 复制代码
[devops@server1 ansible]$ vim userlist.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook user.yml

加密

bash 复制代码
[devops@server1 ansible]$ ansible-vault encrypt userlist.yml

加密后无法正常查看,可用指令ansible-vault view userlist.yml 输入密码进行查看

变量中加密,playbook 在运行时也必须询问密码

bash 复制代码
[devops@server1 ansible]$ ansible-playbook user.yml

解密

bash 复制代码
[devops@server1 ansible]$ ansible-vault decrypt userlist.yml

1.2 使用主机变量文件(host_vars)存放变量

结构如下图,每个主机都有对应的变量目录

bash 复制代码
playbook.yml
host_vars/
├── node1/
│   └── vars
└── server2/
    └── vars

可将 userlist 作为变量放在单独的目录下并进行加密

bash 复制代码
[devops@server1 ansible]$ mkdir host_vars
[devops@server1 ansible]$ cd host_vars/
[devops@server1 host_vars]$ mkdir node1
[devops@server1 host_vars]$ cd node1/
[devops@server1 node1]$ cp ../../userlist.yml vault
[devops@server1 node1]$ ansible-vault encrypt vault

1.3 使用组变量文件(group_vars)存放变量

结构如下图所示

bash 复制代码
playbook.yml
group_vars/
└── webservers/
    └── vars

将 apache 的端口变量放进单独的组目录下

bash 复制代码
[devops@server1 node1]$ cd ..
[devops@server1 host_vars]$ cd ..
[devops@server1 ansible]$ vim hosts

建立webservers组

将组变量写在单独目录下

bash 复制代码
[devops@server1 ansible]$ mkdir group_vars
[devops@server1 ansible]$ cd group_vars/
[devops@server1 group_vars]$ mkdir webservers
[devops@server1 group_vars]$ cd webservers/
[devops@server1 webservers]$ vim vars
bash 复制代码
[devops@server1 webservers]$ cd ..
[devops@server1 group_vars]$ cd ..
[devops@server1 ansible]$ ansible-playbook apache.yml

2 Ansible Roles 编写

Role(角色)是 Ansible 的标准化复用框架,把一套完整配置流程(任务、模板、文件、变量、触发器)打包成独立目录结构,实现整套配置逻辑复用、解耦,简化 playbook

标准目录结构:

bash 复制代码
roles/
  myrole/                  # 角色名称
    ├── tasks/
    │   └── main.yml       # 要执行的任务列表,调用角色自动执行
    ├── handlers/
    │   └── main.yml       # 处理器(notify触发,重启服务等)
    ├── templates/         # jinja2模板 .j2,template模块读取
    ├── files/             # 静态原始文件,copy/script直接复制,不渲染
    ├── vars/
    │   └── main.yml       # 角色内置变量(优先级较高)
    ├── defaults/
    │   └── main.yml       # 角色默认变量(优先级最低,外部可覆盖)
    ├── meta/
    │   └── main.yml       # 角色依赖、平台兼容性声明
    └── README.md          # 角色说明文档

修改配置文件,让 Ansible 在当前执行目录下的 ./roles 找角色

bash 复制代码
[devops@server1 ansible]$ vim ansible.cfg

建立角色目录,查看当前角色列表

bash 复制代码
[devops@server1 ansible]$ mkdir roles
[devops@server1 ansible]$ ansible-galaxy role list

进入角色目录,本地初始化一个名叫 apache 的自定义角色完整标准目录骨架

bash 复制代码
[devops@server1 ansible]$ cd roles/
[devops@server1 roles]$ ansible-galaxy role init apache
[devops@server1 roles]$ ansible-galaxy role list
[devops@server1 roles]$ cd apache/

查看目录结构

bash 复制代码
[devops@server1 apache]$ sudo yum install -y tree
[devops@server1 apache]$ tree .

将原来的 apache.yml 中的任务模块分离出来

bash 复制代码
[devops@server1 apache]$ cd tasks/
[devops@server1 tasks]$ vim main.yml

将原来的 apache.yml 中的变量模块分离出来

bash 复制代码
[devops@server1 tasks]$ cd ..
[devops@server1 apache]$ cd vars/
[devops@server1 vars]$ vim main.yml

将原来的 apache.yml 中的触发器模块分离出来

bash 复制代码
[devops@server1 vars]$ cd ..
[devops@server1 apache]$ cd handlers/
[devops@server1 ansible]$ vim main.yml

编辑角色剧本,可以直接使用角色

bash 复制代码
[devops@server1 vars]$ cd ../../..
[devops@server1 ansible]$ vim apache_role.yml

将之前的加密文件临时移走,运行剧本,没有问题

bash 复制代码
[devops@server1 ansible]$ mv host_vars/ group_vars/ /tmp/
[devops@server1 ansible]$ ansible-playbook apache_role.yml

因端口本来就是80,所以触发器不会工作,端口换成8080,触发器正常工作

bash 复制代码
[devops@server1 ansible]$ vim apache_role.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook apache_role.yml

3 引入 ansible.posix 集合模块

ansible.posix专门提供 Linux / UNIX POSIX 系统管理模块、插件,用来完成标准 Linux 运维操作GitHub

模块 作用
ansible.posix.mount 管理 /etc/fstab 挂载
ansible.posix.acl 文件 ACL 权限
ansible.posix.sysctl 内核参数
ansible.posix.authorized_key SSH 公钥部署
ansible.posix.seboolean SELinux 布尔值
ansible.posix.at at 定时任务
ansible.posix.patch 打补丁
bash 复制代码
[devops@server1 ansible]$ ansible-galaxy collection install ansible.posix
[devops@server1 ansible]$ vim apache_role.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook apache_role.yml

4 利用系统角色重用内容

RHEL 系统角色(rhel-system-roles)是红帽官方预先编写、封装好的一套 Ansible 角色集合 ,内置完整 tasks、判断逻辑、模板,实现跨多版本 RHEL(7/8/9)标准化自动化配置,实现重用整套配置内容,不用手写大量 tasks

角色名称 功能
rhel-system-roles.timesync 时间同步(chrony/ntp)
rhel-system-roles.selinux 管理 SELinux 模式、布尔值、上下文
rhel-system-roles.network 网卡、IP、路由网络配置
rhel-system-roles.tuned 系统性能调优
rhel-system-roles.firewall 防火墙策略配置
rhel-system-roles.sshd / ssh SSH 服务端、客户端配置
rhel-system-roles.postfix 配置邮件转发

安装系统角色,将其路径写入配置文件

bash 复制代码
[devops@server1 ansible]$ sudo yum install -y rhel-system-roles
[devops@server1 ansible]$ vim ansible.cfg

查看角色列表

bash 复制代码
[devops@server1 ansible]$ ansible-galaxy role list

/usr/share/doc/rhel-system-roles/下有相关角色的使用模板

bash 复制代码
[devops@server1 ansible]$ cd
[devops@server1 ~]$ cd /usr/share/doc/rhel-system-roles/timesync/
[devops@server1 timesync]$ cat example-single-pool-playbook.yml

4.1 示例1:调用 timesync 系统角色配置时间同步

bash 复制代码
[devops@server1 timesync]$ cp example-single-pool-playbook.yml ~/ansible/
[devops@server1 timesync]$ cd
[devops@server1 ~]$ cd ansible/
[devops@server1 ansible]$ mv example-single-pool-playbook.yml timesync.yml
[devops@server1 ansible]$ vim timesync.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook timesync.yml

在node1查看,配置成功

4.2 示例2:调用 selinux 系统角色管理 SELinux 策略

bash 复制代码
[devops@server1 ansible]$ cp /usr/share/doc/rhel-system-roles/selinux/example-selinux-playbook.yml .
[devops@server1 ansible]$ mv example-selinux-playbook.yml selinux.yml
[devops@server1 ansible]$ vim selinux.yml

配置如图,其余内容全部注释

bash 复制代码
[devops@server1 ansible]$ ansible-playbook selinux.yml

node1 的 selinux 激活

bash 复制代码
[root@node1 ~]# getenforce
[root@node1 ~]# ll -dZ /www/
[root@node1 ~]# semanage fcontext -l

4.3 示例3:解决 SELinux 阻止非标准端口启动 web 服务的报错

tcp 82 端口 标记为 http_port_t 类型,允许 httpd(apache)监听 82 端口,解决 SELinux 阻止非标准端口启动 web 服务的报错

bash 复制代码
[devops@server1 ansible]$ vim selinux.yml
bash 复制代码
[devops@server1 ansible]$ vim apache_role.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook apache_role.yml

在 node1 查看,82端口被放行

bash 复制代码
[root@node1 ~]# firewall-cmd --list-all

要将端口写进变量,目录中的defaults/main.yml/vars/main.yml都可以定义变量,此外,playbook中也可定义

优先级:

defaults/main.yml < playbook (role.yml) 的 vars < /vars/main.yml

defaults/main.yml:给别人可覆盖的默认参数 (优先级最低)

vars/main.yml:角色内部固定、不希望随便改的常量(优先级很高)

测试:

/vars/main.yml中定义端口为80

/defaults/main.yml中定义为80

bash 复制代码
[devops@server1 ansible]$ vim ./roles/apache/defaults/main.yml

playbook 中定义为82

bash 复制代码
[devops@server1 ansible]$ vim apache_role.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook apache_role.yml

放行80端口

在上一个测试中,82被放行,此时/vars/main.yml定义的端口生效,80端口也被放行,但并未对82做出其他操作,故可以看见两个端口

删除/vars/main.yml下的变量,再测试,放行82端口,说明 playbook 里定义的变量生效

在node1查看,只有82端口被放行

可以证明三个文件中变量的优先级关系

4.4 示例4:给自定义 Web 端口打上 SELinux 标签

自动执行 semanage port,给自定义 Web 端口打上 SELinux 标签 http_port_t,让 httpd (Apache) 能正常监听这个端口,不会被 SELinux 拦截

bash 复制代码
[devops@server1 ansible]$ vim apache_role.yml
bash 复制代码
[devops@server1 ansible]$ ansible-playbook apache_role.yml

测试

bash 复制代码
[root@node1 ~]# firewall-cmd --list-all
确认 8082 端口放通(解决【外部流量能不能进来】)
[root@node1 ~]# semanage port -l | grep http_port_t
**SELinux 规则**:确认 8082 有没有打上`http_port_t`标签(解决【apache 能不能监听】)
[root@node1 ~]# ss -ltnp | grep httpd
确认 httpd 真的成功绑定在 8082

5 导入外部 Galaxy 角色

入外部 Galaxy 角色 geerlingguy.redis 部署 Redis 服务

下载 Redis 角色包 geerlingguy.redis

bash 复制代码
[devops@server1 ansible]$ ansible-galaxy role install geerlingguy.redis
[devops@server1 ansible]$ ansible-galaxy role list

查看

准备在server2上部署 redis,停掉其他服务,避免冲突

bash 复制代码
[root@server2 ~]# systemctl disable --now zabbix-server.service
[root@server2 ~]# systemctl disable --now httpd.service
[root@server2 ~]# systemctl disable --now php-fpm.service
[root@server2 ~]# systemctl disable --now mysqld.service

编写 playbook ,直接导入角色包

bash 复制代码
[devops@server1 ansible]$ vim redis.yml

查看要执行的任务

执行 playbook

bash 复制代码
[devops@server1 ansible]$ ansible-playbook redis.yml

在server2测试,redis 服务正常

6 gitee 的使用

注册账号,上传公钥

新建仓库

按照对应指引,将自己的代码包上传到 gitee

bash 复制代码
[devops@server1 apache]$ pwd
/home/devops/ansible/roles/apache
[devops@server1 apache]$ git init
[devops@server1 apache]$ git config --global user.name "Hoshi."
[devops@server1 apache]$ git config --global user.email "zhangxuelian2027@163.com"
[devops@server1 apache]$ git add .
[devops@server1 apache]$ git commit -m "ansible-role-apache"
[devops@server1 apache]$ git remote add origin git@gitee.com:xiaozhangtongxuefighting/ansible-role-apache.git
[devops@server1 apache]$ git push -u origin "master"

此时已经可以看到仓库里上传了文件

删除本地的角色

bash 复制代码
[devops@server1 apache]$ cd ../..
[devops@server1 ansible]$ ansible-galaxy role remove apache
- successfully removed apache

角色清单中没有apache了

编写 requirements.yml 批量定义并导入外部 Galaxy 角色

bash 复制代码
[devops@server1 ansible]$ vim roles/requirements.yml

src来源:

version:如果有多个标签,可以选择

name 则为自定义

安装,成功后可以看到角色清单里已经出现 apache

bash 复制代码
[devops@server1 ansible]$ ansible-galaxy install -r roles/requirements.yml -p roles/

目录内容与上传的完全相同

也可以直接用shell指令进行下载

相关推荐
zhonyu鱼1 小时前
Home Assistant:开源的智能家居自动化平台,统一控制全屋设备
开源·自动化·智能家居
-今昭-1 小时前
MooseFS分布式文件系统
linux·服务器·网络
万联WANFLOW2 小时前
Meta开源了能本地跑的agent
运维·服务器·网络·人工智能·业界资讯
Brilliantwxx2 小时前
【Linux】 进程(1) 从冯诺依曼体系到进程核心概念
linux·运维·服务器
陈聪.2 小时前
Docker 核心知识整理:从入门到企业级应用
运维·docker·容器
蜀道山老天师2 小时前
Zabbix监控Apache与Nginx应用实践完整指南
linux·运维·nginx·apache·zabbix
王志来137944730082 小时前
从分散到集成:工控服务器机箱采购如何实现“一站式”破局
运维·服务器·人工智能·python
暖核2 小时前
Linux实战入门:从零编写第一个Bash Shell脚本
linux·运维·bash
云原生指北2 小时前
Docker Sandboxes 的隔离例外:共享 Skills 与宿主机 MCP
运维·docker·ai·容器·agent
智圣新创012 小时前
省属本科短周期落地智慧校园 数据治理与融合门户建设实操高频答疑
大数据·运维·人工智能