Ansible批量运维核心是连得上、管得住、写得对:免密SSH需确保PubkeyAuthentication开启及权限严格(.ssh 700、authorized_keys 600),inventory须显式声明端口/用户等参数并推荐项目级文件,模块选用command优先(安全)、shell按需(支持管道),Playbook中用ansible_facts['os_family']替代弃用的ansible_distribution以保障跨发行版兼容。

Linux 服务器用 Ansible 批量自动化运维,核心就三件事:连得上、管得住、写得对。不是装完就能跑,卡在免密 SSH、inventory 写错或模块乱用,90% 的人第一步就停住。
确保控制节点能稳定连接所有目标机
这是所有操作的前提,连不上,后面全是空谈。
-
目标机必须开启 PubkeyAuthentication:检查
/etc/ssh/sshd_config中PubkeyAuthentication yes已启用,且AuthorizedKeysFile .ssh/authorized_keys是默认路径 -
权限必须严格:目标机用户家目录
~/.ssh权限为700,authorized_keys为600;否则 sshd 会静默拒绝认证 -
验证方式要快准狠:不用等几十秒超时,直接运行
ssh -o ConnectTimeout=5 -o BatchMode=yes user@host——秒退说明连通但认证失败,卡住则是网络或 sshd 服务问题 -
密码登录已禁用?那公钥必须提前配好:如果
PasswordAuthentication no已设,ssh-copy-id必须在禁用前完成;否则公钥虽写入,但无法生效
主机清单(inventory)不能只写 IP
写错格式或漏参数,ansible all -m ping 就会报 UNREACHABLE 或直接跳过某台机器。
-
非标准端口、用户、密钥必须显式声明:比如目标机 SSH 端口是 2222,inventory 中不能只写
192.168.1.10:2222,而要写成192.168.1.10 ansible_port=2222 ansible_user=ops ansible_ssh_private_key_file=~/.ssh/id_rsa_ops - 避免混用 IP 和域名:DNS 一出问题,整组机器失联;建议统一用 IP,或确保所有域名在控制节点 /etc/hosts 中有对应解析
-
推荐项目级 inventory 文件:别硬改全局
/etc/ansible/hosts,在项目目录下建inventory.ini,用-i inventory.ini显式调用,更清晰、易维护 -
分组要支持差异化配置:比如不同网卡、不同密钥的机器,可按网络角色分组:
[eth0-servers]、[bond0-servers],各自指定连接参数
命令执行别乱用 module,安全和功能要平衡
command 和 shell 不是“能不能执行”的区别,而是“是否走 shell 解析”的本质差异。
-
默认优先用
command:它不经过远程 shell,无管道、无变量展开、无重定向,但最安全——适合uptime、df -h这类纯命令 -
需要管道或环境变量?用
shell:比如ansible web -m shell -a 'ps aux | grep nginx';注意外层必须单引号包裹,防止本地 shell 提前解析 -
别把多行逻辑塞进
-a:复杂逻辑优先用script模块——本地脚本自动传过去执行,比拼接字符串更可靠、易调试 -
查 PATH?
command会失效:运行ansible host -m command -a "echo $PATH"输出为空;换-m shell才能拿到真实值
Playbook 要适配不同系统,别硬编码发行版名
写死 Ubuntu 或 CentOS 很容易在 Rocky、AlmaLinux、Oracle Linux 上翻车。
-
用
ansible_facts['os_family']判断大类:值固定为Debian、RedHat、Suse等,覆盖主流分支,兼容性远高于弃用的ansible_distribution -
版本判断要带类型转换:比如
when: ansible_facts['os_family'] == "RedHat" and ansible_facts['distribution_major_version'] | int >= 8,避免字符串比较出错 -
关键任务记得
gather_facts: true:Playbook 默认会收集事实,但如果显式关了,os_family这类变量就不存在,条件判断直接失败 - 初始化任务放前面:比如更新源、升级系统、时区同步、禁用 IPv6 ——这些基础设置最好在第一轮 Play 中统一完成,避免后续依赖出问题


















