运维自动化工具Ansible大总结20250914
常见的自动化运维工具
一、Ansible基础
关键 三大关键模块:Paramiko、PyYAML、Jinja2
编排 支持playbook自动化方式编排任务
劣势 由于基于ssh方式来通信,所以受ssh的限制比较多

1. ubuntu安装ansible
root@ubuntu24-13:~# apt-cache madison ansible-core 查看ansible-core核心软件版本





2.简单的实践
①command模块[熟练]

③ping模块

3.ansible-doc命令[掌握]
-s 显示简单的帮助信息 simple
4.ansible-config命令[扩展]
5.主机清单
官方文档:https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
①主机清单属性样式[了解]
对于ansible的主机列表⽂件来说,默认情况下该⽂件是⼀个全注释⽂件,里面罗列了⼀些主机列表的表现样式,具体内容如下:


②主机清单文件格式[了解]
主机文件清单实例:
③主机列表命名异常实践
④主机列表认证操作实践(即打通key验证)
root@ubuntu24-13:~# > ~/.ssh/known_hosts # 如果没有该命令后面看不到yes效果
再次执行下面的命令就没有了报错
root@ubuntu24-13:~# ansible 10.0.0.101 -a "ls /root"
⑤⾸次操作WARNING提示解决
根据信息提示,python的命令解释器是 /usr/bin/python3.12,重新编辑hosts文件
再次执行命令发现warning已消失
⑥认证原理
root@ubuntu24-13:~# ansible ansible_server -a "ls /root" -k 需要输入密码 效果如下

⑦主机认证实践
#!/bin/bash
# 功能:自动化配置多主机SSH免密登录及主机名设置
# 适用场景:批量初始化多台服务器的基础网络环境# ==============================================
# 环境变量配置
# ==============================================
USER_NAME="root" # SSH登录用户名
USER_HOME="/${USER_NAME}/.ssh" # SSH密钥存放目录
SSH_CONFIG_FILE="/etc/ssh/ssh_config" # SSH客户端配置文件
USER_PASSWD="123456" # SSH登录密码
HOSTADDR_PRE="10.0.0" # 主机IP前缀
HOST_LIST="${HOSTADDR_PRE}.101 ${HOSTADDR_PRE}.102 ${HOSTADDR_PRE}.103" # 主机IP列表
HOSTNAME_LIST="ubuntu24-13 rocky9-12 ubuntu24-16" # 对应主机名列表
HOSTS_FILE="/etc/hosts" # 本地hosts文件路径# ==============================================
# 函数定义
# ==============================================# 准备基础环境:安装依赖、生成SSH密钥、配置SSH客户端
base_env() {# 安装expect工具(用于自动化交互)apt install expect -y# 清理并重建SSH密钥目录[ -d "${USER_HOME}" ] && rm -rf "${USER_HOME}"mkdir -p "${USER_HOME}"# 生成无密码SSH密钥对ssh-keygen -t rsa -P "" -f "${USER_HOME}/id_rsa" >/dev/null 2>&1# 配置SSH客户端自动接受新主机密钥sed -i '/StrictHostKeyChecking/{s/#//; s/ask/no/}' "${SSH_CONFIG_FILE}"
}# 自动化SSH密钥分发(处理交互过程)
# 参数:$1 - 目标主机地址(格式:用户名@主机)
expect_auto() {local remote_host="$1"expect -c "spawn ssh-copy-id -i ${USER_HOME}/id_rsa.pub ${remote_host}expect {\"*yes/no*\" {send \"yes\r\"; exp_continue} # 自动接受新主机密钥\"*password*\" {send \"${USER_PASSWD}\r\"; exp_continue} # 输入密码\"*Password*\" {send \"${USER_PASSWD}\r\";} # 处理大写Password的情况}" >/dev/null 2>&1 # 屏蔽冗余输出
}# 批量配置免密登录并同步hosts文件
auth_auto() {# 循环处理所有目标主机(IP和主机名两种方式)for host in ${HOST_LIST} ${HOSTNAME_LIST}; do# 分发SSH公钥echo "配置免密登录: ${USER_NAME}@${host}"expect_auto "${USER_NAME}@${host}"# 同步本地hosts文件到目标主机echo "同步hosts文件到: ${USER_NAME}@${host}"scp -rp "${HOSTS_FILE}" "${USER_NAME}@${host}:${HOSTS_FILE}" >/dev/null 2>&1done
}# 批量设置主机名
hostname_set() {# 循环设置每个主机的主机名for hostname in ${HOSTNAME_LIST}; doecho "设置主机名: ${hostname}"ssh "${USER_NAME}@${hostname}" "hostnamectl set-hostname ${hostname}" >/dev/null 2>&1done
}# ==============================================
# 主函数:程序入口
# ==============================================
main() {echo "===== 开始执行环境初始化 ====="# 1. 准备基础环境echo "1. 准备基础环境..."base_env# 2. 配置跨主机免密认证echo "2. 配置免密登录..."auth_auto# 3. 批量设置主机名echo "3. 设置主机名..."hostname_setecho "===== 环境初始化完成 ====="
}# 执行主函数
main
⑧sudo 简单实践
[root@rocky9-12 ~]# useradd -m putong
root@ubuntu24-13:~# echo -e "[remote_user]\n10.0.0.12" >> /etc/ansible/hosts
root@ubuntu24-13:~# ssh-copy-id putong@10.0.0.12 #master主机配置跨主机免密码认证
root@ubuntu24-13:~# ansible remote_user -u putong -m ping #ansible使⽤普通⽤⼾测试效果

6.⽬标主机匹配
7.模块实践
①command功能实践[熟练]
root@ubuntu24-13:~# ansible 10.0.0.12 -a "chdir=/tmp mkdir cmd_test"
root@ubuntu24-13:~# ansible 10.0.0.12 -a "chdir=/tmp/cmd_test touch 815.txt"
root@ubuntu24-13:~# ansible 10.0.0.12 -a "chdir=/tmp/cmd_test ls"

② shell模块功能和实践
帮助信息:ansible-doc -s shell
③scripts模块功能和实践
正常方式执行,会因为文件权限的问题,而发生报错
root@ubuntu24-13:~# ansible 10.0.0.16 -m script -a "/tmp/test.sh 0.15"
root@ubuntu24-13:~# ansible 10.0.0.16 -m script -a "/bin/bash /tmp/test.sh 0.15"
④系统管理模块
①hostname模块[熟练]
root@ubuntu24-13:~# ansible 10.0.0.102 -m hostname -a "name=ansible-node2"
root@ubuntu24-13:~# ansible 10.0.0.16 -a "hostname" #检验效果
②user模块[熟练]

③group模块[熟练]

命令格式:ansible <目标主机> -m group -a '属性1=值1 属性2=值2 ... 属性n=值n'
root@ubuntu24-13:~# ansible 10.0.0.16 -m group -a "name=webap system=yes gid=10088"
④ cron模块
root@ubuntu24-16:~# apt install -y cron 如果目标主机没有命令则无法正常执行
root@ubuntu24-13:~# ansible 10.0.0.102 -a 'date -s "2019-01-12"'

⑤setup模块[熟练]
⑥ selinux模块
root@ubuntu24-13:~# ansible 10.0.0.12 -m selinux -a 'state=enforcing policy=targeted' 启用
⑦ mount模块
⑧sysctl模块
root@ubuntu24-13:~# ansible 10.0.0.16 -m sysctl -a 'name=net.ipv4.ip_forward state=absent'
⑤文件管理模块
①copy模块[熟练]

②fetch模块[熟练]
root@ubuntu24-13:~# ansible 10.0.0.16 -m fetch -a "src=/tmp/tpircs.sh dest=/tmp"
root@ubuntu24-13:~# tar tvf /tmp/10.0.0.16/tmp/log.tar.gz 查看压缩包里的文件
③file模块[熟练]
root@ubuntu24-13:~# ansible 10.0.0.16 -m file -a "path=/file/ state=directory"
④ stat模块
⑥压缩包模块
①Get_url模块
root@ubuntu24-13:~# ansible 10.0.0.16 -m get_url -a 'url=http://nginx.org/download/nginx-
② archive模块
命令格式:ansible <目标主机> -m archive -a '属性1=值1 ... 属性n=值n'
③unarchive模块[熟练]

⑦编辑模块[了解]
⑧软件模块 apt (yum略)
①apt_repository模块1
②apt_repository模块2
③apt_key 模块
⑨service模块[熟练]
⑩ 信息模块
あ debug模块
root@ubuntu24-13:~# ansible 10.0.0.16 -m debug -a 'msg="hello debug"' 定制调试信息

8. 相关命令[了解]
1 ansible-console
2 ansible-playbook
简单实践
- hosts: 10.0.0.101remote_user: rootvars:- zabbix_version: '5.4.9' # 定义Zabbix版本变量tasks:- name: 发送hello world广播消息command: wall "hello world"tags:- hello_world- name: 输出zabbix_version变量值debug:msg: "当前Zabbix版本为: {{ zabbix_version }}" # 引用并显示变量内容tags:- show_version # 新增标签,方便单独执行此任务
3 ansible-vault
4 ansible-galaxy

5 ansible-pull

6 ansible-inventory
简介:ansible-inventory其实是获取主机清单一些的信息的专用命令。
--host, --graph 和 --list,这三个属性,同时的话,只能存在一个。
ansible-inventory --export --list 列出所有主机的信息
ansible-inventory --export --graph 图形⽅式显⽰主机列表信息
ansible-inventory --host=10.0.0.16 显⽰指定主机的信息