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

如何在Ansible Playbook中重启Azure虚拟机?

解决Ansible虚拟机重启问题的两种方案

方案一:修复内置reboot命令的认证错误

报错原因是远程主机执行reboot需要sudo权限,但默认要求交互式输入密码,导致命令失败。解决步骤如下:

  1. 配置远程主机sudo免密执行reboot
    在目标虚拟机上,用visudo编辑sudoers文件(安全编辑方式),添加以下内容(替换ansibleuser为你的Ansible登录用户名):

    ansibleuser ALL=(ALL) NOPASSWD: /sbin/reboot, /usr/sbin/reboot
    
  2. 在Playbook中添加become参数
    修改原有Playbook,在reboot任务中启用sudo:

    - name: Setup Middleware and Reboot VM
      hosts: virtualmachines
      tasks:
        - name: Edit the config file to set software name
          ansible.builtin.lineinfile:
            path: /home/some/file.txt
            regexp: '^MyOwnName='
            line: MyOwnName="{{ inventory_hostname }}"
    
        - name: Reboot remote virtual machine
          ansible.builtin.reboot:
            msg: "Reboot triggered by Ansible post-configuration"
            reboot_timeout: 300  # 等待重启完成的超时时间(秒)
          become: yes  # 启用sudo权限
    

方案二:通过本地Azure CLI批量重启VM

如果不想修改远程主机的sudo配置,可以在本地执行Azure CLI命令,关键是把远程主机名传递到本地任务。有两种实现方式:

方式1:收集主机名到变量后循环执行

# 远程配置并收集所有目标VM名称
- name: Setup Middleware and collect VM names
  hosts: virtualmachines
  tasks:
    - name: Edit config file
      ansible.builtin.lineinfile:
        path: /home/some/file.txt
        regexp: '^MyOwnName='
        line: MyOwnName="{{ inventory_hostname }}"

    # 一次性收集所有virtualmachines组的主机名
    - name: Collect target VM names
      ansible.builtin.set_fact:
        vm_list: "{{ groups['virtualmachines'] }}"
      run_once: yes  # 只执行一次,避免重复收集

# 本地执行Azure CLI重启
- name: Restart Azure VMs via local CLI
  hosts: localhost
  gather_facts: false
  vars:
    rg_name: "My-RG-Name"
  tasks:
    - name: Restart each VM in the list
      command: az vm restart --resource-group "{{ rg_name }}" --name "{{ item }}"
      loop: "{{ hostvars['Name-Of-My-Azure-VM-Here']['vm_list'] }}"
      # 注:这里用组内任意一台主机的hostvars即可,因为vm_list是全局收集的

方式2:添加临时主机组后循环执行

# 远程配置并将VM添加到临时组
- name: Setup Middleware
  hosts: virtualmachines
  tasks:
    - name: Edit config file
      ansible.builtin.lineinfile:
        path: /home/some/file.txt
        regexp: '^MyOwnName='
        line: MyOwnName="{{ inventory_hostname }}"

    # 将当前VM添加到临时组azure_vms_to_restart
    - name: Add VM to restart group
      ansible.builtin.add_host:
        name: "{{ inventory_hostname }}"
        groups: azure_vms_to_restart

# 本地遍历临时组执行重启命令
- name: Restart Azure VMs locally
  hosts: localhost
  gather_facts: false
  tasks:
    - name: Restart each target VM
      command: az vm restart --resource-group "My-RG-Name" --name "{{ item }}"
      loop: "{{ groups['azure_vms_to_restart'] }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:34:52