Ansible批量改Linux主机名的关键是为每台主机精准设置其专属名称并确保立即生效、持久保存且不中断服务,需通过inventory定义host_name变量、使用hostname模块自动适配系统、同步更新/etc/hosts、重载rsyslog和sshd服务,并执行备份、限流(serial: 5)和验证。

用 Ansible 批量改 Linux 主机名,关键不是“写个命令全网跑”,而是让每个目标主机拿到**它该有的名字**,并确保改完能立即生效、持久保存、不中断服务。
准备前提:清单清晰、连接可靠
主机名和 IP(或域名)必须一一对应。推荐在 inventory 中直接定义变量:
- 用 INI 格式时,在主机行后加 host_name=xxx,例如:
192.168.10.11 host_name=web01 ansible_user=ops - 用 YAML 格式时,把主机名作为 host_vars 写在分组下,更易维护
- 务必提前配置好 SSH 免密登录,避免执行中途卡在密码提示
- 建议开启 gather_facts: false 加快执行——改主机名本身不需要采集全部系统信息
核心操作:用 hostname 模块精准设置
别用 shell 模块 echo 写 /etc/hostname 或调用 hostnamectl —— 容易遗漏兼容性处理。Ansible 的 hostname 模块会自动判断系统类型(Ubuntu/Debian 用 hostnamectl,CentOS/RHEL 7+ 同样适用,老系统回退到 sysctl),并同步更新配置文件和内核参数:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 最简写法:
- name: Set hostname
hostname:
name: "{{ host_name }}" - 模块默认 permanent: true,即同时写入 /etc/hostname 并立即生效,无需重启
- 如果 inventory 中变量名不是 host_name,就替换成你实际用的变量名,比如 inventory_hostname 或 ansible_host
配套动作:同步 hosts 文件与服务重载
只改主机名不够,很多服务(如日志、SSH、监控探针)依赖 /etc/hosts 解析自己,或缓存旧名:
- 往 /etc/hosts 插入本机映射:
- name: Update /etc/hosts
lineinfile:
path: /etc/hosts
line: "{{ ansible_all_ipv4_addresses[0] }} {{ host_name }}"
create: yes - 重载关键服务,清除主机名缓存:
- name: Reload rsyslog and sshd
systemd:
name: "{{ item }}"
state: reloaded
loop:
- rsyslog
- sshd
安全加固:备份 + 限流 + 验证
批量操作最怕“一改全崩”。每次变更前做三件事:
- 备份原 /etc/hostname:
- copy:
src: /etc/hostname
dest: /etc/hostname.{{ ansible_date_time.iso8601_basic_short }}.bak
remote_src: yes - 限制并发数,避免压垮控制节点或触发目标端 SSH 连接限制:
serial: 5(每批最多 5 台) - 执行后加一个验证任务,检查是否真改成功:
- command: hostname
register: current_hostname
- assert:
that: current_hostname.stdout == host_name

















