环境版本说明
- RedHat9 [Red Hat Enterprise Linux release 9.0]
- Ansible [core 2.13.3]
- Python [3.9.10]
- jinja [3.1.2]
描述角色结构
Playbook可能比较冗长且负载,也可能存在大量的重复代码。而角色(roles)可以用于层次性结构化的组织playbook,便于管理大项目。
- Ansible中的一个角色是一个结构化的目录组成,可以根据业务需要创建不同的角色,类似将playbook分割成更小的模块,进行模块化管理,简化playbook。
- 可以自行编写、使用、重用和共享角色,也可以通过其它来源获取角色
1. 角色路径
创建角色的步骤
- 创建角色存储目录
- 定义角色内容
- 在playbook中使用角色
ansible-galaxy一共有两个选项
- role:管理Ansible Galaxy角色
- collection:管理Ansible Galaxy系列
ansible-galaxy role中的常用选项
ansible-galaxy命令行工具可用于搜索角色,显示角色相关信息,以及安装、列举、删除或初始化角色。
选项 | 作用 |
---|---|
init | 使用角色的基本结构初始化新角色 |
remove | 从角色路径中删除角色 |
delete | 从Galaxy中删除角色 |
list | 显示角色路径中安装的每个角色的名称和版本 |
search | 按标签、平台、作者和多个关键字搜索Galaxy数据库 |
import | 将角色导入Galaxy服务 |
setup | 管理Galaxy和给定源之间的集成 |
info | 查看特定角色的详细信息 |
Install | 从文件、URL或Ansible Galaxy安装角色 |
Ansible默认的三个角色路径
- /usr/share/ansible/roles【系统角色存储目录】
- /etc/ansible/roles【全局角色存储目录】
- /home/user/.ansible/roles【用户自定义角色存储目录】
角色路径设置
[Step1]:
新建角色路径
mkdir ~/ansible/roles # 建议新建在家目录下
[Step2]:
修改配置文件
vim ~/ansible/ansible.cfg
# 修改下列内容
roles_path=/home/greg/ansible/roles
[Step3]:
验证角色路径
ansible-galaxy list
2. 创建角色
创建一个Apache角色
[Step1]:
进入Ansible配置文件中定义的角色路径下
cd /home/greg/ansible/roles
[Step2]:
初始化创建Apache角色
ansible-galaxy init apache
[Step3]:
验证:查看创建角色的机构化目录
tree apache
[Step4]:
在tasks目录下添加apache角色任务
vim roles/apache/tasks/main.yml
文件内容如下
---
# tasks file for apache
- name: Install the latest version of Apache
ansible.builtin.dnf: # 安装Apache服务
name: httpd
state: latest
- name: Start service httpd, if not started
ansible.builtin.service: # 启动Apache服务
name: httpd
state: started
- name: Web Page
ansible.builtin.template: # 生成index索引文件
src: index.j2
dest: /var/www/html/index.html
notify: restart_web # 实施处理程序,监控内容改变后调用handlers
- name: permit traffic in default zone for http service
ansible.posix.firewalld: # 防火墙放行http
service: http
permanent: yes
state: enabled
immediate: yes
[Step5]:
在 templates 目录下创建jinja2模板文件
vim roles/apache/templates/index.j2
# 文件内容如下
Hello {{ ansible_hostname }} you ipaddress is {{ ansible_default_ipv4.address }}
[Step6]:
在 handlers下创建处理程序
vim roles/apache/handlers/main.yml
# 文件内容如下
---
# handlers file for apache
- name: restart_web # 需要和task任务下notify定义的值一致
ansible.builtin.service: # 重启服务
name: httpd
state: restarted
[Step7]:
在工作目录下,创建playbook
vim apache_roles.yml
# 文件内容如下
---
- name: apache roles
hosts: node2
roles:
- apache # 调用的角色
[Step8]:
运行playbook
ansible-navigator run apache_roles.yml -m stdout
[Step9]:
验证:访问node2的网页内容
curl node2
3. 从外部源部署角色
角色存在多种获取方式
- 本地tar包安装
- 通过网络地址安装
- 通过文件同时安装网络中多个地址角色
访问Ansible Galaxy官网下载和管理角色
https://galaxy.ansible.com/ui/standalone/roles/
4. 使用要求文件安装角色
可以使用ansible-galaxy命令下载和管理自有的Git存储库中的角色
[Step1]:
编写角色要求文件
vim download.yml
# 文件内容如下
- src: https://xxx.xxx.xxx.xxx
scm: git
version: "1.1.0"
name: role
- src:角色网站
- scm:角色标识
- version:下载的版本
- name:安装在本地的角色名称
[Step2]:
下载并安装角色
ansible-galaxy install -r download.yml -p roles
- -r:指定角色要求文件的路径
- -p:角色的安装路径
安装角色练习
- 编写角色要求文件~/ansible/roles/roles_download.yml
- 角色地址为http://classroom/materials/phpinfo.tar
- 安装的角色名为phpinfo
[Step1]:
编写角色要求文件roles_download.yml
vim ~/ansible/roles/roles_download.yml
# 文件内容如下
- src: http://classroom/materials/phpinfo.tar
name: phpinfo
[Step2]:
下载并安装角色,角色默认是安装在角色路径中
ansible-galaxy role install -r roles/roles_download.yml -p roles/phpinfo
[Step3]:
查看roles目录中的内容
cd roles/
ll
5. 从内容集合获取角色和模块
随着模块数量增加,管理困难。借助Ansible内容集合,Ansible代码可以与模块和插件分开更新。Ansible内容集合可提供一组在Playbook中使用的相关模块、角色和其它插件。这种方法便于维护和分发集合,不受Ansible版本的影响。
查看系统中提供的集合
ansible-navigator collection
安装Ansible内容集合
通过在Ansible配置文件中我们可以看到,默认指定了两个集合路径,该路径下默认存在集合,不可删除,否则将找不到现有集合。
collections_path=~/.ansible/collections:/usr/share/ansible/collections
内容集合练习
- 在http://classroom/materials/下存在redhat-insights-1.0.7.tar.gz
- 集合安装路径为 /home/greg/ansible/mycollection目录下
[Step1]:
新建集合安装路径
mkdir /home/greg/ansible/mycollection
[Step2]:
编辑配置文件,添加集合路径
vim ansible.cfg
# 在[default]下指定
[default]
...
collections_path=~/.ansible/collections:/usr/share/ansible/collections:/home/greg/ansib
le/mycollection
[Step3]:
编辑playbook
vim mycollection/collection.yml
# 文件内容如下
---
collections:
- name: http://classroom/materials/redhat-insights-1.0.7.tar.gz
[Step4]:
运行playbook,安装集合
ansibla-galaxy collection install -r mycollection/collection.yml -p mycollection
[Step5]:
验证:查询集合是否存在
ansible-navigator collections
6.利用系统角色重用内容
系统角色是一组Ansible角色,可用于配置和管理Linux自带的各种组件、子系统和软件包。系统角色可为很多常见的系统配置任务提供自动化,包括时间同步、网络连接、防火墙、调优和日志记录。
示例:RedHat6中使用时间服务为ntpd,在RedHat7中使用chronyd,如果存在不同版本的主机,管理员需要分开配置。使用系统角色system-roles.timesync角色则可以自动配置RedHat6和RedHat7的时间同步。
6.1 rpm包方式安装系统角色(偏向8版本)
系统自定义了一些角色,可以通过软件包进行安装。
[Step1]:
离开工作目录,切换到根目录下
cd /
[Step2]:
使用dnf搜索相关的rpm安装包
sudo dnf search roles
[Step3]:
安装系统角色
sudo dnf install -y rhel-system-roles
[Step4]:
在根目录下查看角色路径,可以看到安装路径为/usr/share/ansible/roles
ansible-galaxy list
[Step5]:
修改工作目录下的Ansible配置文件,定义角色路径
vim ~/ansible/ansible.cfg
# 在下列选项中添加值,使用冒号分隔
[defaults]
...
roles_path=/home/greg/ansible/roles:/usr/share/ansible/roles
系统角色练习-时间同步
- 安装系统角色软件包
- 创建playbook,playbook名为time.yml
- 受管主机为所有主机,使用时间服务器为172.25.254.254,启用iburst参数
[Step1]:
安装系统角色
cd /
sudo dnf install -y rhel-system-roles
[Step2]:
验证:查看安装的timesync系统角色
ansible-galaxy list | grep time
[Step3]:
查找相关文件
rpm -ql rhel-system-roles | grep timesync
[Step4]:
查看帮助文档
vim /usr/share/doc/rhel-system-roles/timesync/README.md
[Step5]:
查看模板文件
vim /usr/share/doc/rhel-system-roles/timesync/example-multiple-ntp-servers-playbook.yml
[Step6]:
复制模板文件到工作目录下
cp /usr/share/doc/rhel-system-roles/timesync/example-multiple-ntp-servers-playbook.yml ansible/timesync.yml
[Step7]:
编辑复制的playbook
cd ansible
vim timesysnc.yml
# 文件内容如下
- hosts: all
vars:
timesync_ntp_servers:
- hostname: 172.25.254.254 # 指定NTP服务器地址
iburst: yes # 启用iburst参数
roles:
- rhel-system-roles.timesync # 使用的角色
[Step6]:
运行playbook,以为该剧本是8版本的,所以运行方法与9版本不一致
ansible-playbook timesync.yml
[Step5]:
验证:列出所有配置的 NTP 服务器
ansible node1 -m shell -a "chronyc sources -v"
系统角色练习-SELinux
- 安装系统角色软件包
- 创建playbook,playbook名为selinux.yml
- 受管主机为node1,配置node1的selinux为enforcing
[Step1]:
安装系统角色
sudo dnf install -y rhel-system-roles
[Step2]:
查看相关文档
rpm -ql rhel-system-roles | grep rhel-system-roles.selinux
[Step3]:
复制模板文件到工作目录中
cp /usr/share/doc/rhel-system-roles/selinux/example-selinux-playbook.yml ansible/selinux.yml
[Step4]:
编辑刚刚复制的playbook
cd ansible
vim selinux.yml
# 文件内容如下
---
- hosts: node1
become: true
become_method: sudo
become_user: root
vars:
selinux_policy: targeted
selinux_state: enforcing # 设置SELinux状态
tasks:
- name: Creates directory
file:
path: /tmp/test_dir
state: directory
mode: "0755"
- name: Add a Linux System Roles SELinux User
user:
comment: Linux System Roles SELinux User
name: sar-user
- name: execute the role and catch errors
block:
- name: Include selinux role
include_role:
name: rhel-system-roles.selinux
rescue:
# Fail if failed for a different reason than selinux_reboot_required.
- name: handle errors
fail:
msg: "role failed"
when: not selinux_reboot_required
- name: restart managed host
reboot:
- name: wait for managed host to come back
wait_for_connection:
delay: 10
timeout: 300
- name: reapply the role
include_role:
name: rhel-system-roles.selinux
[Step5]:
运行playbook
ansible-playbook selinux.yml
[Step6]:
验证:查看node1上的SELinux状态
ansible node1 -m shell -a 'getenforce'
6.2 内容集合方式安装系统角色(偏向9版本)
[Step1]:
离开工作目录,切换到根目录下
cd /
[Step2]:
使用dnf搜索相关的rpm安装包
sudo dnf search roles
[Step3]:
安装系统角色
sudo dnf install -y rhel-system-roles
[Step4]:
在根目录下查看角色路径,可以看到安装路径为/usr/share/ansible/roles
ansible-galaxy list
[Step5]:
修改工作目录下的Ansible配置文件,定义角色路径
vim ~/ansible/ansible.cfg
# 在下列选项中添加值,使用冒号分隔
[defaults]
...
roles_path=/home/greg/ansible/roles:/usr/share/ansible/roles
系统角色练习-时间同步
[Step1]:
安装系统角色
cd /
sudo dnf install -y rhel-system-roles.noarch
[Step2]:
查看安装的timesync系统角色
ansible-galaxy list | grep timesync
[Step3]:
查找相关文件,查看ansible_collections目录下的文档
rpm -ql rhel-system-roles | grep timesync
[Step4]:
复制模板文件到工作目录下
cp /usr/share/ansible/collections/ansible_collections/redhat/rhel_system_roles/docs/timesync/multiple-ntp-servers.yml ~/ansible/timesync9.yml
[Step5]:
编辑复制的playbook
cd ~/ansible
vim timesync9.yml
# 文件内容如下
- hosts: all
vars:
timesync_ntp_servers:
- hostname: 192.168.10.1
iburst: yes
roles:
- redhat.rhel_system_roles.timesync
[Step6]:
运行playbook
ansible-navigator run timesync9.yml -m stdout
6.3 两种方式的区别
通过查看安装的角色,我们可以发现存在两种角色名称不一致的角色
- linux-system-roles.xxxx:适用于8版本
- rhel-system-roles.xxx:适用于9版本
ansible-galaxy list
使用上没有什么区别,区别在于运行playbook的方式不一样,可以通过查看timesync角色提供的配置文件看出
rpm -ql rhel-system-roles | grep multiple-ntp
查看详细内容对比,可以看到其实是调用的角色不同
playbook运行方式
- 针对8版本:
ansible-playbook xxx.yml
- 针对9版本:
ansible-navigator run xxx.yml -m stdout