红帽RHCE考试下午-RHCE(RH294)
RH294任务概览
- 考试时间4个小时,6台虚拟机,15道题
- 原来通过脚本或者集群做的题现在都需要使用playbook实现
- 考试时大概有6台虚拟服务器,都已经做好了互相的免密
- 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
- 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
- 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
- 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
- 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分
11. 利用playbook创建 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
注意:
准备个工作
- 考试期间不需要做
ansible-doc file ## 查看file模块
完成步骤
- 先安装httpd服务呀,因为可能没装
- 再将httpd服务设置为开机启动呀,因为可能没设
- 还需要配置防火墙才能访问呀,因为可能没启用
- 这才正式开始创建体重要求的目录,记得用setype设定httpd_sys_content_t
- 然后创建题中要求的软链接呀
- 最后创建题中要求的访问内容文件,记得用setype设定httpd_sys_content_t
[student@workstation ansible]$ vim webcontent.yml
---
- hosts: dev
tasks:
## 由于不确定dev上面是否已经开启了httpd服务,所以先装一下httpd
- name:
yum:
name: httpd
state: present
- name:
service:
name: httpd
state: started
enabled: yes
## 防火墙如果测试没问题也可以不用设置
- name:
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: create dir
file:
path: /webdev
group: devops
state: directory
mode: 2775
setype: httpd_sys_content_t
- name: createlink
file:
src: /webdev
dest: /var/www/html/webdev
state: link
- name: create a file
copy:
content: "Development\n"
dest: /webdev/index.html
setype: httpd_sys_content_t
[student@workstation ansible]$ ansible-playbook webcontent.yml
- 验证还是要做的
curl http://servera.lab.example.com/webdev/
- 这道题非常容易坑,有可能会做不出来结果
在selinux中如果content值不对,可能访问不到,
在生成目录的时候,通过setype直接把文件夹的值给改掉
在生成页面文件的时候也要同时改掉setype就完事了
注意:使用ll -Z查看文件和文件夹的content值,如果不知道应该是什么,拖回去上层html目录创建一个文件看一下值
通过指定se的type值来使文件得以访问正常
cd /var/www/html
touch a.log
ll -Z a.log
考察的知识点
ansible file模块
- 功能:设置文件属性,创建软链接等
ansible-doc file
- file模块常用的参数
path 被管理文件的路径
state
## 状态常用参数:
absent 删除目标文件
touch 如果目标文件不存在,则创建文件;如果存在,则更改目标文件的时间戳
directory 创建目录
hard 给目标文件创建硬链接(与src一起使用)
link 给目标文件创建软链接(与src一起使用)
setype 设置目标文件安全上下文属性
owner 设备目标文件的所属主
group 设置目标文件的所属组
mode 设置文件的权限
mode常用的格式:文件:0644 目录:0755
或者用引号:文件:'0644' 目录:'0755'
也开始指定符号模式:mode: u+rwx 或者 mode: u=r,g=w,o=x 或者:mode: u+r,g+w,o+x
src 指定链接文件的路径
dest 指定所索取的文件所要保存的目录
#创建空文件
ansible all -m file -a 'path=/data/test.txt state=touch'
ansible all -m file -a 'path=/data/test.txt state=absent'
ansible all -m file -a "path=/root/test.sh owner=wang mode=755"
#创建目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
#创建软链接
ansible all -m file -a 'src=/data/testfile path|dest|name=/data/testfile-link state=link'
#创建目录
ansible all -m file -a 'path=/data/testdir state=directory'
#递归修改目录属性,但不递归至子目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
#递归修改目录及子目录的属性
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql recurse=yes"
修改默认安全上下文。
- 在selinux开启的情况下,目录和文件的安全上下文需要设置为
httpd_sys_content_t
,apahce的httpd才能访问呢
[root@localhost ~]# mkdir /www
#新建/www/目录,打算用这个目录作为apache的网页主目录,而不再使用/var/www/html/目录
[root@localhost ~]# ls -Zd /www/
drwxr-xr-x.root root unconfined_u:object_r:default_t:s0 /www/
#而这个目录的安全上下文类型是default_t,那么apache进程当然就不能访问和使用/www/目录了
- 这个目录是手工建立的,并不是系统默认目录,所以并没有默认安全上下文,需要我们手工设定
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
#这条命令会给/www/目录及目录下的所有内容设定默认安全上下文类型是httpd_sys_content_t
[root@localhost ~# semanage fcontext -l | grep "/www"
#…省略部分输出…
/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
#/www/目录的默认安全上下文出现了
- 恢复目录本身安全上下文到重设后的默认值
[root@localhost ~]# ls -Zd /www/
drwxr-xr-x.root root unconfined_u:object_r:default_t:s0 /www/
#但是查询发现/www/目录的安全上下文并没有进行修改,那是因为我们只修改了默认安全上下文,而没有修改目录的当前安全上下文
[root@localhost ~]# restorecon -Rv /www/
restorecon reset /www context
unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
#恢复一下/www/目录的默认安全上下文,发现类型已经被修改为httpd_sys_content_t