删除主机文件的模块? (B)
A. delete
B. file
C. remove
D. rm
tasks 作用: (B)
A. 指定目标主机
B. 定义执行任务
C. 设置变量
D. 引入角色
docker_container 模块端口映射正确写法? (B)
A. port: 80:8080
B. ports: ["80:8080"]
C. ports: "80:8080"
D. expose: 80:8080
ls *.txt 作用: (B)
A. 查看所有文件
B. 查看当前目录下所有 .txt 文件
C. 删除所有 .txt 文件
D. 复制所有 .txt 文件
检查脚本 [auto.sh](auto.sh) 语法(不执行)? (A)
A. sh -n [auto.sh](auto.sh)
B. sh -v [auto.sh](auto.sh)
C. sh -x [auto.sh](auto.sh)
D. sh --check [auto.sh](auto.sh)
until循环count等于5才退出: (A)
A. count=1; until [ $count -eq 5 ]; do echo $ count; count=$((count+1)); done
B. count=1; until ((count == 5)); do echo $count; count=$ ((count+1)); done
C. count=1; until [ $count == 5 ]; do echo $ count; count=$((count+1)); done
D. 以上三项均正确
判断进程是否运行,正确写法是? (B)
A. pid=$(ps -ef | grep nginx)
B. pid=$(pgrep nginx)
C. pid=$(systemctl status nginx)
D. pid=$(which nginx)
awk 输出 3–10 行的正确写法? (B)
A. awk '3,10' file
B. awk 'NR>=3 && NR<=10' file
C. awk 'NR==3-10' file
D. awk '3<=NR<=10' file
grep "error" log.txt: (A)
A. 查找包含error的行
B. 删除包含error的行
C. 替换error
D. 统计error次数
ansible.cfg作用: (B)
A. 存储主机列表
B. 配置默认参数
C. 定义任务
D. 管理角色
Shell 中 until 语句的含义是? (B)
A. 当条件为真执行
B. 当条件为假执行
C. 无限循环
D. 执行一次
playbook 中 serial 参数作用是? (C)
A. 设置重试次数
B. 设置任务超时
C. 控制并发主机数量
D. 控制任务重启次数
要设置环境变量 MYVAR 为 hello world,正确的方式是? (C)
A. MYVAR="hello world"
B. set MYVAR="hello world"
C. export MYVAR="hello world"
D. setenv MYVAR="hello world"
awk 设置输出分隔符为“|”用法是? (C)
A. -F '|'
B. -S '|'
C. -v OFS='|'
D. -v FS='|'
Ansible 中执行 playbook 的命令是? (B)
A. ansible-run
B. ansible-playbook
C. playbook-run
D. run-ansible
模板中条件判断语法? (A)
A. {% if 条件 %} 内容 {% endif %}
B. if (条件) then 内容
C. $if 条件 then 内容
D. when: 条件
创建符号链接模块是? (B)
A. link
B. file
C. symlink
D. ln
Jinja2 输出变量 username: (B)
A. {% username %}
B. {{ username }}
C. {username}
D. $username
以下关于 awk 的说法正确的是? (C)
A. awk 的 -n 参数表示“不打印自动输出”
B. awk 的 -n 参数表示“打印行号”
C. awk 不存在 -n 参数,-n 是 sed 的选项
D. awk -n 用于静默模式
删除角色 nginx 命令: (A)
A. ansible-galaxy remove nginx
B. ansible-galaxy delete nginx
C. ansible-galaxy uninstall nginx
D. ansible-galaxy rm nginx
在 inventory 文件中定义组使用? (A)
A. [web]
B. {web}
C. (web)
D. <web>
删除文件夹及其内容正确方式? (C)
A. rm folder
B. rm -f folder
C. rm -r folder
D. rmdir folder
在 Jinja2 模板中,表示条件语句的标记是? (A)
A. {% ... %}
B. {{ ... }}
C. ##
D. $$
sed 命令中 s/old/new/g 表示? (B)
A. 删除 old
B. 替换所有 old 为 new
C. 替换首个 old 为 new
D. 替换最后一个 old 为 new
以下 awk 语句中,哪一个可以正确打印文件每行的第一个字段和第三个字段? (B)
A. awk '{print $1 $ 3}' file
B. awk '{print $1, $ 3}' file
C. awk '{sum= $1+$ 3}' file
D. awk 'print $1 $ 3' file
定义 var="linux": (B)
A. var = "linux"
B. var="linux"
C. set var="linux"
D. export var="linux"
删除文件第5行命令是? (A)
A. sed '5d' file
B. sed 'd5' file
C. sed 'del 5' file
D. sed -d 5 file
查看内存占用率最合适的命令? (B)
A. mem
B. top
C. free -m
D. df -h
为任务添加标签的关键字? (A)
A. tags
B. label
C. mark
D. name
Ansible Playbook 使用什么格式定义自动化任务? (B)
A. XML
B. YAML
C. JSON
D. INI
表示系统发行版的 Ansible 变量是? (B)
A. ansible_os_family
B. ansible_distribution
C. ansible_system
D. ansible_platform
copy文件: (A)
A. cp file
1.txt file2.txt
B. mv file
1.txt file2.txt
C. copy file
1.txt file2.txt
D. du file
1.txt file2.txt
Jinja2 中为变量设置默认值用? (A)
A. default()
B. fallback()
C. setdefault()
D. value()
web组且CentOS执行任务的when条件: (A)
A. when: "'web' in group_names and ansible_distribution == 'CentOS'"
B. when: group == 'web' and os == 'CentOS'
C. when: group_names is 'web' and ansible_os == 'CentOS'
D. when: inventory_group == 'web' and ansible_distribution = 'CentOS'
捕获命令输出正确写法? (B)
A. res=ls -l
B. res=$(ls -l)
C. res=$ls -l
D. res="ls -l"
管理SELinux策略模块: (C)
A. selinux
B. setsebool
C. semanage
D. selinux_policy
查看当前所在目录路径? (B)
A. dir
B. pwd
C. cd
D. ls
变量可以在 Ansible 的哪些位置定义? (C)
A. 仅在 Playbook 中
B. 仅在命令行参数中
C. 主机组和主机的 group_vars 和 host_vars 目录中
D. 仅在 play 中
将数组 arr=(a b c d) 用逗号拼接输出? (A)
A. echo ${arr[*]} | tr ' ' ','
B. echo ${arr[@]} | sed 's/ /,/g'
C. IFS=,; echo ${arr[*]}
D. join ',' ${arr[@]}
指定任务在 db 组执行: (A)
A. hosts: db
B. group: db
C. target: db
D. server: db
删除含前导空格的#注释行: (B)
A. sed '/^#/d' text.txt
B. sed '/^\s*#/d' text.txt
C. sed 's/^#.*//' text.txt
D. sed '/#.*/d' text.txt
sed 将每行行首添加#的命令? (A)
A. sed 's/^/#/'
B. sed 's/$/#/'
C. sed '/#/g'
D. sed 's/*/#/'
管理服务状态的模块: (A)
A. service
B. system
C. daemon
D. start
把错误输出重定向到 error.log? (A)
A. command 2> error.log
B. command > error.log 2>&1
C. command error.log 2>
D. command >&2 error.log
下列哪个变量表示当前 Shell 的路径? (B)
A. BASH
B. SHELL
C. KSH
D. C
Shell 脚本中 i=$((i+1)) 的作用是? (A)
A. i 自增 1
B. i 减 1
C. i 乘 1
D. i 除 1
在 Shell 中,下列哪个条件表达式可以判断变量 str 是否为空? (C)
A. if [ str == "" ]
B. if [[ str = "" ]]
C. if [ -z "$str" ]
D. if [ -n $str ]
安装 RPM 用: (B)
A. apt
B. yum
C. install
D. package
在 Ansible Playbook 中,指定目标主机的属性是? (B)
A. 在命令行参数中指定
B. hosts
C. tasks
D. groups
任务依赖 install_pkg: (C)
A. depends_on: install_pkg
B. after: install_pkg
C. when: install_pkg is succeeded
D. tags: ["after_install"]
sudo执行ls /root: (A)
A. ansible all -m command -a "ls /root" -b
B. ansible all -m shell -a "sudo ls /root"
C. ansible all -m command -a "sudo ls /root"
D. ansible all -m command -a "ls /root" --sudo
查找WARNING且行号在100-200之间的行,正确命令是? (B)
A. grep "WARNING" app.log | sed -n '100,200p'
B. grep -n "WARNING" app.log | awk -F ":" ' $1>=100 && $ 1<=200'
C. grep "WARNING" app.log -A100 -B100
D. sed -n '100,200p' app.log | grep "WARNING"
echo "Hello" 会? (A)
A. 输出“Hello”并自动换行
B. 仅输出“Hello”不换行
C. 提示语法错误
D. 清空屏幕
以下哪个命令可以准确删除第 20-100 行? (B)
A. sed -n '1,19p;101,$p' file
B. sed '20,100d' file
C. awk 'NR<20 || NR>100' file
D. grep -v "^20|^21|..." file
“事实变量”作用: (B)
A. 存储自定义配置
B. 自动获取受管主机信息
C. 定义任务顺序
D. 控制任务是否执行
执行 Playbook: (B)
A. ansible-run site.yml
B. ansible-playbook site.yml
C. playbook-exec site.yml
D. run-playbook site.yml
查看脚本执行过程显示每行命令? (C)
A. sh -v [script.sh](script.sh)
B. sh -n [script.sh](script.sh)
C. sh -x [script.sh](script.sh)
D. sh -e [script.sh](script.sh)
sed只替换第10行port=80为port=8080: (A)
A. sed '10s/port=80/port=8080/' config.ini
B. sed 's/port=80/port=8080/10' config.ini
C. sed '10,/port=80/s//port=8080/' config.ini
D. sed '/port=80/10s//port=8080/' config.ini
测试 web 组连通性: (A)
A. ansible web -m ping
B. ansible web -m test
C. ansible ping web
D. ansible test web
Playbook语法检查: (B)
A. ansible-playbook --check site.yml
B. ansible-playbook --syntax-check site.yml
C. ansible-playbook -n site.yml
D. ansible-playbook --test site.yml
awk筛选第四列>5000: (D)
A. awk '$4>5000' user.txt
B. awk '{if( $4>5000) print $ 0}' user.txt
C. awk -F ' ' '$4>5000 {print}' user.txt
D. 以上三项均正确
Shell 中用于赋值的算术运算符是? (D)
A. +
B. -
C. ==
D. =
判断一个文件是否存在且为普通文件的选项是? (C)
A. -d
B. -e
C. -f
D. -r
实现条件控制结束的关键字是? (D)
A. endif
B. end
C. done
D. fi
在 Ansible 中用于控制服务启动/停止的标准模块是? (A)
A. service
B. systemd
C. init
D. start
遍历字典 users 的写法? (A)
A. loop: {{ users | dict2items }}
B. with_dict: {{ users }}
C. loop: {{ users.keys() }}
D. with_items: {{ users.values() }}
复制文件模块: (B)
A. move
B. copy
C. transfer
D. send
模板文件的后缀是? (B)
A. .yaml
B. .j2
C. .tpl
D. .jinja
显示匹配行及其上下3行? (B)
A. -A3 -B3
B. -C3
C. -N3
D. -L3
查找不包含 error 的行? (B)
A. grep "!error" log.txt
B. grep -v "error" log.txt
C. grep "not error" log.txt
D. grep --exclude "error" log.txt
Ansible 中用于任务顺序触发的正确方式是? (B)
A. depends_on
B. handlers + notify
C. priority 字段
D. before 指令
Ansible 默认使用什么协议与受管主机通信? (C)
A. FTP
B. HTTP
C. SSH
D. Telnet
触发 handler 的关键字是? (A)
A. notify
B. call
C. handler
D. trigger
若要将新的环境变量 VAR 加入当前 Shell,正确的命令是? (B)
A. set VAR=value
B. export VAR=value
C. VAR=value
D. echo VAR=value
Jinja2 中判断变量为 True 的语法是? (A)
A. var == True
B. if var = true
C. if var is true
D. var eq true
if 语句的基本语法是? (A)
A. if [ condition ]
B. if ( condition )
C. if { condition }
D. if < condition >
在 Shell 脚本中,$2 表示? (B)
A. 参数个数
B. 第二个参数
C. 第二行输入
D. 第二个进程
fetch拉取日志: (D)
A. 正确
B. 错误
C. copy模块错误
D. 按主机创建子目录
计算 2+3: (B)
A. echo 2+3
B. echo $((2+3))
C. echo 2+3 | bc
D. calc 2+3
输出带换行符“Hello\nWorld”正确写法? (B)
A. echo "Hello\nWorld"
B. echo -e "Hello\nWorld"
C. echo Hello\nWorld
D. echo -n "Hello\nWorld"
判断是否为目录? (A)
A. [ -d "$file" ]
B. [ -f "$file" ]
C. [ -e "$file" ]
D. [ -r "$file" ]
Shell 中的逻辑与运算符是? (B)
A. +
B. &&
C. *
D. -
ansible 命令显示最详细日志用? (D)
A. -v
B. -vv
C. -vvv
D. -vvvv
可在输出中控制输出格式的命令是? (B)
A. echo
B. printf
C. read
D. cat
测试主机连通性命令? (A)
A. ansible all -m ping
B. ansible all -m test
C. ansible -m ping *
D. ansible ping all
函数中声明局部变量的关键字是? (A)
A. local
B. declare
C. export
D. static
在 playbook 中循环任务使用? (A)
A. loop
B. iterate
C. repeat
D. for
for 语句遍历数组元素的正确写法是? (D)
A. for i in {
1..5}; do echo i; done
B. for i in (1 2 3 4 5); do echo i; done
C. for i in [1 2 3 4 5]; do echo i; done
D. for i in 1 2 3 4 5; do echo i; done
查看 copy 模块文档: (B)
A. ansible-help copy
B. ansible-doc copy
C. ansible-man copy
D. ansible-info copy
sed 替换所有 abc 为 xyz 的正确写法? (C)
A. sed 's/abc/xyz'
B. sed 's/abc/xyz/'
C. sed 's/abc/xyz/g'
D. sed 'replace abc xyz'
awk 中 $2>100 {print $ 0} 表示? (A)
A. 打印第二列大于100的行
B. 打印第二列等于100的行
C. 打印第二列小于100的行
D. 打印全部行
Jinja2 中 for 循环的正确写法是? (A)
A. {% for i in list %}{% endfor %}
B. for i in list:
C. [for i in list]
D. loop(i)
直接修改原文件的 sed 选项? (B)
A. -n
B. -i
C. -e
D. -f
Ansible 默认的配置文件是? (A)
A. ansible.cfg
B. ansible.conf
C. ansible.yml
D. ansible.ini
使用 sudo 权限: (B)
A. sudo: yes
B. become: yes
C. root: yes
D. admin: yes
在模板中引用变量的语法是? (B)
A. $var
B. {{ var }}
C. [% var %]
D. << var >>
Ansible 默认通信协议: (B)
A. HTTP
B. SSH
C. FTP
D. Telnet
哪种输出重定向写法会将输出追加到文件末尾? (B)
A. command > filename
B. command >> filename
C. command < filename
D. command << filename
禁止 root 登录 SSH 正确修改字段? (B)
A. DenyRootLogin no
B. PermitRootLogin no
C. RootLogin off
D. RootDeny true
管理 apt 源的模块是? (A)
A. apt_repository
B. apt_key
C. apt_config
D. apt_source
以下哪个命令可以统计当前目录及子目录中所有 .log 文件的数量? (B)
A. ls *.log | wc -l
B. find . -name "*.log" -type f | wc -l
C. grep ".log" -r . | wc -l
D. du -a | grep ".log" | wc -l
删除 testdir 目录及其文件: (C)
A. rm testdir
B. rm -f testdir
C. rm -r testdir
D. rmdir testdir
获取数组长度的正确方法是? (C)
A. ${array[@]}
B. ${array[*]}
C. ${#array[@]}
D. ${array[#]}
Shell 脚本中,判断两个整数是否相等的选项是? (A)
A. -eq
B. -lt
C. -ne
D. -gt
创建目录使用哪个模块? (C)
A. mkdir
B. make
C. file
D. directory
read -p "请输入:" var: (A)
A. 提示并获取输入存入var
B. 仅输出提示
C. 清空var
D. 显示var
从文件逐行读取内容正确的是? (A)
A. while read line; do ...; done < file
B. for line in file; do ...; done
C. cat file | while line; do ...; done
D. read file | while read line; do ...; done
设置冒号为字段分隔符? (A)
A. awk -F ':' '{print $1}' data.txt
B. awk 'FS=":" {print $1}'
C. awk '{FS=":"; print $1}'
D. awk -d ':' '{print $1}'
awk 中 -F ',' 的含义是? (A)
A. 指定逗号为分隔符
B. 忽略逗号
C. 删除逗号
D. 替换逗号
循环遍历列表: (A)
A. loop
B. for
C. cycle
D. repeat
创建角色的命令是? (A)
A. ansible-galaxy init
B. ansible-galaxy new
C. ansible-role create
D. ansible init role
以下哪种方式能够正确输出 2 到 10 之间的所有偶数? (D)
A. for i in {
1..10}; do if ((i%2==0)); then echo $i; fi; done
B. for i in seq 2 2 10; do echo i; done
C. for i in $(seq 1 2 10); do echo $ i; done
D. for i in {2..10..2}; do echo $i; done
禁用主机事实收集的配置项是? (A)
A. gather_facts: false
B. collect_facts: no
C. gather_info: false
D. facts: off
Ansible 中查看模块用法的命令是? (B)
A. ansible-help
B. ansible-doc
C. ansible-module
D. ansible-info
统计第二列等于 admin 的行数? (A)
A. awk '$2=="admin" {count++} END{print count}' data.txt
B. awk '$2=admin {count++} END{print count}' data.txt
C. awk 'if($2=="admin") count++ END{print count}' data.txt
D. awk '$2=="admin" count++ END{print count}' data.txt
复制文件到远程主机使用模块? (A)
A. copy
B. fetch
C. file
D. template
handler 任务执行条件是? (B)
A. 每次任务都执行
B. 仅在任务发生变化时执行
C. 每次失败时执行
D. 在循环中执行
printf 命令中用于输出字符串的格式化符号是? (A)
A. %s
B. %d
C. %f
D. %x
Playbook 文件格式: (C)
A. XML
B. JSON
C. YAML
D. INI
删除数组中某个元素的命令是? (B)
A. remove array[1]
B. unset array[1]
C. del array[1]
D. erase array[1]
环境变量 PATH 中,冒号分隔的各个目录的意义是? (C)
A. 用户的主目录
B. 系统的配置文件目录
C. 可执行文件的搜索路径
D. 常用工具的安装目录
Bash 中,以下写法能正确比较整数的是? (B)
A. if [ a > b ]
B. if ((a > b))
C. if [ $a > $ b ]
D. if a > b
判断 file_size 大于 1024? (C)
A. when: file_size > 1024
B. when: {{ file_size }} > 1024
C. when: file_size | int > 1024
D. when: file_size is greater than 1024
使用 ansible-galaxy 搜索角色用? (B)
A. ansible-galaxy list
B. ansible-galaxy search
C. ansible-galaxy find
D. ansible-galaxy query
正确统计当前用户登录次数的是? (C)
A. who | wc
B. whoami | wc
C. who | grep "$(whoami)" | wc -l
D. loginctl count
下列哪个是 Ansible 中执行带管道命令的正确模块? (B)
A. command
B. shell
C. exec
D. run
管理容器镜像的模块? (A)
A. docker_image
B. docker_container
C. podman_image
D. container
role判断admin: (A)
A. {% if role == 'admin' %}管理员{% else %}普通用户{% endif %}
B. {{ role == 'admin' ? '管理员' : '普通用户' }}
C. {% if role is 'admin' %}管理员{% else %}普通用户{% endif %}
D. {{ if role == 'admin' then '管理员' else '普通用户' }}
grep 命令中忽略大小写的参数是? (A)
A. -i
B. -v
C. -n
D. -l
在第3行后插入“new line”? (A)
A. sed '3a new line' file.txt
B. sed '3i new line' file.txt
C. sed '3c new line' file.txt
D. sed '3s/^/new line/' file.txt
判断字符串 str 是否等于 "linux"? (A)
A. if [ "$str" = "linux" ]; then
B. if [ "$str" == "linux" ]; then
C. if ((str == "linux")); then
D. if [ $str -eq "linux" ]; then
判断变量是否为数字正确写法? (B)
A. if [ $x -eq number ]
B. if [[ $x =~ ^[0-9]+$ ]]
C. if number $x
D. test number $x
register 关键字的作用是? (B)
A. 定义主机清单文件
B. 保存任务执行结果
C. 定义变量
D. 设置条件语句
awk 中 NR 表示? (A)
A. 当前行号
B. 当前列号
C. 文件总数
D. 文件名
ansible-galaxy 作用: (B)
A. 执行Playbook
B. 管理角色
C. 测试连通性
D. 查看帮助
Ansible 中收集主机信息的模块是? (A)
A. setup
B. gather
C. facts
D. info
Ansible 中用于创建 Docker 容器的模块是? (A)
A. docker_container
B. container
C. docker
D. create_container
遍历一个目录中所有文件的 for 语句写法是? (C)
A. for file in (ls /path/to/directory); do echo file; done
B. for file in ls /path/to/directory; do echo file; done
C. for file in /path/to/directory/*; do echo file; done
D. for file in /path/to/directory; do echo file; done
关于 Ansible 的 Ad Hoc 命令,描述正确的是? (D)
A. 只能在特定时间运行
B. 在单个主机上并行执行
C. 用于创建和管理主机清单文件
D. 用于手动执行特定任务
Playbook 指定远程执行用户为 admin? (A)
A. remote_user: admin
B. user: admin
C. ssh_user: admin
D. execute_user: admin
将 date 写入 time.txt(覆盖): (B)
A. date >> time.txt
B. date > time.txt
C. date < time.txt
D. date | time.txt
用于显示 Ansible Playbook 中某个任务输出结果的模块是? (A)
A. debug
B. output
C. print
D. show
awk 过滤第 5 行之后的内容,正确写法是? (B)
A. awk 'NR < 4' file
B. awk 'NR > 4' file
C. awk 'NR >= 4' file
D. awk '{if(NR>=4) print}' file
用于加载配置文件的命令是? (C)
A. exec
B. load
C. source
D. Include
给 [test.sh](test.sh) 加可执行权限: (C)
A. chmod +r [test.sh](test.sh)
B. chmod +w [test.sh](test.sh)
C. chmod +x [test.sh](test.sh)
D. chmod +a [test.sh](test.sh)
多个条件的逻辑或关系运算符是? (A)
A. ||
B. &&
C. or
D. and
判断a.txt是否为普通文件: (B)
A. 判断是否目录
B. 判断是否普通文件
C. 判断是否可读
D. 判断是否可写
忽略任务错误继续执行使用? (A)
A. ignore_errors: yes
B. skip_error: yes
C. continue_on_fail: true
D. error_ignore: on
在 playbook 中引入外部变量文件使用? (B)
A. include_vars
B. vars_files
C. vars_include
D. import_vars
定义数组正确的是? (A)
A. array=(1 2 3 4 5)
B. array=[1,2,3,4,5]
C. array={1 2 3 4 5}
D. array=(1,2,3,4,5)
以下哪个写法是 Bash 中最规范的区间判断逻辑? 判断 num 是否在 10 到 20 之间。 (D)
A. [ $num -gt 10 -a $ num -lt 20 ]
B. test $num -gt 10 -a $ num -lt 20
C. [[ $num -gt 10 && $ num -lt 20 ]]
D. (($num > 10 && num < 20))
查找当前目录所有 .sh 文件并输出完整路径: (B)
A. ls *.sh
B. find ./ -name "*.sh" -type f
C. grep ".sh" .
D. sh find . *.sh
Jinja2 保留 2 位小数: (C)
A. {{ price | round(2) }}
B. {{ price | format("%.2f") }}
C. {{ "%.2f" | format(price) }}
D. {{ price | decimal(2) }}
使用 sudo 权限? (B)
A. sudo: yes
B. become: yes
C. sudo_user: root
D. become_user: root
取消定义变量 var? (A)
A. unset var
B. delete var
C. remove var
D. clear var
只执行带某标签的任务命令? (C)
A. ansible-playbook site.yml --tags "config"
B. ansible-playbook site.yml --run config
C. ansible-playbook site.yml -t config
D. ansible-playbook site.yml -l config
Ansible中执行命令的模块? (A)
A. command
B. exec
C. run
D. shell
select opt in "yes" "no"; do echo $opt; done 表示? (D)
A. if 判断
B. case 选择
C. for 循环
D. 交互菜单选择
在 RHEL 系统上安装软件包应使用? (B)
A. apt
B. yum
C. dnf
D. zypper
Shell 中统计目录中文件数量最安全的写法是? (B)
A. ls | wc -l
B. find . -type f | wc -l
C. du -a | wc -l
D. echo $(ls) | wc -w
统计 file.txt 行数: (A)
A. wc -l file.txt
B. wc -w file.txt
C. wc -c file.txt
D. wc -m file.txt
读取文件第一行正确方式是? (D)
A. head file
B. head -1 file
C. head file -n1
D. head -n1 file
将 date 输出追加到 log.txt? (A)
A. date >> log.txt
B. date > log.txt
C. date 2>> log.txt
D. date | tee -a log.txt
查看前5行: (A)
A. head -5 file.txt
B. tail -5 file.txt
C. cat -5 file.txt
D. more -5 file.txt
在 GNU sed 中删除以 # 开头(包含前置空格)的行,规范写法是? (B)
A. sed '/^\s*#/d' file
B. sed '/^[[:space:]]*#/d' file
C. sed 's/#.*//' file
D. sed '/^#/d' file
grep '^test' file.txt 命令表示? (B)
A. 匹配包含 test 的行
B. 匹配以 test 开头的行
C. 匹配以 test 结尾的行
D. 匹配不含 test 的行
printf 输出整数123和字符串 test? (A)
A. printf "数字:%d,名称:%s" 123 "test"
B. printf "数字:123,名称:test"
C. printf "数字:%s,名称:%d" 123 "test"
D. printf "数字:%d,名称:%s\n" "test" 123
用于实现多条件选择语句的是? (C)
A. if
B. else
C. case
D. for
执行 for i in 1 2 3… 输出? (C)
A. 1
B. 1 2
C. 1 2 3
D. 3 2 1
Playbook中hosts: all表示在清单所有主机上执行任务。(A)
A对
B错
awk '{print $2}' 输出第二个字段。(A)
A对
B错
template 模块会自动渲染 Jinja2 模板并复制到受管主机。(A)
A对
B错
loop与with_items功能相同。(A)
A对
B错
for 循环中 do 和 done 是必须出现的保留字。(A)
A对
B错
file模块只能创建文件,不能创建目录或删除文件。(B)
A对
B错
source命令和.(点号)命令功能相同,均可用于加载配置文件并使配置在当前Shell生效。(A)
A对
B错
authorized_key 添加公钥实现免密登录。(A)
A对
B错
rm testdir 会删除整个 testdir 目录及其中所有文件。(B)
A对
B错
Jinja2中default过滤器用于设置变量默认值。(A)
A对
B错
数组 arr=("A" "B" "C") 中,${arr[3]} 会返回 "C"。(B)
A对
B错
Shell脚本中,read -p "提示信息" var命令可以在获取用户输入时显示自定义提示文本。(A)
A对
B错
touch 文件 已存在时更新访问时间,不会更新修改时间。(B)
A对
B错
register 关键字可以用来保存任务执行结果供后续任务使用。(A)
A对
B错
ls *.sh 会列出当前目录以及子目录中的所有 .sh 文件。(B)
A对
B错
--diff 显示配置文件前后差异。(A)
A对
B错
now() 函数可直接获取当前系统时间。(B)
A对
B错
ansible-playbook demo.yml 会按照 Playbook 的顺序执行所有任务。(A)
A对
B错
mv old new 会移动旧文件到新路径,也能重命名文件。(A)
A对
B错
tail -2 file.txt 会显示最后2行。(A)
A对
B错
grep -r keyword /var 可以递归搜索 /var 下所有文件。(A)
A对
B错
在Shell中,echo $USER 会显示当前登录用户。(A)
A对
B错
for i in 1 2 3; do echo $i; done 会依次输出 1 2 3。(A)
A对
B错
apt 模块也可以用于 CentOS。(B)
A对
B错
给脚本添加执行权限应使用 chmod 777 script.sh,这是最安全的方式。(B)
A对
B错
环境变量 PATH 用来记录当前工作目录的路径。(B)
A对
B错
facts变量是用户自定义的变量。(B)
A对
B错
ansible-galaxy search 可以搜索 Galaxy 上的角色。(A)
A对
B错
firewalld 模块可以设置端口规则,但不能立即生效。(B)
A对
B错
rm file 默认会提示确认是否删除。(B)
A对
B错
awk '{print $NF}' 会打印每一行的最后一个字段。(A)
A对
B错
使用export VAR=value命令设置的环境变量,仅在当前Shell会话及子Shell中生效,无法永久保存。(A)
A对
B错
yum 模块也可以在 Ubuntu 系统中正常使用。(B)
A对
B错
cat file.txt 适合查看大文件内容。(B)
A对
B错
grep "error" log.txt 只能匹配整行完全等于 error 的内容。(B)
A对
B错
Jinja2 中 upper 过滤器可将字符串转换为全大写。(A)
A对
B错
awk '{print NR, $0}' file.txt 会打印行号和整行内容。(A)
A对
B错
file 模块 state: absent 会删除文件。(A)
A对
B错
chmod 777 file.txt 是一种安全的权限设置方式,适合所有场景。(B)
A对
B错
printf命令输出字符串时,默认会自动添加换行符,无需手动指定\n。(B)
A对
B错
docker_image 模块不能删除镜像。(B)
A对
B错
"HELLO" | lower 输出 hello。(A)
A对
B错
vars: 部分定义的变量只能在当前任务中使用,无法被其他任务读取。(B)
A对
B错
diff file1 file2 能比较两个文件是否相同。(A)
A对
B错
Playbook 中 handlers 必须立即执行,不需要 notify。(B)
A对
B错
ansible-galaxy list 显示本地安装角色。(A)
A对
B错
ls -l 只显示文件权限,不显示时间戳。(B)
A对
B错
sed 's/foo/bar/g' file.txt 会替换所有 foo,并且直接修改文件内容。(B)
A对
B错
head -3 file.txt 显示前3行内容。(A)
A对
B错
Ansible 控制节点必须能够 ping 通受管主机才能执行任务。(B)
A对
B错
join 过滤器可以把列表拼接成字符串。(A)
A对
B错
register用于捕获任务执行结果并存为字典类型变量。(A)
A对
B错
Playbook 若任务失败默认跳过继续执行。(B)
A对
B错
grep -v "pattern" file命令用于查找file中包含pattern的行,并输出这些行。(B)
A对
B错
ansible-doc docker_container命令可以查看模块文档。(A)
A对
B错
awk脚本中,NR表示当前处理的行号,NF表示当前行的字段总数。(A)
A对
B错
grep "hello" 会匹配包含 hello 的所有行。(A)
A对
B错
awk -F ',' '{print $1, $3}' data.csv命令以逗号为分隔符,输出data.csv的第1和第3列。(A)
A对
B错
事实变量(facts)会自动收集系统信息,不需要用户定义。(A)
A对
B错
Ansible 控制节点必须是 Linux 或类 Unix 系统,但不能是 Windows。(B)
A对
B错
become: yes 表示使用 sudo 权限执行任务。(A)
A对
B错
Jinja2 中使用变量需写成 ${var}。(B)
A对
B错
ansible-playbook -v 只显示错误,不显示命令细节。(B)
A对
B错
ansible-galaxy init 会创建一个角色的基本目录结构。(A)
A对
B错
become_user: root 不需要 become: yes 就能生效。(B)
A对
B错
Ansible 控制节点必须能 ping 通受管主机,否则无法使用。(B)
A对
B错
copy 模块可以复制本地文件并自动创建目标目录。(A)
A对
B错
while 循环需要使用 incre++ 的语法更新变量。(B)
A对
B错
docker_container 模块可以启动容器,但不能停止容器。(B)
A对
B错
在Shell数组中,${arr[*]}和${arr[@]}的作用完全一致,均会将数组元素以空格分隔拼接成字符串。(B)
A对
B错
在 Playbook 中 tasks 字段可以省略不写。(B)
A对
B错
handler 会立即执行,不受更改触发影响。(B)
A对
B错
使用 source 命令加载配置文件时,不会影响当前 Shell 的环境变量。(B)
A对
B错
在Shell脚本中,缺少开头的 #!/bin/bash 会导致脚本永远无法执行。(B)
A对
B错
ansible.cfg 的 remote_user 设置默认登录用户。(A)
A对
B错
sed '3d' file.txt命令会删除file.txt的第3行,并直接修改原文件内容。(B)
A对
B错
使用 VAR=abc 定义的变量,不需要使用 $VAR 就能直接输出 abc。(B)
A对
B错
loop.index可用于获取循环索引,从1开始。(A)
A对
B错
ansible web -m apt -a "name=nginx state=present" 可以在 CentOS 主机上安装 nginx。(B)
A对
B错
ansible-doc -s service 显示 service 模块参数格式。(A)
A对
B错
docker_container 模块只能启动 Docker 服务,不能删除容器。(B)
A对
B错
Jinja2 中 {{ value | upper }} 会将字符串转为大写。(A)
A对
B错
ansible-playbook -k site.yml 会要求用户输入SSH密码。(A)
A对
B错
输出重定向command > file会覆盖文件file的原有内容,若文件不存在则创建该文件。(A)
A对
B错
环境变量PATH中,目录之间使用分号;分隔,用于指定系统搜索可执行文件的路径。(B)
A对
B错
Ansible Ad Hoc命令无法批量执行,必须通过Playbook实现批量操作。(B)
A对
B错
ansible-galaxy install nginx命令可安装nginx角色。(A)
A对
B错
Shell中的逻辑或运算符是&&,逻辑与运算符是||。(B)
A对
B错
register 变量可以用于下一步条件判断。(A)
A对
B错
cp file1 file2 会覆盖 file2,不会提示确认。(A)
A对
B错
ansible db -m command -a "uptime" 会在 db 主机组执行命令。(A)
A对
B错
在Shell脚本中,$?变量用于表示上一条命令的执行结果,0表示执行成功,非0表示执行失败。(A)
A对
B错
read var 会等待用户输入并存入 var。(A)
A对
B错
echo 命令默认输出内容后会换行,但 echo -n 会取消换行。(A)
A对
B错
ansible-playbook --tags install 只执行带 install 标签的任务。(A)
A对
B错
在Shell中,ls -a 会显示所有文件,包括隐藏文件。(A)
A对
B错
tasks 中的任务按顺序执行。(A)
A对
B错
Shell 函数必须使用 function 关键字,否则不能执行。(B)
A对
B错
awk 默认以空格和制表符作为分隔符。(A)
A对
B错
setup 模块通过 filter 仅获取特定 facts。(A)
A对
B错
service 模块只能启动服务,不能停止服务。(B)
A对
B错
sed 's/abc/123/g' 会替换整行所有 abc。(A)
A对
B错
Playbook 中的 name 字段只是注释,不显示在输出日志中。(B)
A对
B错
awk 'END{print NR}' 打印行数,但若文件为空则输出 0。(A)
A对
B错
cat file1 file2 > output.txt 会将两个文件内容覆盖写入 output.txt。(A)
A对
B错
vars_files: vars.yml 从文件加载变量。(A)
A对
B错
become: yes用于切换到root执行任务,无需become_user。(B)
A对
B错
ansible.cfg 修改后无需重启服务即可立即生效。(A)
A对
B错
sort file.txt 默认按数字排序。(B)
A对
B错
Ansible配置文件优先级:当前目录 > 用户目录 > 系统目录。(A)
A对
B错
handlers会立即执行。(B)
A对
B错
使用 Ansible 管理受管主机时,必须配置密钥认证,不能使用密码。(B)
A对
B错
service 模块可启动、停止、重启服务。(A)
A对
B错
在 inventory 文件中写主机 IP 就可以让 Ansible 识别该主机。(A)
A对
B错
echo $(pwd) 会打印当前目录路径与 echo `pwd` 的效果完全相同。(A)
A对
B错
ansible-doc 命令可以查看模块的详细用法及示例。(A)
A对
B错
authorized_key 模块用于在目标主机上配置 SSH 公钥。(A)
A对
B错
default(值) 过滤器可以为未定义变量提供默认值。(A)
A对
B错
Jinja2 if 判断语法必须用 endif 结束。(A)
A对
B错
expr 2 + 3 能正确计算出 5,并且加号两端不能有空格。(B)
A对
B错
pwd 显示当前目录的绝对路径。(A)
A对
B错
Playbook 必须使用 .yml 后缀,不能用 .yaml。(B)
A对
B错
hosts: "*" 表示任务会在全部主机上执行。(A)
A对
B错
if [ 3 -lt 2 ] 输出 yes。(B)
A对
B错
sed -i '3d' file.txt 会删除文件第三行并修改文件。(A)
A对
B错
--skip-tags 跳过指定标签任务。(A)
A对
B错
file 模块可以创建目录、文件以及符号链接。(A)
A对
B错
test -d dirname 用于判断某路径是否为普通文件。(B)
A对
B错
Jinja2 中 for 循环语法必须以 endfor 结束。(A)
A对
B错
# 开头的行都是注释,包括 #!/bin/bash。(B)
A对
B错
facts 会自动收集操作系统版本、IP、内存等。(A)
A对
B错
Ansible 受管主机必须安装 ansible 才能被管理。(B)
A对
B错
ansible-playbook --check site.yml为模拟执行,不修改受管主机。(A)
A对
B错
ansible web -m command -a "ls" 会在 web 组机器上执行 ls 命令。(A)
A对
B错
grep -i "Linux" file.txt命令会忽略大小写,查找包含各种大小写形式Linux的行。(A)
A对
B错
cd testdir 进入不存在的目录时 Shell 会自动创建该目录。(B)
A对
B错
ansible-playbook --check 会显示将要执行的变更但不修改系统。(A)
A对
B错
使用 > 会清空文件内容,而使用 >> 会在文件末尾追加内容。(A)
A对
B错
template 模块可以渲染 Jinja2 模板。(A)
A对
B错
firewalld port: 443/tcp 可开放端口。(A)
A对
B错
vars 字段可用于在 Playbook 中定义变量。(A)
A对
B错
handlers 是立即执行的任务,不需要被触发。(B)
A对
B错
grep test /home 会递归搜索所有文件并输出结果。(B)
A对
B错
Ansible默认通过SSH协议与受管主机通信,无需在受管主机上安装代理程序。(A)
A对
B错
Shell函数中,return命令用于返回函数执行结果,exit命令用于退出整个脚本而非仅退出函数。(A)
A对
B错
sed '1,3d' file.txt 会删除 file.txt 的第1到第3行并修改原文件。(B)
A对
B错
grep -i 会忽略大小写;grep -v 会输出不匹配的行。(A)
A对
B错
ansible all -m ping 可以验证 SSH 连接是否正常。(A)
A对
B错
ansible-galaxy 用于管理 inventory 文件。(B)
A对
B错
ansible-doc copy 可以查看 copy 模块的用法和示例。(A)
A对
B错
awk 获取列值使用语法 : ${数字}
创建目录使用命令 : mkdir
让函数返回值使用关键字 : return
Playbook 定义变量使用关键字 : vars
后台运行任务查看列表使用命令 : jobs
将标准输出追加到文件使用 : >>
Shell 中获取当前 Shell 进程 PID 的变量是 : $$
修改文件权限使用命令 : chmod
查看系统负载使用命令 : uptime
Jinja2 for 循环开始标签是 : {% for 变量 in 列表 %}
awk 打印所有行使用 : {print $0}
清屏命令为 : clear
同时重定向标准输出与错误使用 : &>
在 Shell 中暂停 5 秒使用命令 : sleep 5
获取上一条命令返回状态码应使用 : $?
sed 删除某行使用命令格式 : sed 'Nd' file.txt
Ansible 默认主机清单文件路径为 : /etc/ansible/hosts
执行带管道命令应使用模块 : shell
判断文件是否存在使用测试表达式 : -f 文件名
查找文本匹配使用命令 : grep
强制删除文件使用参数 : rm -f
查看所有进程使用命令 : ps -ef
判断两个数字不等使用 : -ne
执行 df -h 应使用模块 : command
判断文件是否可执行使用表达式 : -x 文件名
忽略任务错误继续执行使用 : ignore_errors: yes
查找命令所在路径使用命令 : which
获取主机名的事实变量为 : ansible_hostname
仅退出 vim 不保存使用命令 : :q!
匹配以某字符串开头的 grep 选项为 : ^
给变量设置默认值使用过滤器 : default
查看当前登录用户使用命令 : who
判断字符串是否为空使用 : [ -z "$str" ]
查看当前用户所属用户组使用命令 : groups
复制文件使用命令 : cp
查看内存使用情况使用 : free
修改文件所有者使用命令 : chown
切换到 root 用户使用命令 : su -
命令输出赋值给变量的语法为 : 变量=$(command)
匹配以某字符串结尾使用正则 : $
递归查找文本使用 grep 选项 : -r
查看路径中执行命令搜索顺序使用命令 : echo $PATH
显示行号使用 grep 参数 : -n
将标准输出重定向到文件使用 : >
将后台任务恢复前台使用命令 : fg
遇到错误立即退出脚本使用 : set -e
退出当前 Shell 使用命令 : exit
显示当前工作目录使用命令 : pwd
解压 zip 文件使用命令 : unzip
退出 vim 的保存退出命令是 : :wq
sed 替换文本使用命令格式 : sed 's/旧字符串/新字符串/选项' file.txt
创建用户使用模块 : user
获取 Jinja2 中变量长度使用过滤器 : length
显示当前时间(时:分:秒)使用命令 : date +"%H:%M:%S"
查看网络接口信息使用命令 : ip addr
统计匹配行数的命令为 : grep -c "pattern" file.txt
递归删除目录使用命令参数 : rm -r
查看当前环境变量使用 : env
将任务挂起到后台使用命令 : Ctrl+Z 挂起后 bg
显示所有开放端口使用命令 : ss -tuln
压缩目录为 zip 文件使用命令 : zip -r dir.zip 目录名
Ansible 通用安装软件的模块为 : package
复制模板文件使用模块 : template
判断字符串是否非空使用 : [ -n "$str" ]
移动文件或重命名文件使用命令 : mv
打印调试信息使用模块 : debug
跳过本轮循环使用关键字 : continue
终止进程使用命令 : kill
创建空文件使用命令 : touch
编辑文本文件最常用编辑器是 : vim
在 Ansible 中创建目录应使用模块 : file
Shell 中获取当前脚本文件名的变量是 : $0
Jinja2 模板引用变量的格式为 : {{ 变量名 }}
查看进程树使用命令 : pstree
判断整数小于等于某值使用 : -le
终止循环使用关键字 : break
awk 获取当前行号使用变量 : NR
for 循环基本语法为 : for 变量 in 列表; do 命令; done
查看当前用户使用命令 : whoami
判断是否为普通文件使用测试表达式 : -f 文件名
在 bash 中执行算术表达式结构为 : $((表达式))
强制终止进程使用参数 : kill -9
显示系统当前日期使用命令 : date
查找文件路径使用命令 : find
查看历史命令使用命令 : history
将标准错误输出重定向使用 : 2>
让程序后台运行并忽略挂断信号使用 : nohup 命令 &
解压 tar.gz 文件使用 tar 参数 : tar -zxf
查看监听端口使用命令(传统命令) : netstat -tulnp
控制服务状态使用模块 : service
删除文件使用命令 : rm
判断整数大于等于某值使用 : -ge
查看系统版本信息使用命令 : cat /etc/os-release
awk 设置字段分隔符参数为 : -F
判断是否为目录使用测试表达式 : -d 目录名
查看命令手册使用命令 : man
查看磁盘使用情况使用 : df
打包并压缩文件使用 tar 参数 : tar -zcf
显示文件最后 20 行内容使用 : tail -20 file.txt
声明一个函数使用关键字 : function
Ansible 开放 80 端口并启动 firewalld
- hosts: all
become: yes
tasks:
- yum:
name: firewalld
state: present
- service:
name: firewalld
state: started
enabled: yes
- firewalld:
port: 80/tcp
permanent: yes
state: enabled
immediate: yes
给文件每行加行号与时间戳
awk '{print NR, strftime("%F %T"), $0}' file.txt
备份指定目录到另一个目录并压缩为 timestamp.tar.gz
tar -czf /backup/dir/$(date +%F_%H%M%S).tar.gz /source/dir
判断目录是否存在并统计文件数量
read -p "请输入目录: " dir
if [ -d "$dir" ]; then
echo "完整路径: $(realpath $dir)"
echo ".sh 文件数量: $(find $dir -name '*.sh' | wc -l)"
echo "普通文件数量: $(find $dir -type f | wc -l)"
else
echo "目录不存在"
fi
检查 iowait 并输出警告
iowait=$(iostat -c 1 1 | awk 'NR==4{print $4}')
[ "${iowait%.*}" -gt 20 ] && echo " IOWAIT 过高: $iowait%"
检查用户是否存在并输出 home 目录
id testuser &>/dev/null && eval echo "~testuser" || echo "用户不存在"
使用 Ansible 创建 /data/app 目录并指定权限
- hosts: all
become: yes
tasks:
- file:
path: /data/app
state: directory
owner: root
group: root
mode: '0755'
Ansible 输出系统信息
- hosts: all
tasks:
- debug:
msg:
- "系统: {{ ansible_distribution }}"
- "IP 地址: {{ ansible_default_ipv4.address }}"
- "CPU 核心数: {{ ansible_processor_vcpus }}"
- "内存大小: {{ ansible_memtotal_mb }} MB"
Ansible 禁止 root 登录 SSH
- hosts: all
become: yes
tasks:
- lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
- service:
name: sshd
state: restarted
批量重命名 txt 文件为 *____backup.txt
for f in *.txt; do
mv "$f" "${f%.txt}____backup.txt"
done
随机生成 10 位密码并保存
tr -dc A-Za-z0-9 </dev/urandom | head -c10 > password.txt
Ansible 批量安装软件包
- hosts: all
become: yes
tasks:
- yum:
name:
- vim
- wget
- curl
state: present
判断当前用户是否 root
[ "$EUID" -eq 0 ] && echo "当前用户是 root" || echo "当前用户不是 root"
循环菜单程序
while true; do
echo "1) 查询时间 2) 查询位置 3) 登录人数 q) 退出"
read -p "请选择: " c
case $c in
1) date ;;
2) pwd ;;
3) who | wc -l ;;
q) exit ;;
esac
done
Shell 脚本检测 ping 是否成功
ping -c2 8.8.8.8 &>/dev/null && echo "Ping 成功" || echo "Ping 失败"
Ansible 执行 df -h 并输出行列表
- hosts: all
tasks:
- command: df -h
register: df_out
- debug:
var: df_out.stdout_lines
输出 CPU、内存使用率和 15 分钟负载
echo "CPU 使用率: $(top -bn1 | awk '/Cpu/{print 100-$8"%"}')"
echo "内存使用率: $(free | awk '/Mem/{printf "%.2f%%\n",$3/$2*100}')"
echo "15 分钟负载: $(uptime | awk -F'load average:' '{print $2}' | cut -d, -f3)"
检测进程是否运行并输出 PID 与数量
pids=$(pgrep sshd)
echo "PID 列表: $pids"
echo "进程数量: $(echo "$pids" | wc -w)"
使用 Ansible 安装并启动 httpd 服务
- hosts: all
become: yes
tasks:
- yum:
name: httpd
state: present
- service:
name: httpd
state: started
enabled: yes
Ansible 批量创建 dev 用户
- hosts: all
become: yes
vars:
users:
- dev1
- dev2
- dev3
tasks:
- user:
name: "{{ item }}"
state: present
loop: "{{ users }}"
清理 /tmp 下 7 天前文件并记录日志
find /tmp -type f -mtime +7 -exec rm -v {} \; >> /var/log/tmp_clean.log
Ansible 复制文件并备份旧版本
- hosts: all
become: yes
tasks:
- copy:
src: test.conf
dest: /etc/test.conf
backup: yes
Ansible 安装并启动 firewalld 并输出状态
- hosts: all
become: yes
tasks:
- yum:
name: firewalld
state: present
- service:
name: firewalld
state: started
enabled: yes
- command: firewall-cmd --state
register: fw_state
- debug:
msg: "firewalld 状态: {{ fw_state.stdout }}"
不断输入数字并累加,输入 q 退出
sum=0
while read -p "输入数字(q 退出): " n; do
[ "$n" = "q" ] && break
sum=$((sum+n))
echo "当前累计值: $sum"
done
Ansible 创建多个目录结构
- hosts: all
become: yes
tasks:
- file:
path: "{{ item }}"
state: directory
loop:
- /data/app/logs
- /data/app/bin
- /data/app/conf
统计文件每行字符数(不包含回车)
awk '{print length($0)}' file.txt
Ansible 创建用户 devuser 并指定加密密码
- hosts: all
become: yes
tasks:
- user:
name: devuser
password: "{{ '123456' | password_hash('sha512') }}"
生成 5 条日志,每条间隔 3 秒
for i in {1..5}; do
echo "$(date) log $i" >> test.log
sleep 3
done
Ansible 获取 lsblk 输出
- hosts: all
tasks:
- command: lsblk
register: lsblk_out
- debug:
var: lsblk_out.stdout_lines
检查 / 分区使用率,超过 80% 输出警告
use=$(df / | awk 'NR==2{print $5}' | tr -d '%')
[ "$use" -gt 80 ] && echo "分区使用率过高: $use%"
磁盘空间使用率检测
#!/bin/bash
# 检查磁盘空间使用率
threshold=80
df -h | grep -v Filesystem | while read -r line; do
mount_point=$(echo "$line" | awk '{print $6}')
usage=$(echo "$line" | awk '{print $5}' | sed 's/%//')
if [ $usage -gt $threshold ]; then
echo "警告:$mount_point 分区使用率过高:${usage}%"
else
echo "$mount_point 分区使用率正常:${usage}%"
fi
done
第1空:threshold
第2空:usage
统计日志错误和警告
#!/bin/bash
# 统计日志文件中的错误数量
read -p "请输入日志文件路径:" log_file
if [ -f "$log_file" ]; then
error_count=$(grep -c "ERROR" "$log_file")
warn_count=$(grep -c "WARN" "$log_file")
echo "日志文件 $log_file 统计:"
echo "ERROR 数量:$error_count"
echo "WARN 数量:$warn_count"
else
echo "日志文件不存在"
fi
第1空:WARN
第2空:warn_count
监控 CPU 使用率
#!/bin/bash
# 监控CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
cpu_int=$(echo "$cpu_usage" | cut --f1)
if [ $cpu_int -gt 80 ]; then
echo "$(date) CPU使用率过高:${cpu_usage}%" >> /var/log/cpu_alert.log
echo "警告:CPU使用率过高!"
else
echo "CPU使用率正常:${cpu_usage}%"
fi
第1空:80
第2空:cpu_usage
自动清理旧日志
#!/bin/bash
# 自动清理旧日志
log_dir="/var/log/myapp"
days=30
if [ -d "$log_dir" ]; then
echo "清理 $log_dir 中超过 $days 天的日志文件..."
find "$log_dir" -name "*.log" -type f -mtime +$days -delete
echo "清理完成,剩余日志文件:"
find "$log_dir" -name "*.log" -type f | wc -l
else
echo "日志目录不存在"
fi
第1空:days
第2空:wc -l
Ansible 配置 Java 环境
- name: 配置Java环境
hosts: app_servers
become: true
vars:
java_version: "11"
tasks:
- name: 安装OpenJDK
yum:
name: "java-{{ java_version }}-openjdk-devel"
state: present
- name: 设置JAVA_HOME环境变量
lineinfile:
path: /etc/profile
line: 'export JAVA_HOME=/usr/lib/jvm/java-{{ java_version }}-openjdk'
state: present
第1空:present
第2空:present
Ansible 部署 Web 服务
- name: 部署Web服务
hosts: web_servers
become: yes
tasks:
- name: 安装Apache
yum:
name: httpd
state: present
- name: 复制首页文件
copy:
src: ./index.html
dest: /var/www/html/
mode: 0644
notify: 重启Apache
handlers:
- name: 重启Apache
service:
name: httpd
state: restarted
第1空:present
第2空:重启Apache
Ansible 配置 Zabbix 客户端
- name: 配置Zabbix客户端
hosts: all
become: true
vars:
zabbix_server: "192.168.1.50"
tasks:
- name: 安装Zabbix客户端
yum:
name: zabbix-agent
state: present
- name: 配置Zabbix客户端
lineinfile:
path: /etc/zabbix/zabbix_agentd.conf
regexp: '^Server='
line: "Server={{ zabbix_server }}"
- name: 启动Zabbix客户端
service:
name: zabbix-agent
state: started
enabled: yes
第1空:present
第2空:yes
Ansible 部署 Node.js 应用
- name: 部署Node.js应用
hosts: app_servers
become: true
tasks:
- name: 安装Node.js和npm
yum:
name:
- nodejs
- npm
state: present
- name: 安装PM2进程管理器
npm:
name: pm2
global: yes
state: present
- name: 启动Node.js应用
command: pm2 start /opt/app/server.js
第1空:present
第2空:present
配置 MySQL 用户和数据库
- name: 配置MySQL用户和数据库
hosts: db_servers
become: true
vars:
db_name: "appdb"
db_user: "appuser"
db_pass: "password123"
tasks:
- name: 创建数据库
mysql_db:
name: "{{ db_name }}"
state: present
- name: 创建数据库用户并授权
mysql_user:
name: "{{ db_user }}"
password: "{{ db_pass }}"
priv: "{{ db_name }}.*:ALL"
host: "%"
state: present
第1空:password123
第2空:%
配置防火墙允许特定 IP 访问
- name: 配置防火墙允许特定IP访问
hosts: db_servers
become: true
tasks:
- name: 允许Web服务器IP访问3306端口
firewalld:
port: 3306/tcp
source: 192.168.1.0/24
permanent: yes
state: enabled
- name: 重新加载防火墙规则
service:
name: firewalld
state: reloaded
第1空:192.168.1.0/24
第2空:enabled
配置 YUM 源
- name: 配置YUM源
hosts: all
become: true
tasks:
- name: 安装EPEL源
yum:
name: epel-release
state: present
- name: 清理YUM缓存
command: yum clean all
- name: 生成新的YUM缓存
command: yum makecache all
第1空:present
第2空:makecache
批量压缩文件
#!/bin/bash
# 批量压缩文件
read -p "请输入要压缩的文件类型(如txt):" file_type
files=$(ls *.$file_type 2>/dev/null)
if [ -n "$files" ]; then
tar -czf "${file_type}_files_$(date +%Y%m%d).tar.gz" *.$file_type
echo "已压缩以下文件:"
echo "$files"
else
echo "没有找到 .$file_type 类型的文件"
fi
第1空:file_type
第2空:files
监控网络流量
#!/bin/bash
# 监控网络流量
interface="eth0"
echo "监控 $interface 网络流量(按Ctrl+C退出)"
echo "----------------------------------------"
echo "接收字节 发送字节 接收速率 发送速率"
while true; do
rx1=$(cat /sys/class/net/"$interface"/statistics/rx_bytes)
tx1=$(cat /sys/class/net/"$interface"/statistics/tx_bytes)
sleep 1
rx2=$(cat /sys/class/net/"$interface"/statistics/rx_bytes)
tx2=$(cat /sys/class/net/"$interface"/statistics/tx_bytes)
rx_rate=$(( (rx2 - rx1) / 1024 ))
tx_rate=$(( (tx2 - tx1) / 1024 ))
echo "$rx2 $tx2 ${rx_rate}KB/s ${tx_rate}KB/s"
done
第1空:1
第2空:1024
监控系统负载
#!/bin/bash
# 监控系统负载
load=$(uptime | awk -F 'load average:' '{print $2}' | awk '{print $1}')
load_int=$(echo "$load" | cut --f1)
if [ $load_int -gt 5 ]; then
echo "$(date) 系统负载过高:$load" >> /var/log/load_alert.log
echo "警告:系统负载过高!"
else
echo "系统负载正常:$load"
fi
第1空:5
第2空:load
检查网络连通性
#!/bin/bash
# 检查网络连通性
read -p "请输入目标IP地址:" ip_addr
count=0
success=0
while [ $count -lt 5 ]; do
ping -c 1 -W 2 "$ip_addr" > /dev/null 2>&1
if [ $? -eq 0 ]; then
success=$((success + 1))
fi
count=$((count + 1))
done
echo "共测试$count次,成功$success次,成功率:$((success * 100 / count))%"
第1空:5
第2空:1
部署 Kubernetes 节点
- name: 部署Kubernetes节点
hosts: k8s_nodes
become: true
vars:
k8s_version: "1.21.0"
tasks:
- name: 安装kubeadm、kubelet和kubectl
yum:
name:
- kubeadm-{{ k8s_version }}
- kubelet-{{ k8s_version }}
- kubectl-{{ k8s_version }}
state: present
- name: 启动kubelet服务
service:
name: kubelet
state: started
enabled: yes
第1空:present
第2空:yes
管理 SELinux
- name: 管理SELinux
hosts: all
become: true
tasks:
- name: 查看SELinux状态
command: getenforce
register: selinux_status
- name: 输出SELinux状态
debug:
msg: "当前SELinux状态:{{ selinux_status.stdout }}"
- name: 禁用SELinux(临时)
command: setenforce 0
when: selinux_status.stdout == "Enforcing"
第1空:selinux_status
第2空:Enforcing
配置防火墙规则
- name: 配置防火墙规则
hosts: all
become: true
tasks:
- name: 开放80和443端口
firewalld:
port: "{{ item }}"
permanent: yes
state: enabled
loop:
- 80/tcp
- 443/tcp
- name: 重新加载防火墙
service:
name: firewalld
state: reloaded
第1空:enabled
第2空:443/tcp
配置邮件告警
- name: 配置邮件告警
hosts: monitor_server
become: true
vars:
alert_email: "admin@example.com"
tasks:
- name: 安装邮件客户端
yum:
name: mailx
state: present
- name: 配置邮件发送脚本
template:
src: send_alert.sh.j2
dest: /usr/local/bin/send_alert.sh
mode: 0755
- name: 添加定时任务检查系统状态
cron:
name: "系统状态检查"
minute: "*/30"
job: "/usr/local/bin/check_system.sh"
第1空:present
第2空:0755
分析系统启动时间
#!/bin/bash
# 分析系统启动时间
boot_time=$(systemd-analyze | grep "Startup finished" | awk '{print $3 " " $4}')
echo "系统启动时间:$boot_time"
echo "启动过程中耗时最长的5个服务:"
systemd-analyze blame | head -n 5
echo "关键路径上的服务:"
systemd-analyze critical-chain | head -n 10
第1空:head -n
第2空:head -n
检查系统版本和内核信息
#!/bin/bash
# 检查系统版本和内核信息
echo "操作系统:$(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
echo "内核版本:$(uname -r)"
echo "系统架构:$(uname -m)"
echo "主机名:$(hostname)"
echo "IP地址:$(hostname -I | awk '{print $1}')"
第1空:os-release
第2空:r
安装并配置 Elasticsearch
- name: 安装并配置Elasticsearch
hosts: es_servers
become: true
vars:
es_version: "7.14.0"
tasks:
- name: 下载Elasticsearch RPM包
get_url:
url: "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-{{ es_version }}-x86_64.rpm"
dest: /tmp/
- name: 安装Elasticsearch
yum:
name: /tmp/elasticsearch-{{ es_version }}-x86_64.rpm
state: present
- name: 启动Elasticsearch
service:
name: elasticsearch
state: started
enabled: yes
第1空:present
第2空:yes
统计目录占用空间
#!/bin/bash
# 统计目录占用空间
read -p "请输入目录路径:" dir_path
if [ -d "$dir_path" ]; then
echo "目录 $dir_path 下各子目录占用空间:"
du -sh "$dir_path"/* | sort -hr
total_size=$(du -sh "$dir_path" | awk '{print $1}')
echo "总占用空间:$total_size"
else
echo "目录不存在"
fi
第1空:hr
第2空:total_size
创建多个用户
- name: 创建多个用户
hosts: all
become: true
tasks:
- name: 循环创建用户
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
shell: /bin/bash
state: present
loop:
- { name: "devuser1", uid: 1005 }
- { name: "devuser2", uid: 1006 }
第1空:present
第2空:1006
计算 1 到 n 的累加和
#!/bin/bash
# 计算1到n的累加和
read -p "请输入一个整数:" n
sum=0
for ((i=1; i<=n; i++)); do
sum=$((sum + i))
done
echo "1到$n的累加和为:$sum"
第1空:n
第2空:i
批量修改文件后缀名
#!/bin/bash
# 批量修改文件后缀名
read -p "请输入原后缀名:" old_ext
read -p "请输入新后缀名:" new_ext
count=0
for file in *.$old_ext; do
if [ -f "$file" ]; then
new_file="${file%.$old_ext}.$new_ext"
mv "$file" "$new_file"
count=$((count + 1))
fi
done
echo "共修改了$count个文件"
第1空:new_ext
第2空:1
管理 MySQL 服务
- name: 管理MySQL服务
hosts: db_servers
become: yes
vars:
mysql_root_password: "rootpass"
tasks:
- name: 安装MySQL
yum:
name: mysql-server
state: present
- name: 启动MySQL并设置开机自启
service:
name: mysqld
state: started
enabled: yes
第1空:rootpass
第2空:yes
部署 Redis 服务
- name: 部署Redis服务
hosts: cache_servers
become: true
tasks:
- name: 安装Redis
yum:
name: redis
state: present
- name: 修改Redis配置
lineinfile:
path: /etc/redis.conf
regexp: '^bind'
line: 'bind 0.0.0.0'
- name: 启动Redis并设置开机自启
service:
name: redis
state: started
enabled: yes
第1空:present
第2空:started
配置 SSH 服务
- name: 配置SSH服务
hosts: all
become: true
tasks:
- name: 修改SSH端口
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?Port'
line: 'Port 2222'
state: present
notify: restart sshd
handlers:
- name: restart sshd
service:
name: sshd
state: restarted
第1空:2222
第2空:present
生成随机密码
#!/bin/bash
# 生成随机密码
read -p "请输入用户名:" username
password=$(openssl rand -base64 12 | cut -c1-10)
echo "用户名:$username"
echo "生成的随机密码:$password"
echo "$username:$password" >> /etc/passwd_list.txt
chmod 600 /etc/passwd_list.txt
第1空:password
第2空:passwd_list.txt
查找并替换文件内容
#!/bin/bash
# 查找并替换文件内容
read -p "请输入要处理的文件:" file
read -p "请输入要查找的字符串:" old_str
read -p "请输入要替换的字符串:" new_str
if [ -f "$file" ]; then
cp "$file" "${file}.bak"
sed -i "s/${old_str}/${new_str}/g" "$file"
echo "替换完成,已创建备份文件 ${file}.bak"
echo "替换前后对比:"
diff "${file}.bak" "$file"
else
echo "文件不存在"
fi
第1空:file
第2空:file
查找大文件
#!/bin/bash
# 查找大文件
read -p "请输入要查找的目录:" search_dir
read -p "请输入文件大小阈值(MB):" size
echo "查找 $search_dir 中大于 $size MB 的文件:"
find "$search_dir" -type f -size +${size}M -exec ls -lh {} \; \
| awk '{print $5, $9}' | sort -r -k1
第1空:9
第2空:r
部署 Nginx 虚拟主机
- name: 部署Nginx虚拟主机
hosts: web_servers
become: true
tasks:
- name: 创建虚拟主机配置目录
file:
path: /etc/nginx/conf.d
state: directory
mode: 0755
- name: 复制虚拟主机配置
template:
src: vhost.conf.j2
dest: /etc/nginx/conf.d/{{ item.domain }}.conf
mode: 0644
loop:
- { domain: "example.com", root: "/var/www/example" }
- { domain: "test.com", root: "/var/www/test" }
notify: restart nginx
第1空:0755
第2空:/var/www/test
分析 Web 访问日志
#!/bin/bash
# 分析Web访问日志
log_file="/var/log/httpd/access_log"
if [ -f "$log_file" ]; then
echo "访问量最高的10个IP:"
awk '{print $1}' "$log_file" | sort | uniq -c | sort -nr | head 10
echo "最常访问的10个页面:"
awk '{print $7}' "$log_file" | sort | uniq -c | sort -nr | head 10
else
echo "日志文件不存在"
fi
第1空:head
第2空:7
监控进程是否运行
#!/bin/bash
# 监控进程是否运行
read -p "请输入进程名:" proc_name
pid=$(pgrep "$proc_name")
if [ -n "$pid" ]; then
echo "进程 $proc_name 正在运行,PID:$pid"
echo "内存使用:$(ps -p $pid -o %mem,rss --no-headers)"
else
echo "进程 $proc_name 未运行"
fi
第1空:pid
第2空:proc_name
检查文件是否存在并备份
#!/bin/bash
# 检查文件是否存在并备份
read -p "请输入文件名:" filename
if [ -f "$filename" ]; then
backup_name="${filename}.bak"
cp "$filename" "$backup_name"
echo "已创建备份文件:$backup_name"
ls -l "$filename" "$backup_name"
else
echo "文件 $filename 不存在"
fi
第1空:backup_name
第2空:backup_name
配置时间同步
- name: 配置时间同步
hosts: all
become: true
tasks:
- name: 安装chrony
yum:
name: chrony
state: present
- name: 启动chronyd服务
service:
name: chronyd
state: started
enabled: yes
- name: 同步时间
command: chronyc sync
第1空:present
第2空:yes
部署 GitLab
- name: 部署GitLab
hosts: git_servers
become: true
tasks:
- name: 安装依赖包
yum:
name:
- curl
- policycoreutils
- openssh-server
state: present
- name: 启动SSH服务
service:
name: sshd
state: started
enabled: yes
- name: 下载GitLab安装脚本
get_url:
url: https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh
dest: /tmp/install_gitlab.sh
mode: 0755
- name: 运行安装脚本
command: bash /tmp/install_gitlab.sh
第1空:present
第2空:0755
统计目录下文件总数
#!/bin/bash
# 统计指定目录下的文件总数
read -p "请输入目录路径:" dir_path
if [ -d "$dir_path" ]; then
file_count=$(ls -l "$dir_path" | grep -v ^d | wc -l)
echo "目录 $dir_path 中的文件总数:$file_count"
else
echo "错误:$dir_path 不是有效目录"
fi
第1空:file_count
第2空:dir_path
检查系统服务状态
#!/bin/bash
# 检查系统服务状态
services=("sshd" "httpd" "mysqld")
for service in "${services[@]}"; do
status=$(systemctl is-active "$service")
if [ "$status" = "active" ]; then
echo "$service 服务运行正常"
else
echo "$service 服务状态异常:$status"
fi
done
第1空:active
第2空:status
配置 HAProxy 负载均衡
- name: 配置HAProxy负载均衡
hosts: lb_servers
become: true
tasks:
- name: 安装HAProxy
yum:
name: haproxy
state: present
- name: 配置HAProxy
template:
src: haproxy.cfg.j2
dest: /etc/haproxy/haproxy.cfg
mode: 0644
notify: restart haproxy
- name: 启用并启动HAProxy
service:
name: haproxy
state: started
enabled: yes
第1空:present
第2空:yes
管理用户 sudo 权限
- name: 管理用户sudo权限
hosts: all
become: true
tasks:
- name: 允许wheel组sudo无密码
lineinfile:
path: /etc/sudoers
regexp: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD:ALL'
state: present
validate: 'visudo -cf %s'
- name: 将admin用户加入wheel组
user:
name: admin
groups: wheel
append: yes
第1空:NOPASSWD:ALL
第2空:yes
配置 Rsync 服务
- name: 配置Rsync服务
hosts: backup_servers
become: true
tasks:
- name: 安装Rsync
yum:
name: rsync
state: present
- name: 配置Rsync服务
copy:
src: rsyncd.conf
dest: /etc/rsyncd.conf
mode: 0644
- name: 启动Rsync服务
service:
name: rsyncd
state: started
enabled: yes
第1空:present
第2空:yes
检查系统内存使用情况
#!/bin/bash
# 检查系统内存使用情况
total_mem=$(free -m | grep Mem | awk '{print $2}')
used_mem=$(free -m | grep Mem | awk '{print $3}')
mem_usage=$((used_mem * 100 / total_mem))
echo "总内存:${total_mem}MB"
echo "已用内存:${used_mem}MB"
echo "内存使用率:${mem_usage}%"
if [ $mem_usage -gt 80 ]; then
echo "警告:内存使用率过高!"
echo "占用内存最高的5个进程:"
ps aux --sort=-%mem | head -n 6 | tail -n 5
fi
第1空:80
第2空:head -n
安装 Docker
- name: 安装Docker
hosts: app_servers
become: true
tasks:
- name: 安装Docker依赖
yum:
name:
- yum-utils
- device-mapper-persistent-data
- lvm2
state: present
- name: 添加Docker仓库
command: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- name: 安装Docker CE
yum:
name: docker-ce
state: present
第1空:present
第2空:present
监控系统登录失败情况
#!/bin/bash
# 监控系统登录失败情况
log_file="/var/log/secure"
if [ -f "$log_file" ]; then
echo "最近10次登录失败记录:"
grep "Failed password" "$log_file" | tail -10
echo "登录失败次数最多的IP:"
grep "Failed password" "$log_file" | awk '{print $11}' | sort | uniq -c | sort -nr | head 5
echo "总失败次数:$(grep -c "Failed password" "$log_file")"
else
echo "日志文件不存在"
fi
第1空:head
第2空:log_file
部署 Nginx 配置
- name: 部署Nginx配置
hosts: web_servers
become: yes
tasks:
- name: 安装Nginx
yum:
name: nginx
state: present
- name: 复制Nginx配置模板
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
mode: 0644
notify: restart nginx
第1空:present
第2空:j2
自动备份 MySQL 数据库
#!/bin/bash
# 自动备份MySQL数据库
db_name="mydb"
backup_dir="/var/backups/mysql"
timestamp=$(date +%Y%m%d_%H%M%S)
backup_file="${backup_dir}/${db_name}_${timestamp}.sql"
mkdir -p "$backup_dir"
mysqldump -u root -p"rootpass" "$db_name" > "$backup_file"
if [ $? -eq 0 ]; then
echo "数据库备份成功:$backup_file"
gzip "$backup_file"
else
echo "数据库备份失败"
fi
第1空:rootpass
第2空:0
部署 Python 应用
- name: 部署Python应用
hosts: app_servers
become: true
vars:
app_port: 8000
tasks:
- name: 安装Python3
yum:
name: python3
state: present
- name: 安装应用依赖
pip:
requirements: /opt/app/requirements.txt
executable: pip3
- name: 启动应用
command: python3 /opt/app/main.py --port {{ app_port }}
第1空:present
第2空:pip3
检查并修复文件系统
#!/bin/bash
# 检查并修复文件系统
read -p "请输入要检查的分区(如/dev/sda1):" partition
if [ -b "$partition" ]; then
echo "检查分区 $partition 的文件系统..."
fsck -n "$partition"
read -p "是否修复发现的错误?(y/n):" answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
fsck -y "$partition"
fi
else
echo "错误:$partition 不是有效分区"
fi
第1空:partition
第2空:partition