环境下载咨询qq
RHCE
重要配置信息
在考试期间,除了您就坐位置的台式机之外,还将使用多个虚拟系统。您不具有台式机系统的
root 访问权,但具有对虚拟系统的完整root 访问权。
系统信息
在本考试期间,您将操作下列虚拟系统
系统 | IP地址 | Ansible角色 |
---|---|---|
control | 172.24.12.11 | ansible control node |
node1 | 172.24.12.6 | ansible managed node |
node2 | 172.24.12.7 | ansible managed node |
node3 | 172.24.12.8 | ansible managed node |
node4 | 172.24.12.9 | ansible managed node |
node5 | 172.24.12.10 | ansible managed node |
这些系统的 IP 地址采用静态设置。请勿更改这些设置。
主机名称解析已配置为解析上方列出的完全限定主机名,同时也解析主机短名称。
帐户信息
所有系统的 root 密码是redhat。
请勿更改 root 密码。除非另有指定,否则这将是用于访问其他系统和服务的密码。此外,除非另有指定,否则此密码也应用于您创建的所有帐户,或者任何需要设置密码的服务。
为方便起见,所有系统上已预装了 SSH 密钥,允许在不输入密码的前提下通过 SSH 进行 root 访问。请勿对系统上的 root SSH 配置文件进行任何修改。
Ansible 控制节点上已创建了用户帐户 curtis
。此帐户预装了 SSH 密钥,允许在 Ansible 控制节点和各个 Ansible 受管节点之间进行 SSH 登录。请勿对系统上的 curtisSSH 配置文件进行任何修改。您可以从 root 帐户使用 su 访问此用户帐户。
重要信息
除非另有指定,否则您的所有工作(包括 Ansible playbook、配置文件和主机清单等)应当保存在控制节点上的目录 /home/curtis/ansible 中,并且应当归 curtis用户所有。所有 Ansible 相关的命令应当由 curtis用户从 Ansible 控制节点上的这个目录运行。
其他信息
一些考试项目可能需要修改 Ansible 主机清单。您要负责确保所有以前的清单组和项目保留下来,与任何其他更改共存。您还要有确保清单中所有默认的组和主机保留您进行的任何更改。
考试系统上的防火墙默认为不启用,SELinux 则处于强制模式。
如果需要安装其他软件,您的物理系统和 Ansible 控制节点可能已设置为指向 content 上的下述存储库:http://rhgls.area12.example.com/dvd/BaseOS
http://rhgls.area12.example.com/dvd/AppStream
一些项目需要额外的文件,这些文件已在以下位置提供:http://rhgls.area12.example.com/materials
产品文档可从以下位置找到:http://rhgls.area12.example.com/materials/docs/ansible/html
其他资源也进行了配置,供您在考试期间使用。关于这些资源的具体信息将在需要这些资源的项目中提供。
重要信息 请注意,在评分之前,您的 Ansible 受管节点系统将重置为考试开始时的初始状态,您编写的 Ansible playbook 将通过以 curtis用户身份从控制节点上的目录 /home/curtis/ansible 目录运行来应用。在playbook 运行后,系统会对您的受管节点进行评估,以判断它们是否按照规定进行了配置。
RH294
安装和配置Ansible
- 按照下方所述,在控制节点 control上安装和配置Ansible:
- 安装所需的软件包
- 创建名为/home/curtis/ansible/inventory的静态清单文件,以满足以下要求:
- node1是dev 主机组的成员
- node2是test 主机组的成员
- node3 和 node4是prod 主机组的成员
- node5是balancers 主机组的成员
- prod 组是webservers 主机组的成员
- 创建名为/home/curtis/ansible/ansible.cfg的配置文件,以满足以下要求:
- 主机清单文件为/home/curtis/ansible/inventory
- playbook 中使用的角色的位置包括/home/curtis/ansible/roles
[curtis@control ansible]$ cat ansible.cfg |
创建和运行Ansible 临时命令
- 作为系统管理员,您需要在受管节点上安装软件。
请按照正文所述,创建一个名为/home/curtis/ansible/adhoc.sh 的shell 脚本,该脚本将使用Ansible 临时命令在各个受管节点上安装yum 存储库:
- 存储库1:
- 存储库的名称为 EX294_BASE
- 描述为 EX294 base software
- 基础URL为
http://rhgls.area12.example.com/dvd/BaseOS
- GPG 签名检查为启用状态
- GPG 密钥URL 为
http://rhgls.area12.example.com/dvd/RPM-GPG-KEY-redhat-release
- 存储库为启用状态
- 存储库2:
- 存储库的名称为 EX294_STREAM
- 描述为EX294 stream software
- 基础 URL为
http://rhgls.area12.example.com/dvd/AppStream
- GPG 签名检查为启用状态
- GPG 密钥 URL 为
http://rhgls.area12.example.com/dvd/RPM-GPG-KEY-redhat-release
- 存储库为启用状态
[curtis@control ansible]$cat ad.hoc |
安装软件包
- 创建一个名为/home/curtis/ansible/packages.yml 的playbook :
- 将php 和mariadb 软件包安装到dev、test 和prod 主机组中的主机上
- 将RPM Development Tools软件包组安装到dev 主机组中的主机上
- 将dev 主机组中主机上的所有软件包更新为最新版本
[curtis@control ansible]$ cat packages.yml
- hosts: dev,test,prod
tasks:
- yum:
name: php,mariadb
state: installed
- hosts: dev
tasks:
- yum:
name: "@RPM Development Tools"
state: installed
- hosts: dev
tasks:
- yum:
name: "*"
state: latest
使用RHEL 系统角色
- 安装RHEL 系统角色软件包,并创建符合以下条件的playbook /home/curtis/ansible/selinux.yml :
- 在所有受管节点上运行
- 使用 selinux 角色
- 配置该角色,以强制状态使用selinux
[root@control ~]$ yum install rhel-system-roles -y
[curtis@control ansible]$cp /usr/share/ansible/roles/rhel-system-roles.selinux/ roles/selinux -r
[curtis@control ansible]$cat selinux.yml
```yml
- hosts: all
vars:
- selinux_policy: targeted ####main.yml里边定义的变量
selinux_state: enforcing ###默认为强制状态,强制状态转宽容,无需重启,精简剧本,后边加roles就可以了,如果是改为关闭状态,则需要重启,此时会报错,加上后续剧本,可以实现重启生效。enforcing permissive disabled
tasks:
- block:
- include_role: ###模块,用来调用角色
name: roles/selinux
rescue:
- fail: ###查看角色main.yml,根据中间定义可得,当在执行时出现need reboot报错(Enforcing变permissive不会报错,直接成功,切换disabled会报错),那么会在事实中定义一个变量 selinux_reboot_required ,如果变量有定义,则实现重启功能即可。变量无定义,后续任务不需要进行。
when: not selinux_reboot_required
- reboot:
- include_role:
name: roles/selinux
检查 |
使用Ansible Galaxy 安装角色
- 使用 Ansible Galaxy 和要求文件/home/curtis/ansible/roles/requirements.yml 。从以下URL 下载角色并安装到/home/curtis/ansible/roles :
http://rhgls.area12.example.com/materials/haproxy.tar
此角色的名称应当为balancerhttp://rhgls.area12.example.com/materials/phpinfo.tar
此角色的名称应当为phpinfo[curtis@control ansible]$cat roles/requirements.yml
- src: http://rhgls.area12.example.com/materials/haproxy.tar
name: balancer
- src: http://rhgls.area12.example.com/materials/phpinfo.tar
name: phpinfo
[curtis@control ansible]$ ansible-galaxy install -r roles/requirements.yml -p roles/
- downloading role from http://rhgls.area12.example.com/materials/haproxy.tar
- extracting haproxy to /home/student/roles/balancer
- balancer was installed successfully
- downloading role from http://rhgls.area12.example.com/materials/phpinfo.tar
- extracting phpinfo to /home/student/roles/phpinfo
- phpinfo was installed successfully
创建和使用角色
- 根据下列要求,在/home/curtis/ansible/roles 中创建名为apache 的角色:
- httpd 软件包已安装,设为在系统启动时启用并启动
- 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则
- 模板文件index.html.j2 已存在,用于创建具有以下输出的文件/var/www/html/index.html :
Welcome to HOSTNAME on IPADDRESS
其中,HOSTNAME 是受管节点的完全限定域名,IPADDRESS 则是受管节点的IP 地址。
按照下方所述,创建一个使用此角色的playbook /home/curtis/ansible/newrole.yml:
该playbook在webservers主机组的主机上运行。[curtis@control ansible]$ ansible-galaxy init roles/apache
[curtis@control ansible]$ cat roles/apache/templates/index.html.j2
Welcome to {{ansible_fqdn}} on {{ansible_default_ipv4.address}}[curtis@control ansible]$ cat roles/apache/tasks/main.yml
#tasks file for roles/apache
- yum:
name: httpd
state: installed
- yum:
name: firewalld
state: installed
- service:
name: httpd
state: restarted
enabled: yes
- service:
name: firewalld
state: restarted
enabled: yes
- firewalld:
service: http
permanent: yes
immediate: yes
state: enabled
- template:
src: index.html.j2
dest: /var/www/html/index.html
setype: httpd_sys_content_t[curtis@control ansible]$ cat newrole.yml
- hosts: webservers
roles:
- apache
检查
curl node1
从 Ansible Galaxy 使用角色
- 根据下列要求,创建一个名为 /home/curtis/ansible/roles.yml 的 playbook :
- playbook 中包含一个 play, 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。
- 此角色配置一项服务,以在 webservers 主机组中的主机之间平衡 Web 服务器请求的负载。
- 浏览到 balancers 主机组中的主机(例如
http://node5.area12.example.com
)将生成以下输出:
Welcom to node3.area12.example.com on 172.24.12.8 - 重新加载浏览器将从另一 Web 服务器生成输出:
Welcom to node4.area12.example.com on 172.24.12.9
- 浏览到 balancers 主机组中的主机(例如
- playbook 中包含一个 play, 该 play 在 webservers 主机组中的主机上运行并将使用 phpinfo 角色。
- 请通过 URL/hello.php 浏览到 webservers 主机组中的主机将生成以下输出:
Hello PHP World from FQDN
其中,FQDN 是主机的完全限定名称。
例如,浏览到http://node3.area12.example.com/hello.php
将会生成以下输出:
Hello PHP World from node3.area12.example.com
另外还有 PHP 配置的各种详细信息,如安装的 PHP 版本等。
同样,浏览到http://node4.area12.example.com/hello.php
会生成以下输出:
Hello PHP World from node4.area12.example.com
另外还有 PHP 配置的各种详细信息,如安装的 PHP 版本等。[curtis@control ansible]$cat roles.yml
- hosts: all
- hosts: balancers
roles:
- balancer
- hosts: webservers
roles:
- phpinfo
tasks:
- yum:
name: firewalld
state: installed
- service:
name: firewalld
state: restarted
enabled: yes
- firewalld:
service: http
permanent: yes
immediate: yes
state: enabled检查
[curtis@control ansible]$curl node5
Welcom to node3.area12.example.com on 172.24.12.8
[curtis@control ansible]$curl node5
Welcom to node4.area12.example.com on 172.24.12.9
[curtis@control ansible]$curl node3/hello.php -s | head -1
Hello PHP World from node3.area12.example.com<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
- 请通过 URL/hello.php 浏览到 webservers 主机组中的主机将生成以下输出:
创建和使用分区
- 编写一个剧本位置在/home/curtis/ansible/partition.yml,在所有主机上运行,需求如下:
- 该剧本包含一个play,该play在balancers主机组上运行
- 在vdb中,创建单个主分区,编号是1,大小10G
- 格式化成ext4文件系统,挂载到/newpart,
- 在设备vdd上创建单个主分区,编号是1,大小10G
- 格式化成ext4文件系统,挂载到/newpart1,
- 如果无法创建请求的分区大小,则使用错误消息Could not create parton of that size,转而应用分区800M
- 如果设备vdd不存在,则输出错误提示disk vdd done not exist
####考试时的大小vdb硬盘是满足的,可以直接格式化挂载。答案的方法是先要对vdb进行判断,具体做法看考题环境。
[curtis@control ansible]$cat partition.yml
- hosts: all
tasks:
- block:
- parted:
device: /dev/vdb
number: 1
state: present
part_end: 10GiB
rescue:
- debug:
msg: "Could not create partion of that size"
- parted:
device: /dev/vdb
number: 1
state: present
part_end: 1GiB
- filesystem:
fstype: ext4
dev: /dev/vdb1
- file:
path: /newpart
state: file
- mount:
path: /newpart
src: /dev/vdb1
fstype: ext4
state: mounted
- debug:
msg: "disk vdd done not exist"
when: ansible_devices.vdd is undefined
failed_when: ansible_devices.vdd is undefined
- block:
- parted:
device: /dev/vdd
number: 1
state: present
part_end: 10GiB
rescue:
- debug:
msg: "Could not create partion of that size"
- parted:
device: /dev/vdd
number: 1
state: present
part_end: 1GiB
- filesystem:
fstype: ext4
dev: /dev/vdd1
- file:
path: /newpart1
state: file
- mount:
path: /newpart1
src: /dev/vdd1
fstype: ext4
state: mounted检查
[curtis@control ansible]$ansible balancers -a “lsblk”
生成主机文件
- 将一个初始模板文件从
http://rhgls.area12.example.com/materials/hosts.j2
下载到 /home/curtis/ansible
完成该模板,以便用它生成以下文件:
- 针对每个清单主机包含一行内容,其格式与 /etc/hosts 相同
- 创建名为 /home/curtis/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.12.6 node1.area12.example.com node1
172.24.12.7 node2.area12.example.com node2
172.24.12.8 node3.area12.example.com node3
172.24.12.9 node4.area12.example.com node4
172.24.12.10 node5.area12.example.com node5[curtis@control ansible]$cat hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for i in groups.all %}
{{ hostvars[i].ansible_default_ipv4.address }} {{ hostvars[i].ansible_fqdn }} {{ hostvars[i].ansible_hostname }}
{%endfor%}[curtis@control ansible]$cat hosts.yml
- hosts: all
- hosts: dev
tasks:
- template:
src: hosts.j2
dest: /etc/myhosts检查
[curtis@control ansible]$ansible all -a “cat /etc/myhosts”
修改文件内容
- 按照下方所述,创建一个名为 /home/curtis/ansible/issue.yml 的 playbook :
- 该 playbook 将在所有清单主机上运行
- 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:
- 在 dev 主机组中的主机上,这行文本显示 为:Development
- 在 test 主机组中的主机上,这行文本显示 为:Test
- 在 prod 主机组中的主机上,这行文本显示 为:Production
[curtis@control ansible]$cat issure.yml
- hosts: all
tasks:
- copy:
content: Development
dest: /etc/issue
when: "'dev' in group_names"
- copy:
content: Test
dest: /etc/issue
when: "'test' in group_names"
- copy:
content: Production
dest: /etc/issue
when: "'prod' in group_names"
检查
[curtis@control ansible]$ansible all -a "cat /etc/issue"
创建 Web 内容目录
- 按照下方所述,创建一个名为 /home/curtis/ansible/webcontent.yml 的 playbook :
- 该 playbook 在 dev 主机组中的受管节点上运行
- 创建符合下列要求的目录 /webdev :
- 所有者为 webdev 组
- 具有常规权限:owner=read+write+execute , group=read+write+execute ,other=read+execute
- 具有特殊权限:设置组ID
- 用符号链接将 /var/www/html/webdev 链接到 /webdev
- 创建文件 /webdev/index.html ,其中包含如下所示的单行文件: Development
- 在 dev 主机组中主机上浏览此目录(例如
http://node1.area12.example.com/webdev/
)将生成以下输出:
Development[curtis@control ansible]$cat webcontent.yml
- hosts: dev
tasks:
- yum:
name: httpd
state: installed
- yum:
name: firewalld
state: installed
- service:
name: httpd
state: started
enabled: yes
- service:
name: firewalld
state: started
enabled: yes
- firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- group:
name: webdev
state: present
- file:
path: /webdev
state: directory
mode: '2775'
group: webdev
- file:
src: /webdev
dest: /var/www/html/webdev
state: link
- copy:
dest: /webdev/index.html
content: 'Development'
- sefcontext:
target: '/webdev(/.*)?'
setype: httpd_sys_content_t
state: present
- command: restorecon -rv /webdev检查
[curtis@control ansible]$curl node1/index.html
生成硬件报告
- 创建一个名为 /home/curtis/ansible/hwreport.yml 的 playbook ,它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt :
- 清单主机名称
- 以 MB 表示的总内存大小
- BIOS 版本
- 磁盘设备 vda 的大小
- 磁盘设备 vdb 的大小
- 输出文件中的每一行含有一个 key=value 对。
您的 playbook 应当: - 从
http://rhgls.area12.example.com/materials/hwreport.empty
下载文件,并将它保存为 /root/hwreport.txt - 使用正确的值改为 /root/hwreport.txt
- 如果硬件项不存在,相关的值应设为 NONE
[curtis@control ansible]$cat hwreport.yml
- hosts: all
tasks:
- get_url:
url: http://rhgls.area12.example.com/materials/hwreport.empty
dest: /root/hwreport.txt
- replace:
path: /root/hwreport.txt
regexp: inventoryhostname
replace: "{{ansible_hostname | default(none) }}"
- replace:
path: /root/hwreport.txt
regexp: BIOS_version
replace: "{{ansible_bios_version | default(none) }}"
- replace:
path: /root/hwreport.txt
regexp: disk_vda_size
replace: "{{ansible_devices.vda.size | default(none) }}"
- replace:
path: /root/hwreport.txt
regexp: disk_vdb_size
replace: "{{ansible_devices.vdb.size | default(none) }}"
- replace:
path: /root/hwreport.txt
regexp: memory_in_MB
replace: "{{{ansible_memtotal_mb | default(none)}}"检查
[curtis@control ansible]$ansible node1 -a "cat /root/hwreport.txt"
创建密码库
- 按照下方所述,创建一个 Ansible 库来存储用户密码:
- 库名称为 /home/curtis/ansible/locker.yml
- 库中含有两个变量,名称如下:
- pw_developer,值为 Imadev
- pw_manager,值为 Imamgr
- 用于加密和解密该库的密码为 whenyouwishuponastar
- 密码存储在文件 /home/curtis/ansible/secret.txt 中
[curtis@control ansible]$cat secret.txt
whenyouwishuponastar
[curtis@control ansible]$ansible-vault view --vault-password-file=secret.txt locker.yml
pw_developer: Imadev
pw_manager: Imamgr
创建用户帐户
- 从
http://rhgls.area12.example.com/materials/user_list.yml
下载要创建的用户的列表,并将它保存到 /home/curtis/ansible
- 在本次考试中使用在其他位置创建的密码库 /home/curtis/ansible/locker.yml 。
- 创建名为 /home/curtis/ansible/users.yml 的 playbook ,从而按以下所述创建用户帐户:
- 职位描述为 developer 的用户应当:
- 在 dev 和 test 主机组中的受管节点上创建
- 从 pw_developer 变量分配密码
- 分配对应用户id
- 是补充组 devops 的成员
- 职位描述为 manager 的用户应当:
- 在 prod 主机组中的受管节点上创建
- 从 pw_manager 变量分配密码
- 分配对应用户id
- 是补充组 opsmgr 的成员
- 密码采用 SHA512 哈希格式。
- 您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件 /home/curtis/ansible/secret.txt 正常运行。
[curtis@control ansible]$cat users.yml
- hosts: all
vars_files:
- locker.yml
- user_list.yml
tasks:
- group:
name: devops
state: present
- group:
name: opsmgr
state: present
- user:
name: "{{ item.name }}"
state: present
password: "{{ pw_developer |password_hash('sha512')}}"
uid: "{{item.uid}}"
groups: test
when: ('dev' in group_names or 'test' in group_names) and (item.job == "developer")
loop: "{{ users }}"
- user:
name: "{{ item.name }}"
state: present
uid: "{{item.uid}}"
password: "{{ pw_manager |password_hash('sha512')}}"
groups: ops
when: ('prod' in group_names ) and (item.job == "manager")
loop: "{{ users }}"执行:
[curtis@control ansible]$ansible-playbook users.yml --vault-password-file=secret.txt
验证:
[curtis@control ansible]$ansible all -a "tail -2 /etc/passwd"
- 职位描述为 developer 的用户应当:
更新 Ansible 库的密钥
- 按照下方所述,更新现有 Ansible 库的密钥:
- 从
http://rhgls.area12.example.com/materials/salaries.yml
下载 Ansible 库到 /home/curtis/ansible- 当前的库密码为 insecure8sure
- 新的库密码为 bbs2you9527
- 库使用新密码保持加密状态
[curtis@control ansible]$ansible-vault rekey salaries.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
配置cron作业
- 创建名为/home/curtis/ansible/cron.yml的playbook,在所有托管主机上运行为用户curtis创建如下cron作业:
- 用户curtis必须配置运行每隔2分钟执行logger “EX294 in progress”的cron作业
[curtis@control ansible]$cat cron.yml
- hosts: all
tasks:
- cron:
user: curtis
minute: "*/2"
job: logger "EX294 in progress"验证:
[curtis@control ansible]$ansible all -a "crontab -l -u curtis"
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1096485692@qq.com