本人学习Linux也有3年了吧,期间遇到过大大小小的问题,也顺利考取了7版本的CE。但是嘛,时代在进步,技术也在进步,这不CE8都出来了,CE8的内容主要考Ansible这个自动化的内容,那么作为Linux学习者,必然是要学习和掌握的,当然啦我也不想再去考CE8了所以当我掌握Ansible的知识后就以CE8的题目来进行练手顺便分享下我对CE8题目的解法以及过程。
环境分析:
基于RH294环境进行练题
为1台workstation来控制servera到serverd以及bastion这5个机器
workstation为Ansible主控端,其余为被控端
第一题:
安装和配置Ansible
按照下方所述,在控制节点workstation.lab.example.com 上安装
和配置Ansible:
安装所需的软件包
创建名为/home/student/ansible/inventory的静态清单文件, 以
满足以下需求:
servera是dev主机组的成员
serverb是test主机组的成员
serverc和serverd是prod主机组的成员
bastion是balancers主机组的成员
prod组是webservers主机组的成员
创建名为/home/student/ansible/ansible.cfg的配置文件, 以满
足以下要求:
主机清单文件为/home/student/ansible/inventory
playbook中使用的角色的位置包
括/home/student/ansible/roles
解题步骤:
我们先进行ansible的安装
这里我们进行yum -y install ansible来安装ansible,最终的提示为我们已经安装过了,ok这里不用管了,如果没有安装请进行此步
接下来创建题目中所需要的静态主机文件,位置为/home/student/ansible/inventory,并且在里面写上主机清单
servera是dev主机组的成员
serverb是test主机组的成员
serverc和serverd是prod主机组的成员
bastion是balancers主机组的成员
prod组是webservers主机组的成员
我们首先创建出我们需要的目录,然后进到ansible这个目录来创建并且编辑inventory这个文件
[ ]里面的代表主机组,下面的代表主机,一个主机组里可以有多个主机,一个主机又可以属于多个主机组
需要注意的是最后一个主机组,webservers主机组包括上面的prod主机组,所以我们要用到children这个选项,可以使主机组包括主机组
接下来又让我们创建名为/home/student/ansible/ansible.cfg的配置文件,因为ansible的配置文件内容很多,我们就用个方便的方法,直接复制一份ansible的配置文件到这个目录内
这里我用了cp -p把配置文件的权限一并复制了过来
在配置文件内有几个必改的参数
inventory为主机清单位置所在,改为刚才创建的主机清单位置
这里为ansible角色存放位置,根据题目要求改为/home/student/ansible/roles目录 roles需要自己手动创建
此处表示受控端在执行主控端下达的命令时用什么身份进行执行,因为在RH294环境内,远端用户为student执行,所以这里写的为student,考试中按题目要求来写即可
这里把主机密钥检查性给关闭,那管理端就不会进行ssh密钥验证了
此处为给受控端执行ansible用户提权的参数
当我们这些参数改完以后,为了确定ansible主控端真的可以管理受控端,我们可以使用ping这个模块进行测试,为绿色就表示成功ping通受控端,说明我们的ansible可以管理机器。
第二题:
创建和运行Ansible临时命令
作为系统管理员, 您需要在受管节点上安装软件.
请按照下方所述, 创建一个名为/home/student/ansible/adhoc.sh
的shell脚本, 该脚本将使用Ansible临时命令在各个受管节点上安装
yum存储库:
存储库1:
存储库的名称为 rh294_BASE
描述为 rh294 base software
基础URL为
http://content.example.com/rhel8.0/x86_64/dvd/BaseOS
GPG签名检查为启用状态
GPG密钥URL为
http://content.example.com/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
存储库为开启状态
存储库2:
存储库的名称为 rh294_STREAM
描述为 rh294 stream software
基础URL为
http://content.example.com/rhel8.0/x86_64/dvd/AppStream
GPG签名检查为启用状态
GPG密钥URL为
http://content.example.com/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
存储库为开启状态
解题步骤:
让我们创建一个名字为adhoc的脚本,脚本在我理解里就是一些命令的组合,那我们可以使用ansible的一次性命令进行完成,这种一次性命令又被称之为adhoc。
编写脚本,这里的yum_repository为创建yum文件的模块
name为yum文件的名称 description为yum文件的描述,等同于yum文件内的name
baseurl为仓库位置,gpgcheck为gpg密钥检查 ,gpgkey为密钥位置,enabled为开启
给脚本执行权限,chmod u+x adhoc.sh
橙色表示创建成功
也可以用adhoc命令检查,查看yum仓库的情况
第三题:
安装软件包
创建一个名为 /home/student/ansible/packages.yml的
playbook:
将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中
的主机上
将 RPM Development Tools 软件包组安装到 dev主机组中的主
机上
将 dev 主机组中主机上的所有软件包更新为最新版本
解题步骤:
创建一个packages.yml的playbook脚本
题目要求了三个任务,所以我们就要创建三个任务出来,yum为模块名称,name为安装包的名称,state为状态 present为安装稳定版的包 “ * ”表示所有的包 latest为最新版本 安装组的话需要在组包前面加个@符号并且用双引号引起来 “{{ item }}”为循环的意思,这里不做过多的讲解
执行命令为 ansible-playbook playbook文件名称
我们用adhoc命令也可以查看到安装的软件包
第四题:
使用RHEL系统角色
安装 RHEL 系统角色软件包,并创建符合以下条件的playbook
/home/student/ansible/timesync.yml:
在所有受管节点上运行
使用 timesync 角色
配置该角色,以使用当前有效的 NTP 提供商
配置该角色,以使用时间服务器 classroom.example.com
配置该角色,以启用 iburst 参数
解题步骤:
此题是利用playbook进行NTP时间的同步,我们先安装下RHEL的系统角色包——rhel-system-roles
这里说使用的是timesync这个角色,就是刚才我们安装的RHEL系统角色里带的timesync这个角色,我们找到rhel系统角色,并且把timesync这个角色拷贝到我们的角色roles目录下
接下来我们来编写playbook脚本,这里的playbook是让我们配置ntp服务器,我们可以借助我们刚才拷贝的timesync这个目录里的帮助文档进行参考,使用vim -O 同时打开两个文件,然后使用ansible-playbook执行此脚本即可
第五题:
使用Ansible Galaxy安装角色
使用 Ansible Galaxy 和要求文件
/home/student/ansible/roles/requirements.yml,从以下 URL
下载角色并安装到 /home/student/ansible/roles:
http://content.example.com/fifiles/haproxy.tar 此角色的名称
应当为 balancer
http://content.example.com/fifiles/phpinfo.tar 此角色的名
称应当为 phpinfo
解题步骤:
此题通过ansible-galaxy命令来安装角色,我们首先创建一个playbook脚本,用来指定下载的角色名称和下载链接,name为角色名称,src为下载的URL
用ansible-galaxy命令来安装角色,-r选项指定playbook文件,-p指定角色安装的位置,因为第一题定义了ansible角色的位置在 /home/student/ansible/roles/
第六题:
创建和使用角色
根据下列要求,在/home/student/ansible/roles中创建名为http的
角色:
httpd软件包已安装,设为在系统启动时启用并启动
防火墙已启用并正在运行,并使用允许访问Web服务器的规则
模板文件 index.html.j2 已存在,用于创建具有以下输出的文
件/var/www/html/index.html:
Welcome to HOSTNAME on IPADDRESS
其中,HOSTNAME是受管节点的完全限定域名,IPADDRESS
则是受管节点的IP地址。
按照下方所述,创建一个使用此角色的playbook
/home/student/ansible/newrole.yml:
该playbook在webservers主机组中的主机上运行
解题步骤:
这题需要用到角色,我们首先创建名为http的角色,注意:ansible-galaxy init 角色名称,此命令必须在roles目录下执行
我们进入角色,来编写我们的任务,需要进行编辑的文件为这两个
这里使用了yum firewalld template service模块,这些模块的详解在下面链接中
注意:template这里把传过去的文件的属主和属组改为了apache用户,并且把权限改为了0644
yum模块详解(不过这里是dnf,但是yum命令跟dnf命令也没啥区别,里面用的参数都是一样的)
(上面关于模块的详解是我本人在网上寻找的,在这里对原作者表示感谢)
下面我们来写模板文件 index.html.j2,在template这个文件夹内(用vim创建并且编辑,template目录内是空的,index.html.j2需要我们手动创建)
我们在playbook脚本中使用http角色
当我们执行完playbook脚本后,因为webservers主机组里的主机有了index.html首页文件,那我们就可以试着访问它们的界面,看跟我们用template传过去的文件内容是否一致
第七题:
从Ansible Galaxy使用角色
根据下列要求,创建一个名为 /home/student/ansible/roles.yml
的playbook:
playbook中包含一个play,该play在balancers主机组中的主机
上运行并将使用balancer角色。
此角色配置一项服务,以在webservers主机组中的主机之间平
衡Web服务器请求的负载。
浏览到balancers主机组中的主机(例如
http://bastion.lab.example.com/ )将生成以下输出:
Welcome to serverc.example.com on 172.25.1.12
重新加载浏览器将从另一Web服务器生成输出:
Welcome to serverd.example.com on 172.25.1.13
playbook 中包含一个 play,该 play 在 webservers主机组中的
主机上运行并将使用 phpinfo 角色。
通过 URL /hello.php 浏览到 webservers 主机组中的主机将
生成以下输出:
Hello PHP World from FQDN
其中,FQDN是主机的完全限定名称。
例如,浏览到 http://serverc.lab.example.com/hello.php 会
生成以下输出:
Hello PHP World from serverc.example.com
另外还有 PHP 配置的各种详细信息,如安装的PHP 版本
等。
同样,浏览到 http://serverd.lab.example.com/hello.php 会生
成以下输出:
Hello PHP World from serverd.example.com
另外还有 PHP 配置的各种详细信息,如安装的PHP 版本
等。
解题步骤:
这题从题目字数上来看很吓人,但其实就两句话,balancers的主机组内的主机用balancer角色,webservers主机组内的主机用phpinfo角色
我们执行完后进行webservers主机组中的主机之间平衡Web服务器请求的负载
以及webservers主机组内的主机的输出php的信息
第八题:
创建和使用逻辑卷
创建一个名为/home/student/ansible/lv.yml 的playbook,它将
在所有受管节点上运行以执行下列任务:
创建符合以下要求的逻辑卷:
逻辑卷创建在research卷组中
逻辑卷名称为data
逻辑卷大小为1500MiB
使用ext4文件系统格式化逻辑卷
如果无法创建请求的逻辑卷大小,应显示错误消息
Could not create logical volume of that size,并且应改为
使用大小 800MiB。
如果卷组research 不存在 ,应显示错误消息
Volume group does not exist。
不要以任何方式挂载逻辑卷
解题步骤:
这里说了要我们创建逻辑卷,又说了如果创建逻辑卷大小超过了vg的大小,就应当缩小容量然后再次创建,如果vg卷组不存在的话就要显示错误信息
使用了block rescue always
block、rescue和always之间的关系:block执行有误时执行rescue,而always无论block是否成功执行都会执行
这里我们进行when判断,如果research这个VG组存在就执行block,research和always的语句,不存在就返回一条信息,说明research这个VG组不存在
第九题:
生成主机文件
将一个初始模板文件从
http://content.example.com/fifiles/hosts.j2下载
到/home/student/ansible
完成该模板,以便用它生成以下文件:针对每个清单主机包含一
行内容,其格式与 /etc/hosts 相同
创建名为 /home/student/ansible/hosts.yml 的playbook,它
将使用此模板在 dev 主机组中的主机上生成文件 /etc/myhosts。
该 playbook 运行后,dev 主机组中主机上的文件/etc/myhosts 应
针对每个受管主机包含一行内容:
127.0.0.1 localhost localhost.localdomain
localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
172.24.1.6 servera.lab1.example.com servera
172.24.1.7 serverb.lab1.example.com serverb
172.24.1.8 serverc.lab1.example.com serverc
172.24.1.9 serverd.lab1.example.com serverd
172.24.1.10 bastion.lab1.example.com bastion
解题步骤:
此题,需要我们用template模块进行文件的传输,使文件内包含IP地址,域名,主机名。所以我们需要用到主机内置的变量,在这里运用for循环,这里的groups.all为受控端主机的清单,即为受控制的5台主机。hostvars为主机变量,i是从groups.all里面取值,那么就是受控主机的名称了,例子:第一个i的取值为servera那hostvars[i]可以理解成hostvars[servera]就表示servera主机的内置主机变量,这里只能描述个大概,具体的for循环还要大家去网上寻找资料查看。
这里面圈住的表示,先引用所有主机的内置变量,因为我们在hosts.j2里面调用了所有主机的变量,但是如果不在playbook里先调用所有主机的变量的话,那playbook脚本将执行失败
第十题:
按照下方所述,创建一个名为 /home/student/ansible/issue.yml
的 playbook:
该 playbook 将在所有清单主机上运行
该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文
本:
在 dev 主机组中的主机上,这行文本显示为:Development
在 test 主机组中的主机上,这行文本显示为:Test
在 prod 主机组中的主机上,这行文本显示为:Production
解题步骤:
这题需要用到copy模块,在copy模块中有个名为content的选项,将指定的内容复制到远程文件内
题目中又要求只有在指定主机组内的主机才进行替换,我们要用到when判断,inventory_hostname则表示为受控主机名称,例如:servera,serverb
groups.dev则表示dev主机组内的主机,那这句判断可以理解为inventory_hostname的主机是否在groups.dev里
如果inventory_hostname取的第一个值为servera的话,那servera在dev主机组内,那就执行copy模块下的任务,如果第一个值取的是serverb的话,那serverb并不在dev主机组内,那就不执行copy模块下的任务
第十一题:
创建Web内容目录
按照下方所述,创建一个名为
/home/student/ansible/webcontent.yml 的 playbook:
该 playbook 在 dev 主机组中的受管节点上运行
创建符合下列要求的目录 /webdev:
所有者为 devops 组
具有常规权限:owner=read+write+execute,
group=read+write+execute,other=read+execute
具有特殊权限: set group ID
用符号链接将 /var/www/html/webdev 链接到 /webdev
创建文件 /webdev/index.html,其中包含如下所示的单行文
本:Development
在 dev 主机组中主机上浏览此目录(例如
http://servera.lab.example.com/webdev/ )将生成以下输出:
Development
解题步骤:
题目要求创建web目录,那首先想到web服务,先进行apache服务的安装,并且把防火墙和服务自启打开,创建web目录时切记更改selinux值,改为httpd_sys_content_t,以及index.html文件的selinux值
这里补充一下content的作用,如果我要的这个文件不存在用content的话会把这个文件自动的创建出来,并且把我需要的内容写进去
第十二题:
生成硬件报告
创建一个名为 /home/student/ansible/hwreport.yml的
playbook,它将在所有受管节点上生成含有以下信息的输出文件
/root/hwreport.txt:
hostname: inventoryhostname
mem: memory_in_MB
bios: BIOS_version
vda: disk_vda_size
vdb: disk_vdb_size
输出文件中的每一行含有一个 key=value 对。
您的 playbook 应当:
从 http://content.example.com/fifiles/hwreport.empty 下载
文件,并将它保存为/root/hwreport.txt
使用正确的值修改 /root/hwreport.txt
如果硬件项不存在,相关的值应设为NONE
解题步骤:
这道题用到get_url模块,用来下载文件到指定位置,replace模块用来进行文件内容的替换,题目中要求,如果硬件不存在,那值将会被替换成NONE。所有我们使用到了when进行判断,ansible_devices这个内置变量为主机内的硬盘,判断为如果vda这个硬盘在ansible_devices里,就替换成vda的硬盘大小表示为:ansible_devices.vda.size
此题涉及到大量的主机内置变量,需要大家上网寻找关于主机内置变量的资料,这里不再一一列出
第十三题:
创建密码库
按照下方所述,创建一个 Ansible 库来存储用户密码:
库名称为 /home/student/ansible/locker.yml
库中含有两个变量,名称如下:
pw_developer,值为 Imadev
pw_manager,值为 Imamgr
用于加密和解密该库的密码为redhat
密码存储在文件 /home/student/ansible/secret.txt中
解题步骤:
首先创建一个包含变量的playbook脚本,又说这个playbook脚本的加密密码为redhat,但是这个密码包含在secret.txt这个文件内,用echo命令加重定向符号将redhat输入到secret这个文件内。加密playbook脚本的话需要用到 ansible-vault这条命令,用来加密脚本
用ansible-vault view 文件名,然后输入加密时的密码,就可以看见我们加密后的playbook脚本的内容了
第十四题:
创建用户账户
从 http://content.example.com/fifiles/user_list.yml 下载要创
建的用户的列表,并将它保存到 /home/student/ansible
在本次考试中使用在其他位置创建的密码库
/home/student/ansible/locker.yml,创建名
为/home/student/ansible/users.yml 的playbook,从而按以下所
述创建用户帐户:
职位描述为 developer 的用户应当:
在 dev 和 test 主机组中的受管节点上创建
从 pw_developer 变量分配密码
是附加组 student 的成员
职位描述为 manager 的用户应当:
在 prod 主机组中的受管节点上创建
从 pw_manager 变量分配密码
是附加组 opsmgr 的成员
密码应采用 SHA512 哈希格式。
您的 playbook 应能够在本次考试中使用在其他位置创建的库密
码文件/home/student/ansible/secret.txt 正常运行
解题步骤:
需要用到我们上一题所创建的变量,要用vars_files选项来引入变量文件
根据题目要求职位为developer才进行创建用户操作,那必然需要用到when判断。
这里的用户不止一个,那就需要用到loop循环进行逐一创建
第十五题:
.更新Ansible库的密钥
按照下方所述,更新现有 Ansible 库的密钥:
从 http://content.example.com/fifiles/salaries.yml 下载
Ansible 库到 /home/student/ansible
当前的库密码为 AAAAAAAAA
新的库密码为 BBBBBBBBB
库使用新密码保持加密状态
解题步骤:
此题目考验我们对加密文件的更改密码题目,需要用到ansible-vault rekey 这条命令
此命令是来更改加密文件的密码的
至此RHCE8的15道题就到这里了,如果觉得这15道题我有做的不对的地方,还请大家一一的指出来,我们共同讨论一下,有疑问的也可以在评论中说出来,我都会看的,最后谢谢大家观看这篇文章!!!