考试信息 考试时间:4小时 总分:300分 及格分:210
安装和配置 Ansible 按照下方所述,在控制节点 172.25.250.200 上安装和配置 Ansible: 安装所需的软件包 创建名为 /home/greg/ansible/inventory 的静态清单文件,以满足以下要求:
172.25.250.9 是 dev 主机组的成员
172.25.250.10 是 test 主机组的成员
172.25.250.11 和 172.25.250.12 是 prod 主机组的成员
172.25.250.13 是 balancers 主机组的成员
prod 组是 webservers 主机组的成员 创建名为 /home/greg/ansible/ansible.cfg 的配置文件,以满足以下要求:
主机清单文件为 /home/greg/ansible/inventory
playbook 中使用的角色的位置包括 /home/greg/ansible/roles
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 yum -y install ansiblemkdir /home/greg/ansible/ vim /home/greg/ansible/inventory [dev] 172.25.250.9 [test ] 172.25.250.10 [prod] 172.25.250.11 172.25.250.12 [balancers] 172.25.250.13 [webservers:children] prod vim /home/greg/ansible/ansible.cfg [defaults] inventory =/home/greg/ansible/inventory roles_path = /home/greg/ansible/roles [privilege_escalation] become=True become_method=sudo become_user=root become_ask_pass=False
验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@bastion ansible] @all: |--@balancers: | |--172.25.250.13 |--@dev: | |--172.25.250.9 |--@test : | |--1782.25.250.10 |--@ungrouped: |--@webservers: | |--@prod: | | |--172.25.250.11 | | |--172.25.250.12
创建和运行 Ansible 临时命令 作为系统管理员,您需要在受管节点上安装软件。 请按照正文所述,创建一个名为 /home/greg/ansible/adhoc.sh 的 shell 脚本,该脚本将使用Ansible 临时命令在各个受管节点上安装 yum 存储库:
存储库 1:
存储库 2:
1 2 3 4 5 6 7 8 9 10 11 12 vim /home/greg/ansible/adhoc.sh ansible all -m yum_repository -a "name=EX294_BASE description='EX294 base software' baseurl=ftp://host.domain8.example.com/dvd/BaseOS enabled=yes gpgcheck=yes gpgkey=ftp://host.domain8.example.com/dvd/RPM-GPG-KEY-redhat-release" ansible all -m yum_repository -a "name=EX294_STREAM description='EX294 stream software' baseurl=ftp://host.domain8.example.com/dvd/AppStream enabled=yes gpgcheck=yes gpgkey=ftp://host.domain8.example.com/dvd/RPM-GPG-KEY-redhat-release" chmod +x /home/greg/ansible/adhoc.sh /home/greg/ansible/ ./adhoc.sh
提示:查询模块:ansible-doc -l |grep yum
查询模块帮助:ansible-doc yum_repository
验证:
1 ansible all -m shell -a "yum repolist all"
安装软件包 创建一个名为 /home/greg/ansible/packages.yml 的 playbook :
将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上
将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上
将 dev 主机组中主机上的所有软件包更新为最新版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 vim /home/greg/ansible/packages.yml --- - hosts: dev,test ,prod tasks: - name: install php mariadb yum: name=php,mariadb state=present - hosts: dev tasks: - name: rmp grpup yum: name="@RPM Development Tools" state=present - name: upgrade software yum: name='*' state=latest ansible-playbook /home/greg/ansible/packages.yml --syntax-check ansible-playbook /home/greg/ansible/packages.yml
查看软件包组:yum grouplist
使用 RHEL 系统角色 安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook /home/greg/ansible/timesync.yml :
在所有受管节点上运行
使用 timesync 角色
配置该角色,以使用当前有效的 NTP 提供商
配置该角色,以使用时间服务器 172.25.250.250
配置该角色,以启用 iburst
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 yum search *rhel*roles* yum -y install rhel-system-roles.noarchcp -r /usr/share/ansible/roles/rhel-system-roles.timesync/ ~/ansible/roles/timesync vim /home/greg/ansible/timesync.yml --- - hosts: all vars: timesync_ntp_servers: - hostname: 172.25.250.250 iburst: yes pool: yes roles: - role: timesync
备注:可以使用rpm -ql rhel-system-roles
查看安装包的文件。playbook可以从路径复制: /usr/share/doc/rhel-system-roles/timesync/example-timesync-playbook.yml
验证:
在任意一台受控节点上查看:
使用 Ansible Galaxy 安装角色 使用名字为文件 /home/greg/ansible/roles/requirements.yml 下载并安装 Ansible Galaxy 角 色。从下列 URL 下载 :
1 2 3 4 5 6 7 8 9 10 vim /home/greg/ansible/roles/requirements.yml - src: http://host.domain8.example.com/ex300/haproxy.tar.gz name: balancer - src: http://host.domain8.example.com/ex300/phpinfo.tar.gz name: phpinfo ansible-galaxy install -r roles/requirements.yml -p roles
r:指定role文件,p:指定roles路径
创建和使用角色 根据下列要求,在 /home/greg/ansible/roles 中创建名为 apache 的角色:
httpd 软件包已安装,设为在系统启动时启用并启动
防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则
模板文件为 index.html.j2 ,用于创建具有以下输出的文件 /var/www/html/index.html : Welcome to HOSTNAME on IPADDRESS
其中,HOSTNAME 是受管节点的完全限定域名,IPADDRESS 则是受管节点的 IP 地址。
创建名为 newroles.yml 的 playbook,使用这个角色,对 webservers 组进行操作。
HOSTNAME 是 FQDN 的完整主机名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ansible-galaxy init roles/apache vim roles/apache/tasks/main.yml --- - name: install httpd yum: name=httpd state=installed - name: start httpd service: name=httpd state=started enabled=yes - name: start firewalld service: name=firewalld state=started enabled=yes - name: open http firewalld firewalld: service=http immediate=yes permanent=yes state=enabled - name: copy jinja2 template: src=index.html.j2 dest=/var/www/html/index.html vim roles/apache/templates/index.html.j2 Welcome to {{ansible_fqdn}} on {{ansible_default_ipv4.address}} vim newroles.yml --- - hosts: webservers roles: - role: apache ansible-playbook newroles.yml
变量帮助: ansible dev -m setup | grep fqdn
和ansible dev -m setup | grep defaul
验证: 登入webserver下的机器,查看var/www/html/index.html。 在控制端curl被控端80端口,有响应和输出内容。
从 Ansible Galaxy 使用角色 根据下列要求,创建一个名为 /home/greg/ansible/roles.yml 的 playbook :
playbook 中包含一个 play,该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。
此角色配置一项服务,以在 webservers 主机组中的主机之间平衡 Web 服务器请求的负载。
浏览到 balancers 主机组中的主机(例如 http://172.25.250.13 )将生成以下输出: Welcome to serverc.domain8.example.com on 172.25.250.11
重新加载浏览器将从另一 Web 服务器生成输出: Welcome to serverd.domain8.example.com on 172.25.250.12
playbook 中包含一个 play,该 play 在 webservers 主机组中的主机上运行并将使用 phpinfo 角色。
请通过 URL /hello.php 浏览到 webservers 主机组中的主机将生成以下输出: Hello PHP World from FQDN
其中,FQDN 是主机的完全限定名称。 Hello PHP World from serverb.lab.example.com
另外还有 PHP 配置的各种详细信息,如安装的 PHP 版本等。
同样,浏览到 http://172.25.250.12/hello.php 会生成以下输出: Hello PHP World from serverc.lab.example.com
另外还有 PHP 配置的各种详细信息,如安装的 PHP 版本等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 vim /home/greg/ansible/roles.yml --- - hosts: all - hosts: balancers roles: - role: balancer - hosts: webservers roles: - role: phpinfo ansible-playbook roles.yml
验证:
1 2 3 4 5 6 curl 172.25.250.1 firefox打开 http://172.25.250.11/hello.php http://172.25.250.12/hello.php
创建和使用逻辑 创建一个名为 /home/greg/ansible/lv.yml 的 playbook ,它将在所有受管节点上运行以执行下列任务: 创建符合以下要求的逻辑卷:
逻辑卷创建在 research 卷组中
逻辑卷名称为 data
逻辑卷大小为 1500 MiB
使用 ext4 文件系统格式化逻辑卷
如果无法创建请求的逻辑卷大小,应显示错误信息 Could not create logical volume of that size,并且应改为使用大小 800 MiB。
如果卷组 research 不存在,应显示错误信息 Volume group done not exist。
不要以任何方式挂载逻辑卷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 vim /home/greg/ansible/lv.yml --- - hosts: all tasks: - name: judge research exit shell: "vgdisplay research" ignore_errors: yes register: aa - name: if not exit print err fail: msg="Volume group done not exis" when: aa.rc != 0 - name: create lv block: - name: create 1500M lv lvol: vg=research lv=data size=1500M rescue: - name: debug 1500 Not create debug: msg="Could not create logical volume of that size" - name: create 800M lv lvol: vg=research lv=data size=800M - name: mk filesystem ext4 filesystem: dev=/dev/research/data fstype=ext4 force=yes ansible-playbook lv.yml
验证:
到受控机器上通过vgs
和lvscan
查看。
创建并使用磁盘分区 创建名为 partition.yml 的 playbook,对所有的节点进行操作:
在 vdb 上创建一个主分区, 1500MiB
使用 ext4 文件系统进行格式化
将文件系统挂载到/newpart
如果分区大小不满足,产生报错信息: could not create partation of that size 则创建分区大小变成 800MiB
如果磁盘不存在,产生报错信息: disk does not exit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 vim /home/greg/ansible/partition.yml --- - hosts: diskgroup tasks: - name: judge vdb exist shell: "ls /dev/vdb" ignore_errors: yes register: aa - name: if vbd Not exist print a err info fail: msg="disk does not exist" when: aa.rc != 0 - name: create a partitio block: - name: create 1500M parted: device=/dev/vdb number=1 part_end=1500MiM state=present rescue: - name: debug 1500M not create debug: msg="could not create partation of that size" - name: create 800M parted: device=/dev/vdb number=1 part_end=800MiB state=present - name: mk a file system filesystem: dev=/dev/vdb1 fstype=ext4 force=yes - name: mount path mount: src=/dev/vdb1 fstype=ext4 path=/newpart state=mounted ansible-playbook partition.yml
验证:
到受控机器上通过lsblk
查看。
生成主机文件 将一个初始模板文件从 http://host.domain8.example.com/ex300/hosts.j2 下载到/home/greg/ansible 完成该模板,以便用它生成以下文件:针对每个清单主机包含一行内容,其格式与/etc/hosts 相同。
创建名为 /home/greg/ansible/hosts.yml 的 playbook,它将使用此模板在 dev 主机组中 的主机上生成文件 /etc/myhosts 。
该 playbook 运行后, dev 主机组中主机上的文件 /etc/myhosts 应针对每个受管主机包含 一行内容:
1 2 3 4 5 6 7 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6172.25.250.9 workstation.lab.example.com workstation172.25.250.10 servera.lab.example.com servera172.25.250.11 serverb.lab.example.com serverb172.25.250.12 serverc.lab.example.com serverc172.25.250.13 serverd.lab.example.com serverd
注:清单主机名称的显示顺序不重要
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {% for host in groups ['all' ] %} {{ hostvars[host]['ansible_default_ipv4' ]['address' ]}} {{ hostvars[host]['ansible_fqdn' ] }} {{ hostvars[host]['ansible_hostname' ] }} {% endfor %} - hosts: all - hosts: dev tasks: - name: copy a file template: src=hosts.j2 dest=/etc/myhosts ansible-playbook hosts.yml
验证: 去受控节点dev上查看/etc/myhosts
文件
修改文件内容 按照下方所述,创建一个名为 /home/greg/ansible/issue.yml 的 playbook :
该 playbook 将在所有清单主机上运行
该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本:
在 dev 主机组中的主机上,这行文本显示 为:Development
在 test 主机组中的主机上,这行文本显示 为:Test
在 prod 主机组中的主机上,这行文本显示 为:Productio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vim /home/greg/ansible/issue.yml --- - hosts: all tasks: - name: dev content copy: dest=/etc/issue content="Development\n" when: inventory_hostname in groups.dev - name: test content copy: dest=/etc/issue content="Test\n" when: inventory_hostname in groups.test - name: prod content copy: dest=/etc/issue content="Production\n" when: inventory_hostname in groups.prod ansible-playbook issue.yml
验证: 去受控节点dev上查看/etc/issue
文件
创建 Web 内容目录 按照下方所述,创建一个名为 /home/greg/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://172.25.250.9/webdev/ )将生成以下 输出: Development
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 vim /home/greg/ansible/webcontent.yml --- - hosts: dev roles: - role: apache tasks: - name: create a group group: name=webdev state=present - name: create a direct file: path=/webdev/ state=directory mode=2755 group=webdev setype=httpd_sys_content_t - name: create a link 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 ansible-playbook /home/greg/ansible/webcontent.yml
setype可通过ls -Zd /var/www/html
查看
验证:
执行curl 172.25.250.9/webdev/index.html
生成硬件报告 创建一个名为 /home/greg/ansible/hwreport.yml 的 playbook ,它将在所有受管节点上生成 含有以下信息的输出文件 /root/hwreport.txt :
清单主机名称
以 MB 表示的总内存大小
BIOS 版本
磁盘设备 vda 的大小
磁盘设备 vdb 的大小
输出文件中的每一行含有一个 key=value 对。 您的 playbook 应当:
从 http://host/ex300/hwreport.empty 下载文件,并将它保存为 /root/hwreport.txt
使用正确的值改为 /root/hwreport.txt
如果硬件项不存在,相关的值应设为 NONE when: ansible_devices.vdb is not define
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 vim /home/greg/ansible/hwreport.yml --- - hosts: all tasks: - name: rm file shell: "rm -rf /root/hwreport.txt" - name: download file get_url: url="http://host/ex300/hwreport.empty" dest="/root/hwreport.txt" - name: inventory name lineinfile: path=/root/hwreport.txt regexp="^HOST" line=HOST={{inventory_hostname}} - name: memory size lineinfile: path=/root/hwreport.txt regexp="^MEMORY" line=MEMORY={{ansible_memtotal_mb}}MB - name: bios version lineinfile: path=/root/hwreport.txt regexp="^BIOS" line=BIOS={{ansible_bios_version}} - name: vda size lineinfile: path=/root/hwreport.txt regexp="^DISK_SIZE_VDA" line=DISK_SIZE_VDA={{ansible_devices.vda.size}} - name: vdb size block: - lineinfile: path=/root/hwreport.txt regexp="^DISK_SIZE_VDB" line=DISK_SIZE_VDB={{ansible_devices.vdb.size}} rescue: - lineinfile: path=/root/hwreport.txt regexp="^DISK_SIZE_VDB" line=DISK_SIZE_VDB=NONE ansible-playbook hwreport.yml
方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 vim /home/greg/ansible/hwreport.yml --- - hosts: all tasks: - name: rm file shell: "rm -rf /root/hwreport.txt" - name: download file get_url: url="http://host/ex300/hwreport.empty" dest="/root/hwreport.txt" - name: inventory name replace: path=/root/hwreport.txt regexp="^HOST" replace="{{inventory_hostname}}" - name: memory size replace: path=/root/hwreport.txt regexp="^MEMORY" replace="{{ansible_memtotal_mb | string}}" - name: bios version replace: path=/root/hwreport.txt regexp="^BIOS" replace="{{ansible_bios_version}}" - name: vda size replace: path=/root/hwreport.txt regexp="^DISK_SIZE_VDA" replace="{{ansible_devices.vda.size}}" - name: vdb size replace: path=/root/hwreport.txt regexp="^DISK_SIZE_VDB" replace="{{ansible_devices.vdb.size}} | default('NONE')" ansible-playbook hwreport.yml
验证:
在被控节点上查看/root/hwreport.txt
创建密码库 按照下方所述,创建一个 Ansible 库来存储用户密码:
库名称为 /home/greg/ansible/locker.yml
库中含有两个变量,名称如下:
pw_developer,值为 redhat
pw_manager,值为 redhat
用于加密和解密该库的密码为 redhat
密码存储在文件 /home/greg/ansible/secret.txt 中
1 2 3 4 5 6 7 8 9 10 11 12 vim /home/greg/ansible/locker.yml pw_developer: redhat pw_manager: redhat vim /home/greg/ansible/secret.txt redhat ansible-vault encrypt --vault-id=./secret.txt locker.yml
验证:
查看密码:ansible-vault view --vault-id=./secret.txt locker.yml
创建用户帐户 从 http://host/ex300/user_list.yml 下载要创建的用户的列表,并将它保存到/home/greg/ansible。
在本次考试中使用在其他位置创建的密码库 /home/greg/ansible/locker.yml 。创建名为 /home/greg/ansible/users.yml 的 playbook ,从而按以下所述创建用户帐户: 职位描述为 developer 的用户应当:
在 dev 和 test 主机组中的受管节点上创建
从 pw_developer 变量分配密码
是附属组 devops 的成员 职位描述为 manager 的用户应当:
在 prod 主机组中的受管节点上创建
从 pw_manager 变量分配密码
是附属组 opsmgr 的成员
密码采用 SHA512 哈希格式。
额外,增加密码过期 您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件 /home/greg/ansible/secret.txt 正常运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 wget http://host/ex300/user_list.yml --- - hosts: dev,test vars_files: - user_list.yml - locker.yml tasks: - name: create a group group: name=devops state=present - name: create a user user: name={{item.name}} state=present comment=developer groups =devops password={{pw_developer | password_hash('sha512' )}} when: item.job == "developer" loop: "{{users}}" - hosts: prod vars_files: - user_list.yml - locker.yml tasks: - name: create a group group: name=opsmgr state=present - name: create a user user: name={{item.name}} state=present comment=manager groups =opsmgr password={{pw_manager | password_hash('sha512' )}} when: item.job == "manager" loop: "{{users}}" - name: enable password expires shell: chage -M "{{item.passwd_max_expires}}" "{{item.name}}" when: item.job == "developer" loop: "{{users}}" ansible-playbook users.yml --vault-id=./secret.txt
enable password expires这步是新加的,可替换成实际过期天数,如30。
验证:
在dev,test节点上查看id bob
和id fred
。 验证密码过期:chage -l bob
。 在prod节点上查看id sally
。
更新 Ansible 库的密钥 按照下方所述,更新现有 Ansible 库的密钥: 从 http://host/ex300/salaries.yml 下载 Ansible 库到 /home/greg/ansible
当前的库密码为 111111
新的库密码为 redhat
库使用新密码保持加密状态
1 2 3 4 wget http://host/ex300/salaries.yml ansible-vault rekey salaries.yml
验证: 使用命令ansible-vault view salaries.yml
,然后输出密码。
selinux 安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook/home/greg/ansible/selinux.yml :
在所有受管节点上运行
使用 selinux 角色
要求所有的节点上 selinux
1 2 3 4 5 6 7 8 9 10 yum install rhel-system-roles.noarchcp -r /usr/share/ansible/roles/rhel-system-roles.selinux/ ./roles/selinuxcp /usr/share/doc/rhel-system-roles/selinux/example-selinux-playbook.yml selinux.yml 把 rhel-system-roles.selinux 换成 selinux ansible-playbook selinux.yml
验证: 去受控节点上查询getenforce
crontab 创建一个名为 /home/greg/ansible/cron.yml
的 playbook :
配置 cron
作业,该作业每隔 2 分钟
运行并执行以下命令:logger "EX200 in progress"
,以用户 natasha
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vim /home/greg/ansible/cron.yml --- - name: create logger hosts: all tasks: - name: create user natasha user: name: natasha state: present - name: "logger info for natasha" cron: name: "logger info" minute: "*/2" user: natasha job: logger "EX294 in progress" ansible-playbook cron.yml
验证: 去受控节点上查询crontab -u natasha -l
。