You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ansible hostname模块修改树莓派CM4主机名失败求助

Ansible修改树莓派CM4主机名失败的解决方法

问题背景

要批量修改多台Raspberry Pi Compute Module 4的主机名,设备基于同一Raspberry Pi OS镜像,默认主机名均为raspberrypi。

现有配置

Inventory文件:

rpi-cm4-1:
  node_number: 1
  name: rpi-cm4-1
  ansible_host: 192.168.1.101

rpi-cm4-2:
  node_number: 2
  name: rpi-cm4-2
  ansible_host: 192.168.1.102

...

Playbook文件:

- name: Change hostname of managed nodes
  hosts: rpi_cm4-2
  tasks:
    - name: Change hostname of managed nodes
      ansible.builtin.hostname:
        name: "{{ hostvars[inventory_hostname].name }}"

错误现象

运行Playbook后,收集Facts正常,但修改主机名任务失败:

TASK [Gathering Facts] *****************************************************************************************************
ok: [rpi-cm4-2]

TASK [Change hostname of managed nodes] *****************************************************************************************************
fatal: [rpi-cm4-2]: FAILED! => changed=false
  msg: |-
    Command failed rc=1, out=, err=Could not set pretty hostname: Connection timed out

查看-vvv详细日志,发现两个核心问题:

  1. 模块实际传入的主机名是192.168.1.102,而非Inventory中定义的rpi-cm4-2
  2. 触发Polkit权限认证失败:Authentication is required to set the statically configured local hostname... polkit-agent-helper-1: pam_authenticate failed: Authentication failure

原因分析

  1. 变量解析错误:hostvars[inventory_hostname].name没有正确获取到Inventory中的自定义name变量,意外解析为设备IP
  2. 权限不足:修改主机名需要root权限,当前使用pi用户执行,无法自动完成Polkit认证

解决方法

方法1:修正变量并提升权限

修改Playbook,直接使用inventory_hostname(与Inventory中定义的主机名一致),同时添加become: yes获取root权限:

- name: Update Raspberry Pi hostname
  hosts: rpi_cm4-2
  become: yes  # 切换到root权限执行
  tasks:
    - name: Set static hostname
      ansible.builtin.hostname:
        name: "{{ inventory_hostname }}"

如果坚持使用自定义name变量,可简化变量引用:

name: "{{ name }}"

方法2:直接修改配置文件(备选)

若hostname模块仍有异常,可直接修改树莓派的主机名配置文件:

- name: Update hostname via config files
  hosts: rpi_cm4-2
  become: yes
  tasks:
    - name: Overwrite /etc/hostname
      ansible.builtin.copy:
        content: "{{ inventory_hostname }}\n"
        dest: /etc/hostname
        mode: '0644'

    - name: Update hostname in /etc/hosts
      ansible.builtin.replace:
        path: /etc/hosts
        regexp: 'raspberrypi'
        replace: "{{ inventory_hostname }}"

    - name: Reboot to apply changes
      ansible.builtin.reboot:

额外配置

确保pi用户拥有免密码sudo权限,避免Ansible执行become时需要手动输入密码:
在树莓派上执行:

sudo visudo

添加以下内容:

pi ALL=(ALL) NOPASSWD: ALL

内容的提问来源于stack exchange,提问作者Nicolas CASAUX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:29:59