#!/bin/bash KVM_0=control KVM_1=workstation KVM_2=servera KVM_3=serverb KVM_4=serverc KVM_5=serverd SCORE=0 SCORE_COUNT=0 LOG_FACILITY=local0 LOG_PRIORITY=info LOG_TAG="${0##*/}" DEBUG=true LOGGER='/usr/bin/logger' function log { if [[ ${#1} -gt 0 ]] ; then $LOGGER -p ${LOG_FACILITY}.${LOG_PRIORITY} -t $LOG_TAG -- "$1" else while read data ; do $LOGGER -p ${LOG_FACILITY}.${LOG_PRIORITY} -t $LOG_TAG -- "$1" "$data" done fi } function debug { if [[ ${#1} -gt 0 ]] ; then msg="$1" if [[ "$DEBUG" = "true" ]] ; then echo "$msg" fi log "$msg" else while read data ; do if [[ "$DEBUG" = "true" ]] ; then echo "$data" fi log "$data" done fi } function pad { local text="$1" local dots='...............................................................' printf '%s%s ' "${text}" "${dots:${#text}}" } function print_SUCCESS() { echo -e '\033[1;36mSUCCESS\033[0;39m' } function check_tcp_port { if [[ ${#1} -gt 0 && ${#2} -gt 0 ]]; then # Sending it to the log always returns 0 ($(echo "sven" >/dev/tcp/$1/$2)) && return 0 fi return 1 } function wait_online { local TARGET=$1 pad " · Waiting for ${TARGET} to become available" while ! ping -c1 -w1 ${TARGET} &> /dev/null do sleep 1s done while ! check_tcp_port ${TARGET} 22 2>/dev/null do sleep 1s done print_SUCCESS } function padm { echo -e "\033[36m INFO:\t\033[39m\033[31m[$1]\033[39m\033[36m - $2 \033[39m" } function print_PASS() { echo -ne ' \033[1;32mPASS\033[0;39m\t' } function print_FAIL() { echo -ne ' \033[1;31mFAIL\033[0;39m\t' } function pads { echo -e "\nThe setup process completed successfully.\n" } function sshp { sshpass -p$3 ssh $1@$2 $4 } function remote_CMD() { sshpass -pflectrag ssh root@$1 $2 } function greg_CMD() { sshpass -pflectrag ssh greg@${KVM_0} $1 } function LCOURSE() { echo -n " The results of your EX200v8: " LAST_COURSE=$(expr ${SCORE} \* 300 / ${SCORE_COUNT}) if [ $LAST_COURSE -ge 210 ]; then print_PASS ; echo -e " Your score: \033[1;32m${LAST_COURSE}\033[0;39m" else print_FAIL ; echo -e " Your score: \033[1;31m${LAST_COURSE}\033[0;39m" fi } #### GRADE #### function kvm_reset { pad " · Resetting ${KVM_1},${KVM_2},${KVM_3},${KVM_4},${KVM_5}" && print_SUCCESS for i in ${KVM_1} ${KVM_2} ${KVM_3} ${KVM_4} ${KVM_5}; do rht-vmctl reset -y $i >/dev/null if rht-vmctl status $i | grep -q DEFINED; then rht-vmctl start $i >/dev/null; fi done for i in ${KVM_1} ${KVM_2} ${KVM_3} ${KVM_4} ${KVM_5}; do wait_online ${i} done sleep 10 sh /home/kiosk/ansible/setup.sh } function kvm_prepare { greg_CMD 'ln /home/greg/ansible/ansible.cfg /home/greg/.ansible.cfg 2>/dev/null' pad " · Removing balancer and phpinfo"; print_SUCCESS greg_CMD 'rm -rf /home/greg/ansible/mycollection 2>/dev/null' pad " · Removing conllection"; print_SUCCESS } function kvm_exec { greg_CMD "cp /home/greg/ansible/ansible.cfg /home/greg" greg_CMD "ansible-navigator run /home/greg/ansible/yum_repo.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/packages.yml 2>/dev/null -m stdout" greg_CMD "rpm -q rhel-system-roles &>/dev/null && ansible-playbook /home/greg/ansible/selinux.yml 2>/dev/null " greg_CMD "ansible-galaxy collection install -r /home/greg/ansible/requirements.yml -p /home/greg/ansible/mycollection &>/dev/null" greg_CMD "ansible-galaxy install -r /home/greg/ansible/roles/requirements.yml &>/dev/null" greg_CMD "ansible-navigator run /home/greg/ansible/apache.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/roles.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/lv.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/hosts.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/issue.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/webcontent.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/hwreport.yml 2>/dev/null -m stdout" greg_CMD "ansible-navigator run /home/greg/ansible/users.yml 2>/dev/null -m stdout" greg_CMD "ansible-playbook /home/greg/ansible/cron.yml 2>/dev/null " } function MQ1 { if [ "$MQ" = "1" ]; then MQ=1; else MQ=0; fi } function grade_config { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_0} "rpm -q ansible-core ansible-navigator &>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 安装和配置 Ansible - 安装所需的软件包 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "ansible dev --list-hosts -i /home/greg/ansible/inventory 2>/dev/null | grep -q node1" \ && greg_CMD "ansible test --list-hosts -i /home/greg/ansible/inventory 2>/dev/null | grep -q node2" \ && greg_CMD "ansible prod --list-hosts -i /home/greg/ansible/inventory 2>/dev/null | grep -q node3" \ && greg_CMD "ansible prod --list-hosts -i /home/greg/ansible/inventory 2>/dev/null | grep -q node4" \ && greg_CMD "ansible balancers --list-hosts -i /home/greg/ansible/inventory 2>/dev/null | grep -q node5" \ && greg_CMD "grep -A 4 webservers:children /home/greg/ansible/inventory 2>/dev/null | grep -q prod"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 安装和配置 Ansible - 创建名为 /home/greg/ansible/inventory 的静态清单文件 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q inventory.*=.*/home/greg/ansible/inventory /home/greg/ansible/ansible.cfg 2>/dev/null" \ && greg_CMD "grep -q roles_path.*=.*/home/greg/ansible/roles /home/greg/ansible/ansible.cfg 2>/dev/null" \ && greg_CMD "grep -q collections_path.*=.*\./mycollection /home/greg/ansible/ansible.cfg 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 安装和配置 Ansible - 创建名为 /home/greg/ansible/ansible.cfg 的配置文件 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 安装和配置 Ansible; fi } function grade_yum_repo { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -qr \\[EX294_BASE] /etc/yum.repos.d && grep -qr \\[EX294_STREAM] /etc/yum.repos.d" \ && remote_CMD ${KVM_2} "grep -qr \\[EX294_BASE] /etc/yum.repos.d && grep -qr \\[EX294_STREAM] /etc/yum.repos.d" \ && remote_CMD ${KVM_3} "grep -qr \\[EX294_BASE] /etc/yum.repos.d && grep -qr \\[EX294_STREAM] /etc/yum.repos.d" \ && remote_CMD ${KVM_4} "grep -qr \\[EX294_BASE] /etc/yum.repos.d && grep -qr \\[EX294_STREAM] /etc/yum.repos.d" \ && remote_CMD ${KVM_5} "grep -qr \\[EX294_BASE] /etc/yum.repos.d && grep -qr \\[EX294_STREAM] /etc/yum.repos.d"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和运行 yum_repo.yml 剧本 - 存储库的名称为 EX294_BASE,EX294_STREAM MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -qr 'name = EX294 base software' /etc/yum.repos.d && grep -qr 'name = EX294 stream software' /etc/yum.repos.d" \ && remote_CMD ${KVM_2} "grep -qr 'name = EX294 base software' /etc/yum.repos.d && grep -qr 'name = EX294 stream software' /etc/yum.repos.d" \ && remote_CMD ${KVM_3} "grep -qr 'name = EX294 base software' /etc/yum.repos.d && grep -qr 'name = EX294 stream software' /etc/yum.repos.d" \ && remote_CMD ${KVM_4} "grep -qr 'name = EX294 base software' /etc/yum.repos.d && grep -qr 'name = EX294 stream software' /etc/yum.repos.d" \ && remote_CMD ${KVM_5} "grep -qr 'name = EX294 base software' /etc/yum.repos.d && grep -qr 'name = EX294 stream software' /etc/yum.repos.d"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和运行 yum_repo.yml 剧本 - 描述为 EX294 base software,EX294 stream software MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/BaseOS' /etc/yum.repos.d && grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/AppStream' /etc/yum.repos.d" \ && remote_CMD ${KVM_2} "grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/BaseOS' /etc/yum.repos.d && grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/AppStream' /etc/yum.repos.d" \ && remote_CMD ${KVM_3} "grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/BaseOS' /etc/yum.repos.d && grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/AppStream' /etc/yum.repos.d" \ && remote_CMD ${KVM_4} "grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/BaseOS' /etc/yum.repos.d && grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/AppStream' /etc/yum.repos.d" \ && remote_CMD ${KVM_5} "grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/BaseOS' /etc/yum.repos.d && grep -qr 'baseurl = http://content/rhel9.0/x86_64/dvd/AppStream' /etc/yum.repos.d" ; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和运行 yum_repo.yml 剧本 - 基础 URL 为 http://content/rhel9.0/x86_64/dvd/\{BaseOS,AppStream\} MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -r 'gpgcheck = 1' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_2} "grep -r 'gpgcheck = 1' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_3} "grep -r 'gpgcheck = 1' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_4} "grep -r 'gpgcheck = 1' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_5} "grep -r 'gpgcheck = 1' /etc/yum.repos.d | wc -l | grep -q 2"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和运行 yum_repo.yml 剧本 - GPG 签名检查为启用状态 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -r 'gpgkey = http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_2} "grep -r 'gpgkey = http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_3} "grep -r 'gpgkey = http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_4} "grep -r 'gpgkey = http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release' /etc/yum.repos.d | wc -l | grep -q 2" \ && remote_CMD ${KVM_5} "grep -r 'gpgkey = http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release' /etc/yum.repos.d | wc -l | grep -q 2"; then SCORE=$(expr $SCORE + 1 ) && MQ1 MQ1 else print_FAIL ; echo 创建和运行 yum_repo.yml 剧本 - 密钥 URL 为 http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "yum install -yq dnsmasq-utils &>/dev/null" \ && remote_CMD ${KVM_2} "yum install -yq dnsmasq-utils &>/dev/null" \ && remote_CMD ${KVM_3} "yum install -yq dnsmasq-utils &>/dev/null" \ && remote_CMD ${KVM_4} "yum install -yq dnsmasq-utils &>/dev/null" \ && remote_CMD ${KVM_5} "yum install -yq dnsmasq-utils &>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 MQ1 else print_FAIL ; echo 创建和运行 yum_repo.yml 剧本 - 存储库为启用状态 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 创建和运行 yum_repo.yml 剧本; fi } function grade_packages { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "rpm -q php mariadb &>/dev/null" \ && remote_CMD ${KVM_2} "rpm -q php mariadb &>/dev/null" \ && remote_CMD ${KVM_3} "rpm -q php mariadb &>/dev/null" \ && remote_CMD ${KVM_4} "rpm -q php mariadb &>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 安装软件包 - 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "yum grouplist 'RPM Development Tools' 2>/dev/null | grep -q Installed"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 安装软件包 - 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "rpm -q at | grep -q el9"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 安装软件包 - 将 dev 主机组中主机上的所有软件包更新为最新版本 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 安装软件包; fi } function grade_selinux { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_0} "grep -q 'hosts: all' /home/greg/ansible/selinux.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 RHEL 系统角色 - 在所有受管节点上运行 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_0} "grep -A 1 'include_role:' /home/greg/ansible/selinux.yml 2>/dev/null | grep -q 'rhel-system-roles.selinux'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 RHEL 系统角色 - 使用 Selinux 角色 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q ^SELINUX=enforcing /etc/selinux/config 2>/dev/null" \ && remote_CMD ${KVM_2} " grep -q ^SELINUX=enforcing /etc/selinux/config 2>/dev/null" \ && remote_CMD ${KVM_3} " grep -q ^SELINUX=enforcing /etc/selinux/config 2>/dev/null" \ && remote_CMD ${KVM_4} " grep -q ^SELINUX=enforcing /etc/selinux/config 2>/dev/null" \ && remote_CMD ${KVM_5} " grep -q ^SELINUX=enforcing /etc/selinux/config 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 RHEL 系统角色 - 配置该角色,使客户机Selinux保持开启状态 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_0} "grep -q '^- hosts: all' /home/greg/ansible/selinux.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 RHEL 系统角色 - 配置该角色,以设置所有客户机Selinux MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_0} "grep -q 'selinux_state: enforcing' /home/greg/ansible/selinux.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 RHEL 系统角色 - 配置该角色,以设置Selinux为enforcing状态 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 使用 RHEL 系统角色; fi } function grade_conllection { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q '^- name: http://classroom/materials/redhat-insights-1.0.7.tar.gz' /home/greg/ansible/requirements.yml 2>/dev/null" \ && greg_CMD "cd ansible; ansible-galaxy collection list 2>/dev/null" | grep -qw 'redhat.insights'; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 Ansible Galaxy 安装角色 - http://classroom/materials/redhat-insights-1.0.7.tar.gz MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q '^- name: http://classroom/materials/community-general-5.5.0.tar.gz' /home/greg/ansible/requirements.yml 2>/dev/null" \ && greg_CMD "cd ansible; ansible-galaxy collection list 2>/dev/null "| grep -qw 'community.general'; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 Ansible Galaxy 安装角色 - http://classroom/materials/community-general-5.5.0.tar.gz MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q '^- name: http://classroom/materials/redhat-rhel_system_roles-1.19.3.tar.gz' /home/greg/ansible/requirements.yml 2>/dev/null" \ && greg_CMD "cd ansible; ansible-galaxy collection list 2>/dev/null "| grep -qw 'redhat.rhel_system_roles'; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 Ansible Galaxy 安装角色 - http://classroom/materials/redhat-rhel_system_roles-1.19.3.tar.gz MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 使用 Ansible Galaxy 安装角色; fi } function grade_requirements { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q 'src: http://classroom/materials/haproxy.tar' /home/greg/ansible/roles/requirements.yml 2>/dev/null" \ && greg_CMD "ansible-galaxy list -p /home/greg/ansible/roles 2>/dev/null | grep -qw balancer"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 Ansible Galaxy 安装角色 - http://materials/haproxy.tar 此角色的名称应当为 balancer MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q 'src: http://classroom/materials/phpinfo.tar' /home/greg/ansible/roles/requirements.yml 2>/dev/null" \ && greg_CMD "ansible-galaxy list -p /home/greg/ansible/roles 2>/dev/null | grep -qw phpinfo"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 使用 Ansible Galaxy 安装角色 - http://materials/phpinfo.tar 此角色的名称应当为 phpinfo MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 使用 Ansible Galaxy 安装角色; fi } function grade_apache { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "ansible-galaxy list -p /home/greg/ansible/roles 2>/dev/null | grep -qw apache"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用角色 - 应安装 httpd 角色 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -A 4 webservers /home/greg/ansible/apache.yml 2>/dev/null|grep -A 2 roles|grep -qw apache" \ && greg_CMD "grep -A 6 ansible.builtin.systemd: /home/greg/ansible/roles/apache/tasks/main.yml 2>/dev/null | grep -A 2 'name: httpd' | grep -A 1 'state: started' | grep -q 'enabled: yes'" \ && greg_CMD "ansible webservers -m service_facts 2>/dev/null|grep http -A 2|grep -qw running 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用角色 - 应使用 httpd 角色,并设为在系统启动时启用并启动 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -A 6 firewalld: /home/greg/ansible/roles/apache/tasks/main.yml 2>/dev/null | grep -A 3 'service: http' | grep -A 2 'permanent: yes' | grep -q 'immediate: yes'" \ && greg_CMD "ansible webservers -m service_facts 2>/dev/null|grep firewall -A 2|grep -qw running 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用角色 - 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -A 4 template: /home/greg/ansible/roles/apache/tasks/main.yml 2>/dev/null | grep -A 1 'src: index.html.j2' | grep -q 'dest: /var/www/html/index.html'" \ && greg_CMD "grep -q 'Welcome to {{ ansible_nodename }} on {{ ansible_default_ipv4.address }}' /home/greg/ansible/roles/apache/templates/index.html.j2 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用角色 - 模板文件 index.html.j2 已存在,用于创建具有以下输出的文件 /var/www/html/index.html MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 创建和使用角色; fi } function grade_roles { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -A 6 '^- name:' /home/greg/ansible/roles.yml 2>/dev/null | grep -A 2 'hosts: balancers' | grep -A 1 'roles:' | grep -q balancer" \ && greg_CMD "curl http://172.25.250.13 2>/dev/null > /var/tmp/b.txt" \ && greg_CMD "curl http://172.25.250.13 2>/dev/null >> /var/tmp/b.txt" \ && greg_CMD "grep -C 1 'Welcome to node3.lab.example.com on 172.25.250.11' /var/tmp/b.txt | grep -q 'Welcome to node4.lab.example.com on 172.25.250.12'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 从 Ansible Galaxy 使用角色 - 该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -A 6 '^- name:' /home/greg/ansible/roles.yml 2>/dev/null | grep -A 2 'hosts: webservers' | grep -A 1 'roles:' | grep -q phpinfo" \ && greg_CMD "curl http://172.25.250.11/hello.php 2>/dev/null | grep -q 'Hello PHP World from node3.lab.example.com'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 从 Ansible Galaxy 使用角色 - 该 play 在 webservers 主机组中的主机上运行并将使用 phpinfo 角色 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "curl http://172.25.250.12/hello.php 2>/dev/null | grep -q 'Hello PHP World from node4.lab.example.com'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 从 Ansible Galaxy 使用角色 - 浏览到 http://172.25.250.12/hello.php 会生成以下输出 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 从 Ansible Galaxy 使用角色; fi } function grade_lv { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_2} "lvdisplay /dev/research/data 2>/dev/null | grep -q 'LV Size.*1.4[6-7] GiB'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用逻辑卷 - 创建符合以下要求的逻辑卷 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_2} "blkid /dev/research/data 2>/dev/null | grep -q ext4"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用逻辑卷 - 使用 ext4 文件系统格式化逻辑卷 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_3} "lvdisplay /dev/research/data 2>/dev/null | grep -q 'LV Size.*800.*MiB'" \ && greg_CMD "grep -q 'msg:.*Could not create logical volume of that size' /home/greg/ansible/lv.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用逻辑卷 - 如果无法创建请求的逻辑卷大小,应显示错误信息 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q 'msg:.*Volume group done not exist' /home/greg/ansible/lv.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建和使用逻辑卷 - 如果卷组 research 不存在,应显示错误信息 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 创建和使用逻辑卷; fi } function grade_hosts { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q '127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4' /home/greg/ansible/hosts.j2 2>/dev/null" \ && greg_CMD "grep -q '::1 localhost localhost.localdomain localhost6 localhost6.localdomain6' /home/greg/ansible/hosts.j2 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成主机文件 - 将一个初始模板文件从 http://materials/hosts.j2 下载到 /home/greg/ansible MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q '172.25.250.9.*node1.lab.example.com.*node1' /etc/myhosts 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '172.25.250.10.*node2.lab.example.com.*node2' /etc/myhosts 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '172.25.250.11.*node3.lab.example.com.*node3' /etc/myhosts 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '172.25.250.12.*node4.lab.example.com.*node4' /etc/myhosts 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '172.25.250.13.*node5.lab.example.com.*node5' /etc/myhosts 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成主机文件 - 针对每个清单主机包含一行内容,其格式与 /etc/hosts 相同 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_2} "[[ ! -e /etc/myhosts ]]" \ && remote_CMD ${KVM_3} "[[ ! -e /etc/myhosts ]]" \ && remote_CMD ${KVM_4} "[[ ! -e /etc/myhosts ]]" \ && remote_CMD ${KVM_5} "[[ ! -e /etc/myhosts ]]" \ && remote_CMD ${KVM_0} "grep -q 'dest: /etc/myhosts' /home/greg/ansible/hosts.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成主机文件 - 创建名为 /home/greg/ansible/hosts.yml 的 playbook MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 生成主机文件; fi } function grade_issue { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_0} "grep -q 'hosts: all' /home/greg/ansible/issue.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 修改文件内容 - 该 playbook 将在所有清单主机上运行 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q 'Development' /etc/issue" \ && remote_CMD ${KVM_1} "wc -l /etc/issue | egrep -q '0|1'" \ && remote_CMD ${KVM_2} "grep -q 'Test' /etc/issue" \ && remote_CMD ${KVM_2} "wc -l /etc/issue | egrep -q '0|1'" \ && remote_CMD ${KVM_3} "grep -q 'Production' /etc/issue" \ && remote_CMD ${KVM_3} "wc -l /etc/issue | egrep -q '0|1'" \ && remote_CMD ${KVM_4} "grep -q 'Production' /etc/issue" \ && remote_CMD ${KVM_4} "wc -l /etc/issue | egrep -q '0|1'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 修改文件内容 - 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 修改文件内容; fi } function grade_webcontent { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q 'hosts: dev' /home/greg/ansible/webcontent.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建 Web 内容目录 - 该 playbook 在 dev 主机组中的受管节点上运行 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "getfacl /webdev 2>/dev/null | grep -q 'group: webdev'" \ && remote_CMD ${KVM_1} "ls -ld /webdev 2>/dev/null | grep -q rwxrwsr-x"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建 Web 内容目录 - 创建符合下列要求的目录 /webdev MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "ls -ld /var/www/html/webdev 2>/dev/null | grep -q '^l.*/var/www/html/webdev -> /webdev$'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建 Web 内容目录 - 用符号链接将 /var/www/html/webdev 链接到 /webdev MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q Development /webdev/index.html 2>/dev/null" \ && remote_CMD ${KVM_1} "wc -l /webdev/index.html 2>/dev/null | egrep -q '0|1'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建 Web 内容目录 - 创建文件 /webdev/index.html ,其中包含如下所示的单行文件: Development MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "curl http://172.25.250.9/webdev/ 2>/dev/null | grep -q Development"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建 Web 内容目录 - 在 dev 主机组中主机上浏览此目录(例如 http://172.25.250.9/webdev/ ) MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 创建 Web 内容目录; fi } function grade_hwreport { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q HOST=node1 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_2} "grep -q HOST=node2 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_3} "grep -q HOST=node3 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_4} "grep -q HOST=node4 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_5} "grep -q HOST=node5 /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - 清单主机名称 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q MEMORY=56[5-7][0-9] /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_2} "grep -q MEMORY=9[5-7][0-9] /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_3} "grep -q MEMORY=9[5-7][0-9] /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_4} "grep -q MEMORY=9[5-7][0-9] /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_5} "grep -q MEMORY=9[5-7][0-9] /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - 以 MB 表示的总内存大小 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q BIOS=1.15.0-1.el9 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_2} "grep -q BIOS=1.15.0-1.el9 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_3} "grep -q BIOS=1.15.0-1.el9 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_4} "grep -q BIOS=1.15.0-1.el9 /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_5} "grep -q BIOS=1.15.0-1.el9 /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - BIOS 版本 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q 'DISK_SIZE_VDA=20.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_2} "grep -q 'DISK_SIZE_VDA=10.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_3} "grep -q 'DISK_SIZE_VDA=10.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_4} "grep -q 'DISK_SIZE_VDA=10.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_5} "grep -q 'DISK_SIZE_VDA=10.00 GB' /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - 磁盘设备 vda 的大小 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_2} "grep -q 'DISK_SIZE_VDB=1.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_3} "grep -q 'DISK_SIZE_VDB=1.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_4} "grep -q 'DISK_SIZE_VDB=1.00 GB' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_5} "grep -q 'DISK_SIZE_VDB=1.00 GB' /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - 磁盘设备 vdb 的大小 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q '# Hardware report' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '# Hardware report' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '# Hardware report' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '# Hardware report' /root/hwreport.txt 2>/dev/null" \ && remote_CMD ${KVM_1} "grep -q '# Hardware report' /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - 从 http://materials/hwreport.empty 下载文件,并将它保存为 /root/hwreport.txt MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "grep -q 'DISK_SIZE_VDB=NONE' /root/hwreport.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 生成硬件报告 - 如果硬件项不存在,相关的值应设为 NONE MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 生成硬件报告; fi } function grade_locker { MQ=1 SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q '$ANSIBLE_VAULT;1.1;AES256' /home/greg/ansible/locker.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建库 - 库名称为 /home/greg/ansible/locker.yml MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "ansible-vault view --vault-password-file=/home/greg/ansible/secret.txt /home/greg/ansible/locker.yml 2>/dev/null | grep -q 'pw_developer: Imadev'" \ && greg_CMD "ansible-vault view --vault-password-file=/home/greg/ansible/secret.txt /home/greg/ansible/locker.yml 2>/dev/null | grep -q 'pw_manager: Imamgr'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建密码库 - 库中含有两个变量,名称如下 pw_developer,pw_manager MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q whenyouwishuponastar /home/greg/ansible/secret.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建密码库 - 用于加密和解密该库的密码为 whenyouwishuponastar MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q whenyouwishuponastar /home/greg/ansible/secret.txt 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建密码库 - 密码存储在文件 /home/greg/ansible/secret.txt 中 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 创建密码库; fi } function grade_user { MQ=1 greg_CMD "wget -q http://materials/user_list.yml -P /var/tmp" SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "diff /var/tmp/user_list.yml /home/greg/ansible/user_list.yml &>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建用户帐户 - 从 http://materials/user_list.yml 下载要创建的用户的列表,并将它保存到 /home/greg/ansible MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "id bob &>/dev/null && id fred &>/dev/null" \ && remote_CMD ${KVM_3} "id sally &>/dev/null" \ && remote_CMD ${KVM_4} "id sally &>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建用户帐户 - 职位描述的用户,应当在主机组中的受管节点上创建 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if sshp bob ${KVM_1} Imadev whoami 2>/dev/null | grep -q bob \ && sshp fred ${KVM_1} Imadev whoami 2>/dev/null | grep -q fred \ && sshp bob ${KVM_2} Imadev whoami 2>/dev/null | grep -q bob \ && sshp fred ${KVM_2} Imadev whoami 2>/dev/null | grep -q fred \ && sshp sally ${KVM_3} Imamgr whoami 2>/dev/null | grep -q sally \ && sshp sally ${KVM_4} Imamgr whoami 2>/dev/null | grep -q sally; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建用户帐户 - 职位描述的用户,从变量分配密码 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if remote_CMD ${KVM_1} "id bob 2>/dev/null" | grep -q groups.*devops \ && remote_CMD ${KVM_1} "id fred 2>/dev/null" | grep -q groups.*devops \ && remote_CMD ${KVM_2} "id bob 2>/dev/null" | grep -q groups.*devops \ && remote_CMD ${KVM_2} "id fred 2>/dev/null" | grep -q groups.*devops \ && remote_CMD ${KVM_3} "id sally 2>/dev/null" | grep -q groups.*opsmgr \ && remote_CMD ${KVM_4} "id sally 2>/dev/null" | grep -q groups.*opsmgr; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建用户帐户 - 职位描述的用户,是补充组的成员 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q password:.*password_hash\(\'sha512\' /home/greg/ansible/users.yml 2>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 创建用户帐户 - 密码采用 SHA512 哈希格式 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 创建用户帐户; fi } function grade_rekey { MQ=1 greg_CMD "echo bbs2you9527 > /var/tmp/verify_newpass" SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "[ -e /home/greg/ansible/salaries.yml ] &>/dev/null"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 更新 Ansible 库的密钥 - 从 http://materials/salaries.yml 下载 Ansible 库到 /home/greg/ansible MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "ansible-vault view --vault-password-file=/var/tmp/verify_newpass /home/greg/ansible/salaries.yml 2>/dev/null | grep -q 'haha'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 更新 Ansible 库的密钥 - 新的库密码为 bbs2you9527 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -q '$ANSIBLE_VAULT;1.1;AES256' /home/greg/ansible/salaries.yml 2>/dev/null" \ && greg_CMD "ansible-vault view --vault-password-file=/var/tmp/verify_newpass /home/greg/ansible/salaries.yml 2>/dev/null | grep -q 'haha'"; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 更新 Ansible 库的密钥 - 库使用新密码保持加密状态 MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 更新 Ansible 库的密钥; fi } function grade_cron { MQ=1 cron_jobs='logger "EX200 in progress"' cron_time='*/2 * * * *' SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "grep -A 6 test /home/greg/ansible/cron.yml 2>/dev/null|grep -A 4 cron:|grep -q "$cron_time"|grep -qw "$cron_jobs""; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo 配置 cron 作业 - 该 playbook 在 test 主机组中的受管节点上运行 MQ=0 fi SCORE_COUNT=$(expr $SCORE_COUNT + 1 ) if greg_CMD "ansible test -m shell -a 'crontab -l -u natasha' 2>/dev/null|grep -qw "$cron_time" |grep -qw "$cron_jobs""; then SCORE=$(expr $SCORE + 1 ) && MQ1 else print_FAIL ; echo '配置 cron 作业 - 角色已存在, natasha 用户的 crontab 里应有 */2 * * * * logger "EX200 in progress"' MQ=0 fi if [ "$MQ" = "1" ]; then print_PASS; echo 配置 cron 作业; fi } ## Main area # /etc/ssh/ssh_config sed -i '/^Host/a\ LogLevel QUIET' ~/.ssh/config kvm_reset kvm_prepare kvm_exec echo echo -en " Spend Time: \033[1;32m$(expr \( $(date +%s) - $(date +%s -d "$(stat -c %x /content/RHCE.html | cut -f 1 -d . )") \) / 60)\033[0;39m Minutes, " echo "$(uptime -p), $(date)" echo ======================================================================== grade_config grade_yum_repo grade_packages grade_selinux grade_conllection grade_requirements grade_apache grade_roles grade_lv grade_hosts grade_issue grade_webcontent grade_hwreport grade_locker grade_user grade_rekey grade_cron echo ======================================================================== LCOURSE # /etc/ssh/ssh_config greg_CMD 'rm -rf /home/greg/ansible.cfg' sed -i '/LogLevel QUIET/d' ~/.ssh/config