考前说明
请勿更改 IP 地址。DNS 解析完整主机名,同时也解析短名称。
• 所有系统的 root 密码都是 redhat
• Ansible 控制节点上已创建用户账户 devops。可以使用 ssh 访问
• 所需的所有镜像保存在镜像仓库 utility.lab.example.com
podman 可使用下述账号登录使用
用户:admin
密码:redhat
• 所有工作文件应保存在控制节点上的 /home/devops/ansible 目录中,且归devops 所有
• devops 的默认 ansible-navigator 配置: ~devops/.ansible-navigator.yml 参考讲师提供的文件
• 练习中的防火墙默认关闭,SELinux 处于强制模式 file 目录提供一些额外文件,考试会正常提供
• 产品文档位置 http://materials.example.com/docs/
• 模拟环境中提供的工具文件已经提供,、
连接地址:
http://materials.example.com/tools
通过 wget 下载即可
1.安装并配置 Ansible为devops用户配置免密私钥
在控制节点 workstation.lab.example.com 上安装和配置 Ansible:
-- 安装所需的软件包
-- 创建静态清单文件 /home/devops/ansible/ 要求如下:
-- servera 是 dev 主机组的成员
-- serverb 是 test 和 balancers
-- serverc 和 serverd 是 prod 主机组的成员
-- prod 组是 webservers 主机组的成员
创建名为 /home/devops/ansible/ansible.cfg 的配置文件,要求如下:
-- 主机清单文件为 /home/devops/ansible/inventory
-- 默认内容集合目录为 /home/devops/ansible/mycollections
-- 默认角色目录为 /home/devops/ansible/roles
测试环境配置
# 为devops用户配置免密私钥
#测试
#设置ansible-navigator运行环境
实验开始
#登录
#创建目录
#查看安装包具体信息
#安装ansible所需软件
#登录容器镜像仓库
#配置ansible,编写ansible配置文件
#生成工作清单
#测试
2.创建 yum 仓库
作为系统管理员,需在受管节点上安装软件。
• 创建 playbook /home/devops/ansible/yum_repo.yml,该 playbook 将在各个受管节点上
• 创建以下 yum 仓库:
-- 仓库 1:
• 仓库的名称为 RH294_BASE
• 描述为 RH294 base software
• BaseURL 为 http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
• GPG 签名检查为启用状态
• GPG 密钥 URL 为http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
• 仓库为启用状态
-- 仓库 2:
• 仓库的名称为 RH294_STREAM
• 描述为 RH294 stream software
• BaseURL 为 http://content.example.com/rhel9.0/x86_64/dvd/AppStream
• GPG 签名检查为启用状态
• GPG 密钥 URL 为 http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
• 仓库为启用状态
实验示例:
#编写指定Playbook
最后那里写yum_repo.yml,作者搞错啦
#查看内容(辅助)
#编写内容
#测试
记得改一下划红线的地方
#出现这些算成功
3.安装 Collections
以 devops 身份,将以下 collections 从资源连接目录中安装到workstation.lab.example.com
• redhat-rhel_system_roles-1.16.2.tar.gz
• ansible-posix-1.4.0.tar.gz
• community-general-4.3.0.tar.gz
• 资源连接:
http://materials.example.com/tools
集合应安装到默认集合目录 /home/devops/ansible/mycollection
实验示例:
#配置资源
#安装Collections
#查看collections
4.安装软件包
• 创建名为 packages.yml 的 playbook:
-- 将 php 和 mariadb 软件包安装到 dev、test 和 prod 组中的主机上
-- 将 RPM Development Tools 包组安装到 dev 组中的主机上
-- 将 dev 组中主机上的所有软件包更新为最新版本
实验示例:
#1.编写packages.yml
#查看帮助
#2.packages.yml内容
#3.运行playbook
#测试:
5.1使用角色(二选一)
根据以下要求创建名为 selinux.yml 的 playbook:
-- 在所有受管节点上运行
-- 使用 selinux 角色
-- 将 SELinux 策略为 targeted
-- 将 SELinux 状态为 enforcing
查看示例文件
#2.查看系统roles
添加角色路径
查看命令
进入此配置文件编写
#3.编写playbook selinux.yml
#4.运行playbook
#5.测试
5.2 使用** **Timesync RHEL系统角色(二选一):
/home/devops/ansible/timesync.yml:
-
在所有受管节点上运行
-
使用 timesync 角色
-
配置该角色,以使用当前有效的 NTP 提供
-
配置该角色,以使用时间服务器 classroom.example.com
#复制命令
#查帮助
# 编写yml文件
#运行
6.使用 Ansible Galaxy 安装角色
• 创建 /home/devops/ansible/roles/requirements.yaml 文件用以下载并安装角色到 /home/devops/ansible/roles/ 目录中
-- 角色名:balancer,来自于 http://materials.example.com/tools/haproxy.tar
-- 角色名:phpinfo,来自于 http://materials.example.com/tools/phpinfo.tar
#1.编辑playbook requirements.yml
#2.playbook内容
#3.运行安装命令
#4.测试
7.创建和使用角色
根据下列要求,在 /home/devops/ansible/roles 中创建名为 apache 的角色:
-- 安装 httpd 软件包,开机启动并立即运行
• 开启防火墙并允许 web 服务通信
• 模板文件 index.html.j2 用于创建/var/www/html/index.html,含有以下内容:
Welcome to HOSTNAME on IPADDRESS,其中 HOSTNAME 和 IPADDRESS 来自于事实变量
• 创建名为 newrole.yml 的 playbook,并使用此角色
• 这个 playbook 运行于 webservers 主机组
实验示例:
#1.创建角色
#2.查看角色创建信息
#3.建立模板index.html
查看两个事实变量信息
#4.创建角色任务
#5.编写roles的playbook newrole.yml
#6.运行newrole.yml
#7.帮助查看方式
#8.测试
8.从 Ansible Galaxy 使用角色
创建名为 roles.yml 的 playbook,满足以下要求:
-- Playbook 运行在 balancers 主机组上,并使用 balancer 角色。
-- 这个角色为 webservers 主机组配置负载均衡 web 服务器配置完成后,
当访问 http://serverb.lab.example.com 将显示以下输出信息:
• Welcome to serverc.lab.example.com on 172.25.250.12
• Welcome to serverd.lab.example.com on 172.25.250.13
• 这个 playbook 中另一个 play 使用 phpinfo 角色在 webservers 主机组上执行完
毕后,访问主机组内每台主机的/hello.php 显示以下信息:
-- Hello World from FQDN
• FQDN 来自于事实变量
• 页面同时显示每台受控主机的 PHP 配置
实验示例:
#查看文件辅助
#编写角色play文件 roles.yml
#运行playbook
#测试
9.创建和使用分区
根据下列要求,创建名为 partition.yml 的 playbook:
-- playbook 中包含一个 play,该 play 在 balancers 主机组中的主机上运行
• 在设备 vdb 上创建单个主分区,编号为 1,大小为 1500 MiB
• 使用 ext4 文件系统格式化分区
• 将文件系统永久挂载到 /newpart
• 如果无法创建请求的分区大小,应显示错误消息
-- Could not create partition of that size
- 并且应改为使用大小 800 MiB
• 如果设备 vdd 不存在,应显示错误消息
-- Disk does not exist
#查看文件辅助
hosts: balancers
:指定该 play 在名为balancers
的主机组中的主机上运行,
tasks
:后续跟着的是要在目标主机上执行的一系列任务列表。
name: check device vdb
:任务的名称,用于标识这个任务是检查vdb
设备是否存在。
ansible.builtin.debug
:使用debug
模块,功能是输出指定的消息。
msg: Disk does not exist
:当满足when
条件时,输出的错误消息内容,对应题目中 "如果设备 vdb 不存在,应显示错误消息 -- Disk does not exist" 的要求。
when: ansible_facts['devices']['vdb'] is not defined
:条件判断,当ansible_facts
(Ansible 收集的主机 facts 信息,包含设备等情况)中devices
里的vdb
设备未定义(即不存在)时,执行这个debug
任务,输出对应提示。
block
部分:
name: Create a new primary partition with a size of 1500MiB
:任务名称,表明尝试创建大小为 1500MiB 的主分区。community.general.parted
:使用parted
模块(来自community.general
集合),用于管理磁盘分区。device: /dev/vdb
:指定要操作的磁盘设备是/dev/vdb
。number: 1
:分区编号为 1,即创建主分区编号 1 ,满足题目 "在设备 vdb 上创建单个主分区,编号为 1" 要求。state: present
:表示确保分区存在,这里就是要创建分区。part_end: 1500MiB
:指定分区大小为 1500MiB ,对应题目最初尝试创建 1500MiB 分区的要求。when: ansible_facts['devices']['vdb'] is defined
:条件,当vdb
设备存在(已定义)时,才执行创建 1500MiB 分区的操作。
name: display err msg
和ansible.builtin.debug
配合:输出错误消息Could not create partition of that size
,满足题目 "如果无法创建请求的分区大小,应显示错误消息 -- Could not create partition of that size" 要求。接着第二个任务
name: Create a new primary partition with a size of 800MiB
及后续community.general.parted
配置:在创建 1500MiB 分区失败后,改为尝试创建 800MiB 大小的主分区,part_end: 800MiB
指定新的分区大小,同样when
条件确保在vdb
设备存在时执行,满足题目 "并且应改为使用大小 800 MiB" 要求。
name
:任务名称,说明是创建 ext4 文件系统相关操作。
community.general.filesystem
:使用filesystem
模块(来自community.general
集合 ),用于在指定设备上创建文件系统。
fstype: ext4
:指定要创建的文件系统类型是ext4
,满足题目 "使用 ext4 文件系统格式化分区" 要求。
dev: /dev/vdb1
:指定要格式化的设备是/dev/vdb1
(即vdb
设备上编号为 1 的分区 )。
when: ansible_facts['devices']['vdb'] is defined
:条件,当vdb
设备存在时,才执行格式化操作,因为设备都不存在的话,格式化也无意义。
name
:任务描述,说明此任务是「检查并创建/newpart
目录(若不存在)」。
ansible.builtin.file
:Ansible 内置的file
模块,用于管理文件 / 目录的状态(创建、删除、修改权限等)。
path: /newpart
:指定要操作的路径,这里是准备作为挂载点的目录/newpart
。
state: directory
:告诉file
模块,确保该路径是一个目录。如果目录不存在,会自动创建;若已存在则不做修改(幂等性)。
when
条件:仅当ansible_facts
检测到vdb
设备存在时,才执行此任务。避免设备不存在时,无意义地创建目录。
name
:任务描述,说明此任务是「将/dev/vdb1
挂载到/newpart
」。
ansible.posix.mount
:Ansibleposix
集合里的mount
模块,专门用于管理文件系统挂载(支持写入/etc/fstab
实现永久挂载)。
path: /newpart
:指定挂载点,需与上一步创建的目录路径一致。
src: /dev/vdb1
:指定要挂载的设备,即vdb
磁盘的 1 号分区。
fstype: ext4
:指定文件系统类型,需与分区实际格式(前面用filesystem
模块格式化的ext4
)匹配。
state: mounted
:让mount
模块确保设备「已挂载」。它会做两件事:
执行
mount /dev/vdb1 /newpart
命令,临时挂载分区;将挂载配置写入
/etc/fstab
,实现永久挂载(系统重启后依然生效)。
when
条件:同样依赖vdb
设备存在,保证挂载操作有意义。
总体代码
--- - hosts: balancers tasks: - name: check device vdb ansible.builtin.debug: msg: Could not create partition of that size when: ansible_facts['devices']['vdb'] is not defined - name: create part block: - name: Create a new primary partition with a size of 1500MiB community.general.parted: device: /dev/vdb number: 1 state: present part_end: 1500MiB when: ansible_facts['devices']['vdb'] is defined rescue: - name: display err msg ansible.builtin.debug: msg: Could not create partition of that size - name: Create a new primary partition with a size of 800MiB community.general.parted: device: /dev/vdb number: 1 state: present part_end: 800MiB when: ansible_facts['devices']['vdb'] is defined always: - name: Create a ext4 filesystem on /dev/vdb1 community.general.filesystem: fstype: ext4 dev: /dev/vdb1 when: ansible_facts['devices']['vdb'] is defined - name: Create a directory if it does not exist ansible.builtin.file: path: /newpart state: directory when: ansible_facts['devices']['vdb'] is defined - name: Mount vdb ansible.posix.mount: path: /newpart src: /dev/vdb1 fstype: ext4 state: mounted when: ansible_facts['devices']['vdb'] is defined
#运行
#测试
10.生成主机文件
将 http://materials.example.com/tools/hosts.j2 模板文件拷贝到/home/devops/ansible 目录中完善此模板文件,用以生成受控节点的 /etc/myhosts 文件创建名为 hosts.yml 的playbook 对 dev 主机组使用此模板文件/etc/myhosts 文件内容最终如下:
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.250.10 servera.lab.example.com servera
172.25.250.11 serverb.lab.example.com serverb
172.25.250.12 serverc.lab.example.com serverc
172.25.250.13 servera.lab.example.com serverd
实验示例:
#1.建立j2模板
#查看文件(辅助)
#2.建立playbook vim hosts.yml
#可以用这个查看复制一些内容
vim hosts.yml内容
#3.运行playbook
#4.测试:
11.修改文件内容
创建名为 issue.yml 的 playbook,要求如下:
-- 此 playbook 运行到所有受控节点
• 此 playbook 覆盖/etc/issue 文件中的内容:
• 在 dev 主机组的主机中,内容是:Development 在 test 主机组的主机中,内容是:Test
• 在 prod 主机组的主机中,内容是:Production
实验示例:
#查看,在此查看目录中查询这个
#进入此文件编写
#运行
#测试
12.创建 Web 内容目录
按照下方所述,创建名为 webcontent.yml 的 playbook:
-- 该 playbook 在 dev 主机组中的受管节点上运行
-- 创建目录 /webdev 所有者为 webdev 组
-- 具有常规权限:owner=read+write+execute,
group=read+write+execute,other=read+execute
-- 具有特殊权限:set group ID
-- 用软链接将 /var/www/html/webdev 链接到 /webdev
-- 创建文件 /webdev/index.html,内容为:Red Hat Ansible
-- 在 dev 主机组中主机上浏览此目录(例如
http://servera.lab.example.com/webdev/index.html )将生成以下输出 Red Hat Ansible
实验示例:
#查看,在此查看目录中查询这个
#进入配置文件编写
#检测一下语法是否错误
#运行
#测试
13.生成硬件报告
创建名为 hwreport.yml 的 playbook,在所有受控主机上生成
/root/hwreport.txt 文件,内容包含:
-- 清单主机名称以 MB 表示的总内存大小 BIOS 版本
• 磁盘设备 vda 的大小
• 磁盘设备 vdb 的大小
• 输出文件中的每一行含有一个 key=value 对 playbook 应当来自
files/13/hwreport.empty 模板文件,并将它保存为 /root/hwreport.txt
• 使用正确的值修改 /root/hwreport.txt
• 如果硬件项不存在,相关的值应设为 NONE
#查看模板
方法一:
#创建hwreport.yml配置文件
--- - hosts: all vars: hw_all: - hw_name: HOST hw_cont: "{{ inventory_hostname | default('NONE',true) }}" - hw_name: MEMORY hw_cont: "{{ ansible_memtotal_mb | default('NONE',true) }}MB" - hw_name: BIOS hw_cont: "{{ ansible_bios_version | default('NONE',true) }}" - hw_name: DISK_SIZE_VDA hw_cont: "{{ ansible_devices.vda.size | default('NONE',true) }}" - hw_name: DISK_SIZE_VDB hw_cont: "{{ ansible_devices.vdb.size | default('NONE',true) }}" tasks: - name: one ansible.builtin.get_url: url: http://materials.example.com/tools/hwreport.empty dest: /root/hwreport.txt - name: two ansible.builtin.lineinfile: path: /root/hwreport.txt regexp: "^{{ item.hw_name }}" line: "{{ item.hw_name }}={{ item.hw_cont }}" loop: "{{ hw_all }}"
#测试(可测试单个或者所有)
单个:
所有:
测试结果太多,可以自行查看
方法二:
--- - name: create display host hosts: all tasks: - name: create file ansible.builtin.get_url: url: http://materials.example.com/tools/hwreport.empty dest: /root/hwreport.txt - name: HOST ansible.builtin.lineinfile: path: /root/hwreport.txt regexp: '^HOST=' line: 'HOST = {{ inventory_hostname }}' - name: MEMORY ansible.builtin.lineinfile: path: /root/hwreport.txt regexp: '^MEMORY=' line: 'MEMORY = {{ ansible_memtotal_mb }}MB' - name: BIOS ansible.builtin.lineinfile: path: /root/hwreport.txt regexp: '^BIOS=' line: 'BIOS = {{ ansible_version }}' - name: DEVICE VDA ansible.builtin.lineinfile: path: /root/hwreport.txt regexp: '^VDA=' line: "VDA = {{ ansible_devices.vda.size | default('NONE') }}" - name: DEVICE VDB ansible.builtin.lineinfile: path: /root/hwreport.txt regexp: '^VDB=' line: "VDB = {{ ansible_devices.vdb.size | default('NONE') }}"
#运行跟测试跟方法一一样
14.创建 password vault
创建一个名为 locker.yml 的 ansible vault 文件存储用户密码:
• Vault 文件中含有两个变量,名称如下:
-- pw_developer: Imadev
• pw_manager: Imamgr 加解密密码为 redhat
• 密码存储在 /home/devops/ansible/secret.txt 中。
实验示例:
#输入密码
#修改权限
#查看
#进入此配置文件编写
#在进入配置文件编写
#测试
15.创建用户帐户
需要创建的用户账户清单来自于 http://materials.example.com/tools/user_list.yml,请拷贝到/home/devops/ansible/中
• 配合上一题的 locker.yml,创建名为 users.yml 的 playbook,要求如下:
-- 用户的 job description 为 developer 的用户,创建到 dev 和 test 主机组
• 中,用户密码来自于 pw_developer 变量,用户的附属组是 devops
• 用户的 job description 为 manager 的用户,创建到 prod 主机组中,用户密
• 码来自于 pw_manager 变量,用户的附属组是 opsmgr
• 用户密码使用 SHA512 hash
实验示例:
#下载安装
#进入配置文件查看
#在进入此配置文件编写内容
#全部代码如下
#运行
16.更新 Ansible 库的密钥
• 请为 expense.yml 文件修改 vault 密码,要求如下:
-- 请将 http://materials.example.com/tools/expense.yml 文件保存到
/home/devops/ansible/expense.yml
• 当前密码为 ibmibm
• 新密码为 redhatredhat
实验示例:
#安装
#修改密码
#查看密码是否修改完成
17.配置 cron 作业
在所有受管节点上创建名为 /home/devops/ansible/cron.yml 的 Playbook,为natasha 用户创建 cron 作业:
• 用户 natasha 每隔 2 分钟执行 logger "RH294 in progress"
#查看模板
#进入配置文件配置
'
--- - name: create con for natasha hosts: all tasks: - name: create user natasha ansible.builtin.user: name: natasha state: present - name: create cron for natasha ansible.builtin.cron: name: "natasha cronjob" minute: "*/2" hour: "*" day: "*" month: "*" weekday: "*" user: natasha job: ' logger "RH294 in progress" '
#运行
#检验