如何用Ansible通过网络直接备份Raw/KVM LVM卷设备
实现LVM卷的流式跨主机备份(Ansible方案)
要实现类似dd bs=16M if=/dev/h-vg/vm-dev | ssh root@serverB "dd bs=16M of=/path/to/backup.img"的流式传输且符合Ansible规范,核心思路是利用系统级工具实现节点间直接数据流,同时尽量规避shell模块的安全风险,以下是可行方案:
方案1:用command模块+rsync(推荐)
rsync支持直接传输块设备,且具备稀疏文件支持、断点续传等优势,比dd更高效可靠;同时command模块无需调用shell解析,规避了shell注入风险,更符合Ansible规范。
前提条件
- Hypervisor节点已配置到备份服务器(serverB)的免密SSH登录(可提前用
ansible.builtin.authorized_key模块配置)。 - Hypervisor和serverB都安装了rsync。
Playbook示例
- name: 流式备份LVM快照到serverB hosts: hypervisor_nodes vars: lvm_snapshot: /dev/h-vg/vm-dev backup_server: serverB backup_file_path: /path/to/backup.img tasks: - name: 确保rsync已安装 ansible.builtin.package: name: rsync state: present become: true - name: 用rsync流式传输LVM卷 ansible.builtin.command: cmd: rsync --sparse --devices --block-size=16M {{ lvm_snapshot | quote }} {{ backup_server | quote }}:{{ backup_file_path | quote }} creates: "{{ backup_file_path }}" # 备份文件已存在则跳过 become: true
关键说明
--sparse:保留LVM卷中的空块,避免备份文件占用不必要的空间。--devices:允许rsync传输块设备文件。{{ var | quote }}:对变量进行转义,防止非法字符引发的命令执行风险,符合Ansible安全规范。creates参数:避免重复执行备份操作,优化效率。
方案2:安全使用shell模块(备选)
如果必须沿用dd+ssh的方式,可通过规范的变量处理降低shell模块的风险:
Playbook示例
- name: 用dd+ssh流式备份LVM快照 hosts: hypervisor_nodes vars: lvm_snapshot: /dev/h-vg/vm-dev backup_server: serverB backup_file_path: /path/to/backup.img tasks: - name: 流式传输LVM数据到备份服务器 ansible.builtin.shell: cmd: 'dd bs=16M if={{ lvm_snapshot | quote }} | ssh -o StrictHostKeyChecking=no {{ backup_server | quote }} "dd bs=16M of={{ backup_file_path | quote }}"' creates: "{{ backup_file_path }}" become: true
关键注意点
- 必须配置Hypervisor到serverB的免密SSH登录,避免交互式输入密码。
- 所有变量均通过
quote过滤器转义,杜绝shell注入风险。 StrictHostKeyChecking=no:首次连接时自动接受serverB的主机密钥(若需更安全,可提前用known_hosts模块配置主机密钥)。
关于Ansible原生流式传输的说明
Ansible核心模块并未提供直接的节点间流式数据传输功能,其设计架构以控制节点为中间层,大多数模块聚焦于控制节点与目标节点的交互。因此,实现节点间直接流式备份必须依赖系统级工具(如rsync、ssh+dd),但通过选择command模块、规范变量处理,可最大程度符合Ansible的安全与规范要求。
内容的提问来源于stack exchange,提问作者philipp
相关产品推荐
相关产品推荐

