MOCK EXAM · 模拟考试

Shell脚本 & Ansible自动化运维

基于杨寅冬《Linux自动化运维Shell与Ansible》· 共95题 · 单选 + 多选 + 填空 + 简答

35单选题
10多选题
28填空题
22简答题
0已作答

单选题

35 题 · 每题2分
Q01 Shell脚本第一行通常写 #!/bin/bash,其作用是?
✓ 正确答案
B
#!/bin/bash 称为 shebang,告知内核使用 /bin/bash 来解释执行该脚本。
Q02 在Bash中,$? 表示什么?
✓ 正确答案
B
$? 存储上一条命令的退出码,0表示成功,非0表示失败。
Q03 以下哪个命令可以让脚本文件具有执行权限?
✓ 正确答案
B
chmod +x 为文件添加可执行权限;644仅有读写权限无执行;chown是更改所有者。
Q04 Shell中,$0$1$# 分别代表什么?
✓ 正确答案
A
$0=脚本名,$1~$9为位置参数,$#为参数个数,$$为当前PID,$*/$@为所有参数。
Q05 下列哪种方式是Shell中正确的变量赋值方式?
✓ 正确答案
B
Shell变量赋值等号两边不能有空格,否则会被解释为命令调用。
Q06 在Shell中执行算术运算,以下哪种写法能正确得到 a=3+5 的结果8?
✓ 正确答案
B
Shell中算术运算需用 $[] 或 $(()) 或 let 或 expr;直接赋值会被当做字符串。
Q07 Shell中 [ -f /etc/passwd ]-f 测试条件含义是?
✓ 正确答案
B
-f: 普通文件;-d: 目录;-x: 有执行权限;-s: 非空文件;-e: 存在即可。
Q08 以下for循环语法正确的是?
✓ 正确答案
A
Bash for循环基本语法:for 变量 in 列表; do 命令; done。
Q09 while read line; do echo $line; done < file.txt 的作用是?
✓ 正确答案
A
重定向 < file.txt 将文件内容作为while循环的标准输入,逐行读取并echo输出。
Q10 Shell函数定义中,local 关键字的作用是?
✓ 正确答案
B
local 声明的变量作用域仅限于当前函数,避免污染全局命名空间。
Q11 Ansible默认的配置文件路径是?
✓ 正确答案
B
/etc/ansible/ansible.cfg 是系统级配置文件;/etc/ansible/hosts 是默认inventory文件。
Q12 Ansible中,执行ad-hoc命令使用的命令行工具是?
✓ 正确答案
B
ansible 命令用于ad-hoc单次任务;ansible-playbook 运行剧本;ansible-vault 加密敏感数据。
Q13 Ansible Playbook中,hosts: all 表示?
✓ 正确答案
B
all 是Ansible内置的特殊组,包含inventory中所有主机。
Q14 以下关于Ansible幂等性的描述,正确的是?
✓ 正确答案
A
幂等性(Idempotency):多次执行与一次执行效果相同,是Ansible的核心设计原则。
Q15 Ansible中用于复制文件到远程主机的模块是?
✓ 正确答案
B
copy模块: 控制节点→被控节点;fetch模块: 被控节点→控制节点;file模块: 管理文件属性。
Q16 Ansible变量在Playbook中通过什么语法引用?
✓ 正确答案
B
Ansible使用Jinja2模板语法,变量引用使用双花括号 {{ var_name }}。
Q17 Ansible中 notifyhandlers 的关系是?
✓ 正确答案
A
当task发生changed状态时触发notify,对应的handler在play结束时(所有task执行后)运行一次。
Q18 Ansible when 条件语句用于?
✓ 正确答案
B
when语句类似if条件,表达式为True时才执行该task,常配合ansible_os_family等facts使用。
Q19 Ansible Roles 目录结构中,tasks/main.yml 的作用是?
✓ 正确答案
B
roles目录结构:tasks/为任务;vars/为变量;templates/为模板;meta/为元数据;handlers/为处理器。
Q20 以下哪个模块用于在远程主机上执行任意Shell命令且支持管道?
✓ 正确答案
B
shell模块通过/bin/sh执行,支持管道、重定向;command模块不支持管道;raw直接通过SSH执行。
Q21 ansible-vault encrypt secret.yml 命令的作用是?
✓ 正确答案
B
ansible-vault encrypt: 加密;decrypt: 解密;view: 查看;edit: 编辑加密文件。
Q22 Ansible中 register 关键字的作用是?
✓ 正确答案
B
register将模块执行的返回值(包含stdout, stderr, rc等)存储到指定变量,供后续任务使用。
Q23 Shell中,2>&1 的含义是?
✓ 正确答案
B
2>&1 将stderr(fd2)重定向到stdout(fd1)所指向的位置,常用于 cmd > file 2>&1 将所有输出写入文件。
Q24 Ansible中 gather_facts: false 的作用是?
✓ 正确答案
A
gather_facts默认true,会在play开始时运行setup模块收集系统信息(facts)。设为false可加快执行速度。
Q25 在Shell脚本中,source script.sh./script.sh 的区别是?
✓ 正确答案
A
source(或.)在当前Shell进程中运行脚本,变量和函数定义会保留在当前环境;./会创建子进程执行。
Q26 下列关于Linux文件权限的说法,正确的是?
✓ 正确答案
B
755=rwxr-xr-x:所有者7(rwx),组5(r-x),其他5(r-x)。644=rw-r--r--无执行权限。chmod +x给所有人加执行权限。
Q27 Shell脚本中,set -e 的作用是?
✓ 正确答案
B
set -e:遇错立即退出;set -x:开启调试;set -u:禁止使用未定义变量;三者常组合使用 set -eux。
Q28 以下哪个命令可以统计文件 access.log 中出现次数最多的IP地址?
✓ 正确答案
B
经典日志分析管道:awk提取第1列IP → sort排序 → uniq -c统计重复数 → sort -rn降序 → head -1取第一名。
Q29 在Shell中,$(( 10 % 3 )) 的结果是?
✓ 正确答案
C
% 是取余运算,10 ÷ 3 = 3 余 1,结果为 1。常用于判断奇偶:$(( n % 2 )) 为0则偶数。
Q30 Ansible中,ansible all -m setup -a "filter=ansible_memory_mb" 的作用是?
✓ 正确答案
B
setup模块收集Facts;filter参数过滤只显示匹配的Facts变量,减少输出信息量,便于查看特定信息。
Q31 以下 sed 命令中,能删除文件中所有空白行的是?
✓ 正确答案
A
^$ 正则:^匹配行首,$匹配行尾,^$表示行首紧接行尾即空行;d是delete删除。s/ //g只删除空格不删空行。
Q32 Ansible Playbook中,vars_prompt 的使用场景最适合?
✓ 正确答案
B
vars_prompt在执行时提示用户交互输入,加 private: yes 可隐藏输入内容,适合输入数据库密码等不宜写死在文件里的信息。
Q33 Shell中,grep -E "^[0-9]{1,3}\.[0-9]{1,3}" file 的作用是?
✓ 正确答案
A
-E启用扩展正则;^行首;[0-9]{1,3}匹配1到3位数字;\.匹配点;整体匹配以IP格式开头的行。
Q34 Ansible中 serial: 1 配合滚动更新,其含义是?
✓ 正确答案
B
serial控制滚动更新批次大小:serial: 1表示逐台更新,保证服务不中断;serial: "30%"表示每批更新30%的主机。
Q35 下列关于 crontab 定时任务格式 0 2 * * 1 /scripts/backup.sh 描述正确的是?
✓ 正确答案
B
crontab格式:分 时 日 月 周。0=0分,2=2时,*=每天,*=每月,1=周一(0和7都是周日)。

多选题

10 题 · 每题4分
M01 以下哪些是Shell中有效的条件测试运算符?(多选)
✓ 正确答案
A、B、C
数值比较:-eq, -ne, -lt, -le, -gt, -ge;字符串比较:=, !=, -z, -n;-pp 不存在。
M02 关于Ansible Inventory,以下说法正确的有?(多选)
✓ 正确答案
A、B、C
Inventory支持INI/YAML,可定义组、主机变量;支持动态Inventory脚本;IP和域名都可以使用。
M03 以下哪些是Shell脚本中常用的字符串操作?(多选)
✓ 正确答案
A、B、C
D是Python语法;Bash中转大写用 ${str^^}(Bash4+)或 tr 命令。
M04 Ansible中,以下哪些方式可以定义变量?(多选)
✓ 正确答案
A、B、C、D
Ansible变量来源优先级(从高到低):-e命令行 > task vars > block vars > play vars > host_vars > group_vars > roles defaults。
M05 Shell中,以下哪些命令可以用来处理文本文件?(多选)
✓ 正确答案
A、B、C
awk: 模式匹配和文本处理;sed: 流编辑器;grep: 文本搜索;ps: 查看进程状态,非文本处理工具。
M06 关于Ansible的 loop(循环),以下正确的是?(多选)
✓ 正确答案
A、B、C
loop可遍历列表、字典等;{{ item }} 引用当前元素;with_items是旧写法,Ansible 2.5+推荐用loop。
M07 以下关于 ansible-playbook 命令常用参数,正确的是?(多选)
✓ 正确答案
A、B、C、D
以上均为常用参数。--check模拟运行不修改系统;--tags可过滤任务;-v增加输出详细度。
M08 Shell中 trap 命令可以捕获哪些信号?(多选)
✓ 正确答案
A、B、C
SIGKILL(9号信号)不可被捕获或忽略;trap可处理SIGINT(2), SIGTERM(15), EXIT(脚本退出钩子)等。
M09 Ansible的 template 模块与 copy 模块的区别,正确的是?(多选)
✓ 正确答案
A、B、C
template模块将.j2文件中的Jinja2变量渲染后再传输到远程主机;copy直接传输文件内容不做替换。
M10 以下哪些属于Ansible Facts中常见的系统信息变量?(多选)
✓ 正确答案
A、B、C
ansible_cpu_name不是标准facts变量,正确的是ansible_processor;其余均为常见facts。

填空题

28 题 · 每题3分
F01 Shell中,使用 read 命令读取用户输入并存入变量 name,完整命令是:read _____ name
✓ 参考答案
-p "请输入:"(或直接 read name 也可,-p用于显示提示)
read -p "提示信息" 变量名,可在读取输入时显示提示语。
F02 将命令 ls -l 的输出追加到文件 list.txt(不覆盖),应使用重定向符:ls -l _____ list.txt
✓ 参考答案
>>
>> 追加重定向;> 覆盖重定向;< 输入重定向;<< 定界符(here document)。
F03 Shell中,case 语句的结束关键字是 _____
✓ 参考答案
esac
case...esac,if...fi,for/while/until...done,这是Bash关键字倒写的命名习惯。
F04 Ansible使用 _____ 模块管理系统服务(如启动/停止/重启 nginx)
✓ 参考答案
service(或 systemd)
service模块可管理SysV/systemd服务;systemd模块专门用于systemd;常用参数:name, state, enabled。
F05 在Shell中,将字符串 "Hello World" 转换为大写,使用 echo "Hello World" | tr _____ _____
✓ 参考答案
a-z A-Z
tr 'a-z' 'A-Z' 将小写字符映射为大写;转小写则反之。
F06 Ansible ad-hoc 命令中,-m 参数指定 _____,-a 参数指定 _____
✓ 参考答案
-m: 模块名;-a: 模块参数(arguments)
例:ansible all -m ping;ansible all -m shell -a "df -h"
F07 Shell中,使用 _____ 命令可以在脚本中调试,逐行显示执行过程
✓ 参考答案
set -x(或 bash -x script.sh)
set -x 开启调试模式,执行每条命令前打印;set +x 关闭;set -e 遇到错误立即退出。
F08 Ansible Playbook中,become: true 的作用是 _____
✓ 参考答案
提权,默认以sudo方式切换为root用户执行任务
become: true 相当于sudo;become_user可指定切换到哪个用户;become_method可指定sudo/su等。
F09 awk命令中,$0 代表 _____,$1 代表 _____
✓ 参考答案
$0: 整行内容;$1: 第一个字段(列)
awk默认以空白符分隔字段;NR为行号;NF为字段总数;FS为字段分隔符。
F10 Ansible中,使用 _____ 模块来安装软件包(适用于RedHat系列)
✓ 参考答案
yum(或 dnf)
RedHat/CentOS用yum或dnf模块;Debian/Ubuntu用apt模块;通用可用package模块。
F11 Shell中,$(command) 与反引号 `command` 的功能相同,都是 _____,推荐使用前者的原因是 _____
✓ 参考答案
命令替换(将命令输出作为字符串使用);$()支持嵌套,可读性更好
$()可嵌套如$(echo $(ls));反引号嵌套需要转义,容易出错。
F12 Ansible创建新Role时使用命令 ansible-galaxy init _____
✓ 参考答案
role名称(例如: myrole)
ansible-galaxy init myrole 会自动创建标准的role目录结构:tasks/, handlers/, vars/, defaults/, files/, templates/, meta/。
F13 在Shell中,&&|| 分别表示:前者是 _____,后者是 _____
✓ 参考答案
&& 前一命令成功($?=0)才执行后一命令;|| 前一命令失败才执行后一命令
常用模式:cmd1 && cmd2 || cmd3(类似if-then-else)。
F14 Ansible中,ignore_errors: true 的作用是 _____
✓ 参考答案
即使该任务执行失败,也继续执行后续任务,不中断playbook
默认情况下任务失败会中止整个play;ignore_errors: true允许失败继续;failed_when可自定义失败条件。
F15 sed命令中,sed 's/old/new/g' file 中的 g 标志的含义是 _____
✓ 参考答案
全局替换(global),替换每行中所有匹配项,不加g则只替换每行第一个
s/old/new/ 只替换首次匹配;s/old/new/g 替换全部;s/old/new/2 替换每行第2个匹配。
F16 Ansible中,delegate_to 关键字的作用是 _____
✓ 参考答案
将任务委托给指定的主机执行,而非当前inventory中的目标主机
常用场景:在数据库主节点上执行备份任务,或在负载均衡器上注册/注销服务节点。
F17 Shell中,IFS 变量的全称是 _____,默认值是 _____
✓ 参考答案
Internal Field Separator(内部字段分隔符);默认值为空格、制表符、换行符
IFS决定Shell如何分割字符串;可临时修改如 IFS=':' 来按冒号分割,处理完后恢复原值。
F18 Ansible中,通过 _____ 关键字可以在任务中包含另一个任务文件
✓ 参考答案
import_tasks 或 include_tasks
import_tasks: 静态导入,在解析时载入;include_tasks: 动态导入,运行时载入,支持条件和循环。
F19 在Shell数组中,${arr[@]}${arr[*]} 的区别是 _____
✓ 参考答案
加引号时有区别:"${arr[@]}" 每个元素作为独立参数;"${arr[*]}" 所有元素合并为一个字符串
不加引号时两者相同;for i in "${arr[@]}" 可正确处理含空格的元素。
F20 Ansible中检查Playbook语法是否正确,使用命令 ansible-playbook _____ playbook.yml
✓ 参考答案
--syntax-check
--syntax-check 只做语法检查,不执行;--check 是dry run,模拟执行但不修改系统。
F21 Linux中查看当前系统所有进程的命令是 _____,查看实时进程动态的命令是 _____
✓ 参考答案
ps aux(或 ps -ef);top(或 htop)
ps aux显示所有进程快照;top实时动态刷新显示进程;kill命令用于发送信号终止进程。
F22 Shell中,数组赋值语法为 arr=(a b c),获取数组所有元素用 _____,获取数组长度用 _____
✓ 参考答案
${arr[@]} 或 ${arr[*]};${#arr[@]}
arr[0]访问第一个元素;${arr[@]}展开所有元素;${#arr[@]}是数组元素个数;${#arr[0]}是第一个元素的字符串长度。
F23 Ansible中,在任务执行完毕后发送邮件通知,应在 Playbook 的 _____ 部分定义该操作,通过 _____ 关键字触发
✓ 参考答案
handlers;notify
handlers中定义处理动作;tasks中使用notify指定handler名称;只有任务状态为changed时才触发,且每个handler在一次play中只执行一次。
F24 使用 awk 打印 /etc/passwd 中 UID 大于 1000 的用户名(第1列),命令为:awk -F: '$_____ > _____ {print $1}' /etc/passwd
✓ 参考答案
3 > 1000(即 $3 > 1000)
/etc/passwd以冒号分隔,第3列是UID。-F:指定分隔符;$3是第3列;条件$3>1000筛选普通用户(系统用户UID通常小于1000)。
F25 Ansible中,ansible-vault rekey secret.yml 的作用是 _____
✓ 参考答案
更换加密文件的密码(重新加密)
vault常用子命令:encrypt加密、decrypt解密、view查看、edit编辑、rekey更换密码。运行playbook时用--ask-vault-pass或--vault-password-file提供密码。
F26 Shell脚本中,while true; do ... done 是 _____ 循环,退出该循环需要在循环体内使用 _____ 语句
✓ 参考答案
无限(死)循环;break
true命令始终返回0(成功),所以条件永远为真。常见模式:while true; do read input; [ "$input" = "quit" ] && break; done
F27 Ansible中,lineinfile 模块的作用是 _____,与 blockinfile 模块的区别是 _____
✓ 参考答案
确保文件中存在或不存在某一行内容;lineinfile管理单行,blockinfile管理多行文本块
lineinfile:确保某行存在/不存在,可用regexp定位替换;blockinfile:插入/更新/删除多行内容块,用标记行包裹。两者都支持幂等操作。
F28 在Shell中,nohup ./script.sh &nohup 的作用是 _____,& 的作用是 _____
✓ 参考答案
nohup:忽略SIGHUP信号,终端关闭后进程继续运行;&:将进程放入后台执行
两者常配合使用,实现"后台持续运行"。输出默认写入nohup.out。用jobs查看后台任务,fg调回前台,kill %1终止。

简答题

22 题 · 每题4分
S01 请简述Shell脚本中 breakcontinueexit 三者的区别。
✓ 参考答案
break / continue / exit
break:跳出当前循环(for/while/until),继续执行循环后的代码。
continue:跳过当前迭代剩余代码,直接进入下一次循环。
exit [n]:终止整个脚本(或当前Shell),n为退出状态码(默认0)。
S02 请解释Ansible的控制节点(Control Node)和被控节点(Managed Node)的概念及通信方式。
✓ 参考答案
控制节点 vs 被控节点
控制节点:安装了Ansible的主机,负责发送指令、执行playbook;需安装Python和Ansible。
被控节点:被Ansible管理的目标主机,只需安装Python和开启SSH服务,无需安装Ansible。
通信方式:默认通过SSH协议(端口22)通信;Windows被控节点使用WinRM;也支持local、docker等连接方式。
• Ansible是无代理(Agentless)架构,被控端不需要部署agent。
S03 写出一个完整的Shell函数示例,要求:接收两个数字参数,返回两数之和,并在函数外调用并打印结果。
✓ 参考答案
Shell函数示例
#!/bin/bash
add() {
    local a=$1
    local b=$2
    echo $((a + b))
}
result=$(add 3 5)
echo "3 + 5 = $result"
注意:Shell函数不能用return返回数值(return只返回0-255的状态码),需通过echo输出并用$()捕获。
S04 请描述Ansible Playbook的基本结构,包含至少:play名称、目标主机、任务列表,写出YAML示例框架。
✓ 参考答案
Playbook基本结构
---
- name: 示例Play名称
  hosts: webservers
  become: true
  vars:
    http_port: 80
  tasks:
    - name: 安装nginx
      yum:
        name: nginx
        state: present
    - name: 启动nginx服务
      service:
        name: nginx
        state: started
        enabled: yes
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted
S05 请解释什么是Shell中的管道(Pipe)?并举例说明如何统计 /etc/passwd 文件中的用户数量。
✓ 参考答案
管道(Pipe)
管道(|)将前一个命令的标准输出作为后一个命令的标准输入,实现命令链式处理。

统计/etc/passwd用户数量:
cat /etc/passwd | wc -l
或:wc -l < /etc/passwd

管道中每个命令在独立子Shell中运行,在管道中对变量赋值不会影响父Shell。
S06 Ansible中 roles 目录结构有哪些标准子目录?各自存放什么内容?
✓ 参考答案
Role标准目录结构
tasks/:主任务文件,main.yml为入口
handlers/:处理器,被notify触发
vars/:变量文件,优先级高于defaults
defaults/:默认变量,优先级最低,可被覆盖
files/:静态文件,供copy模块使用
templates/:Jinja2模板文件,供template模块使用
meta/:角色元数据,如依赖关系
tests/:测试用的inventory和playbook
S07 请编写一个Shell脚本,检测某个进程是否在运行,如果没有运行则自动启动它。
✓ 参考答案
进程守护脚本
#!/bin/bash
PROCESS="nginx"
if pgrep -x "$PROCESS" > /dev/null 2>&1; then
    echo "$PROCESS 正在运行"
else
    echo "$PROCESS 未运行,正在启动..."
    systemctl start "$PROCESS"
    if [ $? -eq 0 ]; then
        echo "$PROCESS 启动成功"
    else
        echo "$PROCESS 启动失败" >&2
        exit 1
    fi
fi
S08 请解释 ansible.cfg 中以下配置项的含义:remote_userprivate_key_filehost_key_checking
✓ 参考答案
ansible.cfg配置项
remote_user:连接被控节点时使用的默认SSH用户名(如 root 或 ansible)
private_key_file:指定SSH私钥文件路径,用于免密认证(如 ~/.ssh/id_rsa)
host_key_checking:是否检查SSH主机密钥;生产建议True,实验环境设False可避免首次连接的确认提示
S09 请解释Shell中单引号 ''、双引号 ""、反引号 `` 三者的区别。
✓ 参考答案
引号区别
单引号 '':强引用,所有字符原样输出,不进行任何转义和变量替换
双引号 "":弱引用,允许变量替换($var)、命令替换($(cmd))和转义(\n),但不允许通配符展开
反引号 ``:命令替换,执行其中的命令并将输出替换到当前位置,功能等同于 $(),但不支持嵌套
S10 Ansible中如何实现对多个主机并发执行任务?请解释 forks 参数的作用。
✓ 参考答案
forks并发控制
Ansible默认同时对多台主机并发执行,并发数由 forks 参数控制:
• 默认值为5,即同时操作5台主机
• 在 ansible.cfg 中设置:[defaults] forks = 20
• 或命令行:ansible-playbook -f 20 playbook.yml
serial 关键字可以控制rolling update(滚动更新),如 serial: 2 表示每次只更新2台主机
S11 请写出用 awk 命令统计 /etc/passwd 中每行第一个字段(用户名),并打印用户总数的命令。
✓ 参考答案
awk统计命令
awk -F: '{print $1}' /etc/passwd | wc -l
或使用awk的END块:
awk -F: 'END{print "用户总数: "NR}' /etc/passwd
-F: 指定字段分隔符为冒号;NR为总行数;$1为第一字段。
S12 请解释Ansible中 vars_filesvars_promptset_fact 三种定义变量方式的区别和使用场景。
✓ 参考答案
三种变量定义方式
vars_files:从外部YAML文件加载变量,适合管理大量配置参数,可按环境分文件,提高可维护性
vars_prompt:运行时交互式提示用户输入,适合敏感信息(如密码)不宜写入文件的场景;加 private: yes 可隐藏输入
set_fact:在任务运行时动态创建变量,基于执行结果计算变量值,作用域为当前play;常配合register使用
S13 请简述Shell脚本中 heredoc(here document) 的用法,并给出一个用它生成配置文件的示例。
✓ 参考答案
Here Document
heredoc 是一种多行字符串输入方式,语法为 <<EOF ... EOF
cat > /etc/nginx/conf.d/mysite.conf << EOF
server {
    listen 80;
    server_name ${DOMAIN};
    root /var/www/html;
}
EOF
• 结束标记EOF可以是任意词,但首尾必须一致
• 加引号 <<'EOF' 可禁止变量替换(原样输出)
• 加 - 号 <<-EOF 可忽略缩进中的制表符
S14 Ansible中,blockrescuealways 三个关键字如何实现错误处理?类比什么编程语言特性?
✓ 参考答案
block/rescue/always 错误处理
类比编程语言中的 try/except/finally 结构:
block:try块,包含正常执行的任务
rescue:except/catch块,block中任务失败时执行(错误恢复)
always:finally块,无论成功失败都会执行(清理操作)

- block:
    - name: 执行可能失败的任务
      command: /some/risky/command
  rescue:
    - name: 处理错误
      debug: msg="任务失败,正在恢复"
  always:
    - name: 清理临时文件
      file: path=/tmp/tmp_file state=absent
S15 请描述Shell脚本的调试方法,至少列举3种,并说明各自的适用场景。
✓ 参考答案
Shell调试方法
bash -x script.sh:追踪执行,打印每条命令及其展开后的内容,适合全脚本调试
set -x / set +x:在脚本中插入,精确控制调试范围,适合调试特定代码段
set -e:遇到非零返回值立即退出,防止错误被忽略,适合生产脚本加固
echo/printf打印变量:在关键位置输出变量值,简单直接
bash -n script.sh:语法检查,不执行脚本,只检查语法错误
trap 'echo "Error at line $LINENO"' ERR:捕获错误并显示行号
S16 请写出一个Shell脚本,实现:每隔5秒检查一次 nginx 进程是否存在,若不存在则自动重启,循环检测10次后退出。
✓ 参考答案
进程守护循环脚本
#!/bin/bash
count=0
while [ $count -lt 10 ]; do
    if ! pgrep -x "nginx" > /dev/null 2>&1; then
        echo "[$(date)] nginx未运行,正在重启..."
        systemctl start nginx
    else
        echo "[$(date)] nginx运行正常"
    fi
    count=$((count + 1))
    sleep 5
done
echo "检测完毕,共检测10次"
考察知识点:while循环、pgrep、$()命令替换、sleep、计数器、date格式化。
S17 请解释 Ansible 中变量的优先级顺序(至少列举5个来源,从高到低排列)。
✓ 参考答案
变量优先级(从高到低)
命令行 -e "key=value"(最高,覆盖一切)
任务中 vars: 定义
Playbook中 vars: 块
host_vars/ 目录(主机变量文件)
group_vars/ 目录(组变量文件)
roles/vars/main.yml
roles/defaults/main.yml(最低,最容易被覆盖)

记忆口诀:命令行最大,defaults最小,中间按范围从小到大排列。
S18 请写一个Ansible Playbook,实现:在 webservers 组批量创建3个系统用户(user1、user2、user3),并为每人创建家目录。要求使用 loop 循环,不能重复写3个task。
✓ 参考答案
loop批量创建用户
---
- name: 批量创建用户
  hosts: webservers
  become: true
  vars:
    users:
      - user1
      - user2
      - user3
  tasks:
    - name: 创建用户并建立家目录
      user:
        name: "{{ item }}"
        state: present
        create_home: yes
      loop: "{{ users }}"
S19 请解释什么是Linux中的软链接和硬链接?写出各自的创建命令,并说明两者的区别。
✓ 参考答案
软链接 vs 硬链接
硬链接:ln 源文件 链接名
• 与原文件共享同一个inode(数据块)
• 删除原文件,硬链接仍可访问数据
• 不能跨文件系统,不能链接目录

软链接(符号链接):ln -s 源文件 链接名
• 类似Windows快捷方式,存储的是原文件路径
• 删除原文件,软链接失效(变成死链接)
• 可以跨文件系统,可以链接目录

实际工作中软链接更常用,如 ln -s /app/v2.0 /app/current 实现版本切换。
S20 请写一个Shell脚本,读取一个包含多行 姓名 成绩 的文本文件,计算平均分并输出不及格(低于60分)的同学姓名。
✓ 参考答案
成绩统计脚本
#!/bin/bash
# scores.txt 格式:张三 85
file="scores.txt"
total=0
count=0
echo "=== 不及格名单 ==="
while read name score; do
    total=$((total + score))
    count=$((count + 1))
    if [ $score -lt 60 ]; then
        echo "  $name: $score 分"
    fi
done < "$file"
if [ $count -gt 0 ]; then
    avg=$((total / count))
    echo "=== 班级平均分: ${avg} 分 ==="
fi
S21 请解释Ansible中 import_playbookimport_tasksinclude_tasks 三者的区别和各自适用场景。
✓ 参考答案
三种导入方式的区别
import_playbook:在顶层导入另一个完整的playbook文件,静态,解析时载入,适合组织大型项目的入口文件(site.yml)

import_tasks:静态导入任务文件,在解析阶段载入,不支持在循环(loop)中使用,但--tags和--check对导入的任务有效

include_tasks:动态导入任务文件,在运行时载入,支持在loop中使用,支持when条件,适合需要条件判断或循环导入不同任务文件的场景

口诀:import=静态(编译期),include=动态(运行期)
S22 某公司有100台Web服务器需要每天凌晨3点自动备份 /var/www/html 目录到备份服务器,请设计一个完整方案(包含Shell脚本思路 + Ansible部署思路),不需要写完整代码,描述关键步骤即可。
✓ 参考答案
自动化备份方案设计
Shell脚本部分(backup.sh):
① 定义变量:源目录、备份服务器IP、日期戳
② 用tar打包压缩:tar -czf backup_$(date +%Y%m%d).tar.gz /var/www/html
③ 用rsync/scp传输到备份服务器
④ 删除本地7天前的备份文件:find /backup -mtime +7 -delete
⑤ 记录日志,成功/失败都写入log文件

Ansible部署部分:
① 编写Playbook:用copy/template模块将backup.sh分发到100台服务器
② 用cron模块在每台服务器上添加定时任务:0 3 * * * /scripts/backup.sh
③ 用file模块确保备份目录存在且权限正确
④ 配置SSH免密登录(ssh-keygen + authorized_key模块)用于rsync传输

这道题考察综合运用能力,思路清晰、关键步骤完整即可得分。
--
答题进度 0 / 55
单选+多选: 0分