CE习题指导
注意:此指导主要针对重点进行分析,有些简单的步骤没有涉及,大家参考习题答案即可
习题练熟后即可找班主任约考,考试那天要带身份证,签字笔,准备一个电子邮箱(接收证书用)
01,安装和配置 ansible 环境
该题绝不允许出任何错误!
1)比较容易,su - alice切换到alice账户后,使用sudo yum -y install ansible即可
2)按参考习题答案写即可,没有难度,不过要记住嵌套组的写法[webtest:children]
3)这个需求是写配置文件,比较麻烦,不过可以参考默认的配置文件,复制粘贴即可
以下内容都可以在默认配置文件/etc/ansible/ansible.cfg 里面找到,搜索一下即可
[defaults]
inventory = inventory //主机清单文件
remote_user = alice //连接受管机的远程用户名
roles_path = roles //指定默认的角色目录
[privilege_escalation] //设置用户 sudo 提权
become=True //需要提权
become_method=sudo //提权方式为 sudo
become_user=root //提权为 root
become_ask_pass=False //无需验证密码
----------------------------------------------------------------------------
02, 创建和运行 Ansible 临时命令
该题绝不允许出任何错误!
该题目的是给所有被控主机配2个yum仓库,先用ansible-doc -l | grep yum 查到 搭建yum的模块名字叫 yum_repository,然后ansible-doc yum_repository 可以看帮助,里面有大部分参数,可以通过搜索EXAMPLE找到各种例子。
最后通过脚本的方式把命令写进去,别忘记加x权限给脚本
另外题目给的比如仓库名、描述、仓库软件源地址等都可以用复制粘贴的方式避免输入错误
----------------------------------------------------------------------------
03,编写剧本远程安装软件
该题目是第一道剧本题,非常简单,属于送分题,按参考习题答案多练习即可。
这种剧本题大家可能在不同场合碰到了不同书写方式,比如yum模块装包这段:
- yum: pkg="php,tftp"
和
- yum:
name:
- php
- tftp
两种写法最终都可以成功安装软件包,具体用哪一种不必纠结,都可以,自己决定即可,只要最终完成题目需求。
-----------------------------------------------------------------------------
04. 安装并使用系统角色
第一道角色的题,难度不高,先用yum list | grep roles 命令查到系统角色包叫rhel-system-roles,用yum安装即可,然后通过rpm -ql rhel-system-roles命令查看到这个包所涉及到的目录有个叫/usr/share/ansible/roles/的,那些系统角色都在里面。
比如要使用timesync这个角色,可以先执行
cp -r /usr/share/ansible/roles/rhel-system-roles.timesync roles/timesync
将rhel-system-roles.timesync目录拷贝到/home/alice/ansible/roles里
然后 cat roles/timesync/README.md可以参考帮助文档编写剧本文件找到下面内容
vars:
timesync_ntp_servers:
- hostname: foo.example.com
iburst: yes
将其中的域名改成题目要求的ip即可,详细剧本可以参考习题答案
注意该剧本在执行时可能会遇到红色错误提示,可以无视即可,只要最终失败任务数量为0即可
---------------------------------------------------------------------------
另外该系统角色也可以配置selinux,方法如下
cp -r /usr/share/ansible/roles/rhel-system-roles.selinux/ /home/alice/ansible/roles/selinux //拷贝角色到roles目录
cat /home/alice/ansible/roles/selinux/README.md //查看 readme 帮助文档
[alice@control ansible]$ vim /home/alice/ansible/selinux.yml //编写剧本文件,给所有被控主机开启selinux
---
- hosts: all
vars: //设置剧本变量,变量参考 README 文档
selinux_policy: targeted
selinux_state: enforcing //开启selinux
roles:
- role: selinux //调用角色
然后用ansible-playbook selinux.yml执行剧本
----------------------------------------------------------------------------
05. 通过 galaxy 安装角色
比较容易的题,送分,参考习题答案写即可
注意,像http://study.lab0.example.com/roles/haproxy.tar这样的路径要复制粘贴避免错误,还有该题的yml文件是写在roles下!
最后执行ansible-galaxy install -r roles/down.yml 即可让新角色安装到roles目录中,因为配置文件ansible.cfg中指定了角色的位置就是roles目录
注意该题和后面的 ”创建及使用自定义角色” 与 “使用之前通过 galaxy 下载的角色” 两道题是连贯的,要按顺序做
------------------------------------------------------------------------------
06. 创建及使用自定义角色
步骤比较多的题,难度中等,多利用ansible-doc查看模块用法可以比较轻松的完成
比如防火墙可以用ansible-doc firewalld,然后搜索/EXAMPLE
另外Welcome to HOSTNAME on IPADDRESS 这句话要复制粘贴到index.html.j2中,然后修改其中的HOSTNAME为变量 {{ ansible_fqdn }},代表完全域名,IPADDRESS改为 {{ ansible_eth0.ipv4.address }}代表网卡ip,注意这里考试时不一定网卡就叫eth0,可以通过ip add show查看
整个答题过程参考习题答案写即可
------------------------------------------------------------------------------
07. 使用之前通过 galaxy 下载的角色
这个题是利用test05 主机组(里面就是一个node5主机)运行haproxy角色,这个角色可以实现类似nginx代理服务器的效果(比如之前nginx课程中讲过利用proxy、web1、web2搭建集群,访问proxy会轮询显示web1和web2的页面)
也就是说这个题做完,多次访问node5的网页会看到下面轮询显示node3和node4的页面
其中webtest主机组(里面是node3和node4)要运行 myphp 角色,这样就能得到新的页面index.php
node5不要忘记在剧本中还要关闭防火墙才能顺利让别人访问
整个答题过程参考习题答案写即可
------------------------------------------------------------------------------
08. 编写剧本远程管理逻辑卷
比较有挑战的题出现了!这个题本身的需求不难,就是利用search卷组创建名叫mylv且大小为1000M的逻辑卷,但是有些被控主机没这个卷组,有些也不够1000M,所以可以按这个思路解决:
首先,把根本就没有search卷组的被控主机踢掉,方法是(以下两种都可以,二选一)
tasks:
- debug:
msg: "VG not found"
when: "'search' not in ansible_lvm.vgs" //search不存在则显示报错
failed_when: "'search' not in ansible_lvm.vgs" //停止后面的任务
或
tasks:
- fail: msg="VG not found" //喊出这段信息后该主机就算失败,就可以停止后续任务
when: "'search' not in ansible_lvm.vgs" //search不存在时执行fail模块的任务
然后使用block完成后续任务
- block: //配置指令块
- lvol: lv=mylv size=1000M vg=search force=yes //创建逻辑卷,大小1000M
rescue: //若块操作失败,则执行补救
- debug: msg="insufficient free space" //喊出”空间不足”
- lvol: lv=mylv size=500M vg=search force=yes //改成创建500M大小
- filesystem: dev=/dev/search/mylv fstype=ext4 force=yes //最后再格式化
整个答题过程参考习题答案写即可
------------------------------------------------------------------------------
如果要求创建普通分区(注意,练习环境可能没有vdc硬盘,可以自己添加,比如给node2添加个2G的,node5添加个1G的)
使用vdc创建1500M分区,使用ext4格式化,空间不够的话改为800M,如果vdc不存在则显示错误信息vdc not found
---
- hosts: all
tasks:
- debug:
msg: "vdc not found"
when: "'vdc' not in ansible_devices" //如果哪个机器没有vdc硬盘,就执行上面的debug任务
failed_when: "'vdc' not in ansible_devices" //如果哪个机器没有vdc硬盘,就算失败,停止之后任务
- block:
- parted: //调用分区模块
device: /dev/vdc //对vdc分区
number: 1 //第1个分区
state: present //执行分区
part_end: 1500MiB //大小1500M
rescue: //当上面任务失败时执行后续任务
- debug:
msg: "insufficient free space" //喊出空间不足
- parted:
device: /dev/vdc
number: 1
state: present
part_end: 800MiB //改成划分800M大小的分区
always:
- filesystem: //最后,凡是成功分区的无论大小都格式化
fstype: ext4 //格式化为ext4文件系统
dev: /dev/vdc1 //对vdc1格式化
ansible all -a 'lsblk' //查看所有主机硬盘信息
ansible node2,node5 -a 'blkid /dev/vdc1' //查看格式化结果是否为ext4
---------------------------------------------------------------
09. 根据模板部署主机文件
首先用wget http://study.lab0.example.com/materials/newhosts.j2 下载模板,进行修改,注意不要复制粘贴题目最终结果,这里要用变量
该文件改成以下状态:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain 4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain 6
{% for i in groups.all %} //这里是调用for循环,groups.all是魔法变量,代表所有主机的主机名,i代表每个不同的主机名循环显示,比如变量hostvars[i].ansible_fqdn这样写,就代表不同主机的完全主机名
{{hostvars[i].ansible_eth0.ipv4.address}} {{hostvars[i].ansible_fqdn}} {{hostvars[i].ansible_hostname}}
{% endfor %} //这里是for语法的结束
---------------------------------------------------------------
10. 编写剧本修改远程文件内容
该题要求在所有主机运行剧本,可以通过编写判断语句分析哪个被控主机在哪个组
这里使用的关键魔法变量是group_names,代表当前被控主机的所在组
- copy:
content: "test01" //该参数可以定义要拷贝的文字
dest: /etc/issue
force: yes
when: "'test01' in group_names" //判断,test01字符串是否在你的组名中,如果在了就说明这个被控主机是在test01组
---------------------------------------------------------------
11. 编写剧本部署远程 Web 目录
该题步骤比较多,而且有些环节讲究顺序,比如创建目录/webdev,要先创建webdev组,还有题目没说要安装网站,但是最后要让node1以网站形式显示信息,所以要写安装网站的步骤,还有网站的内容不要自己敲,“It's works!”这句话要复制粘贴。
最后不要忘记设置防火墙放行http数据,还有调整selinux上下文,方法如下:
在node1主机敲 ll -Z /webdev 可以查看到红色字体,和ll -Z /var/www/html/的不一样,这就导致selinux限制了网站对/webdev的访问
-rw-r--r--. 1 root root system_u:object_r:default_t:s0 11 May 14 11:51 index.html
root root unconfined_u:object_r:httpd_sys_content_t:s0 7 May 14 11:51 webdev -> /webdev
可以在剧本最后加上一句 -shell: chcon -R -t httpd_sys_content_t /webdev 就能让/webdev满足selinux要求,chcon可以修改selinux上下文,-R是递归,-t是改的类型为httpd_sys_content_t
以下是整个题目剧本参考:(注意,由于复制粘贴问题,所以可能有些该缩进两格的地方显示没缩进,大家自己调节)
---
- hosts: test01
tasks:
- group: //创建组
name: webdev
state: present
- file: //创建目录
name: /webdev //位置在根下
group: webdev //加入的组是webdev
state: directory //类型是目录
mode: "2775" //定义权限,2是setGID的特殊权限,775是普通权限
- yum:
name: httpd //安装网站
- file:
src: /webdev //源文件
name: /var/www/html/webdev //制作连接文件
state: link //文件类型是连接文件
force: yes //即使源不存在也创建,其实可以不写,源肯定存在,刚才已经创建了
- copy:
content: "It's works!" //拷贝的文字
dest: /webdev/index.html //创建网站文件
force: yes // 强制覆盖,默认覆盖,可以不写
- service:
name: httpd //开启网站服务
state: restarted
enabled: yes //开机自启
- firewalld:
service: http //让防火墙放行网站数据
permanent: yes //永久生效
state: enabled //让该防火墙设置启用
immediate: yes //立刻生效
- shell: chcon -R -t httpd_sys_content_t /webdev //修改上下文,让selinux开启的状态下网站依然能正常看到 http://node1/webdev/里面的内容,访问这个地址用server1的浏览器测试
---------------------------------------------------------------
12. 编写剧本为受管机生成硬件报告
该题可以另开一个窗口 通过ansible node1 -m setup | less 命令查看变量
---
- hosts: all
tasks:
- get_url:
url: http://study.lab0.example.com/materials/hardware.empty //下载文件
dest: /root/hardware.txt //下载后改名保存的位置
- replace: //接下来就把键值对按要求替换
path: /root/hardware.txt
regexp: inventoryhostname //替换的内容,这个内容在hardware.empty或hardware.txt里找
replace: "{{inventory_hostname}}" //换成清单中的主机名
- replace:
path: /root/hardware.txt
regexp: memory_in_MB
replace: "{{ansible_memtotal_mb}}" //换成总内存大小txt
- replace:
path: /root/hardware.txt
regexp: BIOS_version
replace: "{{ansible_bios_version}}" //换成bios版本号
- replace:
path: /root/hardware.txt
regexp: disk_vda_size
replace: "{{ansible_devices.vda.size}}" //换成a硬盘大小
- replace:
path: /root/hardware.txt
regexp: disk_vdb_size
replace: "{{ansible_devices.vdb.size if ansible_devices.vdb.size is defined else 'NONE'}}" //换成b硬盘大小,如果没有b硬盘就显示NONE
该题的剧本运行后,可以通过ansible all -a 'cat /root/hardware.txt' 查看结果
---------------------------------------------------------------
13. 创建保险库文件
该题比较简单,直接在control主机完成,由于与下一题有直接关联,要按顺序做,且不能有错
[alice@control ansible]$ echo "pwd@1234" > secret.txt //创建存了密码的文件
[alice@control ansible]$ ansible-vault create passdb.yml --vault-password-file=secret.txt //用刚才的密码文件加密passdb.yml文件,而且里面要写
pw_dev: ab1234 //注意这里的冒号后面有空格
pw_man: cd5678
[alice@control ansible]$ ansible-vault view passdb.yml //输入密码即可查看
---------------------------------------------------------------
14. 编写剧本为受管机批量创建用户,要求使用保险库中的密码
应该是ce考试中最难一题,涉及到了四个文件,users.yml是剧本文件,name_list.yml是账户列表变量文件,passdb.yml是密码变量文件,secret.txt 是存了密码的文件,这里的密码可以解密passdb.yml
- hosts: test01,test02 //按题目要求,先在这两个主机组创建职位描述是dev的账户
vars_files: //依次读取下面两个存了变量的文件
- name_list.yml //账户列表变量文件
- passdb.yml //是密码变量文件
tasks:
- group: //创建组
name: devops //组名叫devops
- user:
name: "{{item.name}}" //创建账户
password: "{{pw_dev |password_hash('sha512')}}" //利用变量pw_dev配置密码
groups: devops //附加组是devops
when: item.job == 'dev' //判断,当职位描述是dev时,才执行创建账户的任务
loop: "{{users}}" //循环调用users里面的变量,这个信息是读取了name_list.yml得到的
- hosts: web //该剧和上述情况基本一致,就是组名、账户名、密码变量等内容不一样,下面不再多做描述
vars_files:
- name_list.yml
- passdb.yml
tasks:
- group:
name: opsmgr
- user:
name: "{{item.name}}"
password: "{{pw_man |password_hash('sha512')}}"
groups: opsmgr
when: item.job == 'man'
loop: "{{users}}"
运行剧本之后,可以分别在test01,test02主机组查看应该只有tom账户,而不会有jerry ,web主机组只有jerry账户,而不会有tom
---------------------------------------------------------------
15. 重设保险库密码
该题是最简单的一道,只要用ansible-vault命令即可查询到rekey是重设密码
具体过程参考习题答案写即可
---------------------------------------------------------------
补充题:
计划任务(cron模块)
使用alice账户每隔5分钟执行date >> ~/abcd.txt任务
---
- hosts: node1
tasks:
- cron: //调用计划任务模块
name: myjob //描述,实际做题时看题目需求,如果没需求可以不写
minute: "*/5" //每隔5分钟,这里只提到了分钟,其他没写就都是 *
job: "date >> ~/abcd.txt" //执行任务
user: alice //为alice定义
[root@node1 ~]# crontab -u alice -l //到node1主机查看
---------------------------------------------------------------
mount模块,可以实现自动挂载
---
- hosts: node5
tasks:
- mount: //挂载模块
path: /xyz //挂载到xyz目录
src: /dev/vdc1 //将vdc1这个分区挂载到上述目录
fstype: ext4 //文件系统
state: mounted //执行挂载任务
[root@node5 ~]# mkdir /xyz //可以在node5上创建这个目录作为测试
[root@node5 ~]# lsblk //执行剧本之后查看
[root@node5 ~]# cat /etc/fstab //执行剧本之后查看
---------------------------------------------------------------
习题练熟后即可找班主任约考,考试那天要带身份证,签字笔,准备一个电子邮箱(接收证书用)
预祝考试顺利!!