红帽RHCE考试下午-RHCE(RH294)

RH294任务概览

  • 考试时间4个小时,6台虚拟机,15道题
  • 原来通过脚本或者集群做的题现在都需要使用playbook实现
  • 考试时大概有6台虚拟服务器,都已经做好了互相的免密
  • 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
  • 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
  • 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
  1. 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
  2. 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分

11. 利用playbook创建 Web 内容目录

  • 按照下方所述,创建一个名为 /home/student/ansible/webcontent.yml 的 playbook:
  • 该 playbook 在 dev 主机组中的受管节点上运行
任务要求
  1. 创建符合下列要求的目录 /webdev: 所有者为 devops 组具有常规权限:
    owner=read+write+execute,group=read+write+execute, other=read+execute
  2. 具有特殊权限: set group ID
  3. 用符号链接将 /var/www/html/webdev 链接到 /webdev
  4. 创建文件 /webdev/index.html,其中包含如下所示的单行文本:Development
  5. 在 dev 主机组中主机上浏览此目录(例如 http://servera.lab.example.com/webdev/ )将生成以下输出:Development
    注意:
准备个工作
  • 考试期间不需要做
ansible-doc file ## 查看file模块
完成步骤
  1. 先安装httpd服务呀,因为可能没装
  2. 再将httpd服务设置为开机启动呀,因为可能没设
  3. 还需要配置防火墙才能访问呀,因为可能没启用
  4. 这才正式开始创建体重要求的目录,记得用setype设定httpd_sys_content_t
  5. 然后创建题中要求的软链接呀
  6. 最后创建题中要求的访问内容文件,记得用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