如何在Ansible Playbook中重启Azure虚拟机?
解决Ansible虚拟机重启问题的两种方案
方案一:修复内置reboot命令的认证错误
报错原因是远程主机执行reboot需要sudo权限,但默认要求交互式输入密码,导致命令失败。解决步骤如下:
配置远程主机sudo免密执行reboot
在目标虚拟机上,用visudo编辑sudoers文件(安全编辑方式),添加以下内容(替换ansibleuser为你的Ansible登录用户名):ansibleuser ALL=(ALL) NOPASSWD: /sbin/reboot, /usr/sbin/reboot在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
相关产品推荐
相关产品推荐

