如何在Ansible Playbook中访问组内其他主机私有IP部署sshfs
解决Ansible双向sshfs挂载时获取组内另一台主机私有IP的方法
方法一:通过Ansible事实(gather_facts)动态获取私有IP
- 确保Playbook启用事实收集(默认已启用,若关闭需显式开启):
- name: 配置双向sshfs挂载 hosts: cloudalpine gather_facts: yes tasks:
- 添加任务提取组内另一台主机的私有IP:
- name: 提取组内对等主机的私有IP set_fact: peer_private_ip: "{{ groups['cloudalpine'] | difference([inventory_hostname]) | map('extract', hostvars, 'ansible_default_ipv4.address') | first }}"
- 说明:
groups['cloudalpine']:获取目标组的所有主机列表difference([inventory_hostname]):排除当前执行任务的主机,仅保留组内其他主机map('extract', hostvars, 'ansible_default_ipv4.address'):从Ansible主机变量中提取对应主机的私有IP(若私有IP不在默认网卡,可替换为对应网卡变量,如ansible_eth1.ipv4.address,可通过ansible -m setup <主机名>查看所有事实变量确认)first:因组内仅两台主机,取第一个结果即为对等主机IP
- 在docker_volume任务中使用该变量:
- name: 创建sshfs Docker卷 docker_volume: volume_name: "sshvolume" use_ssh_client: true driver: vieux/sshfs driver_options: IdentityFile: "{{ lookup('file', ansible_ssh_private_key_file) }}" port: 22 sshcmd: "<username>@{{ peer_private_ip }}:/etc/docker/storage"
方法二:手动在主机清单中定义私有IP(更稳定)
- 修改hosts文件,为每个主机添加私有IP变量:
--- # hosts ... cloud: children: cloudalpine: hosts: web-alpine-1: ansible_host: 公网IP private_ip: 私有IP1 web-alpine-2: ansible_host: 公网IP private_ip: 私有IP2
- 在Playbook中提取对等主机的私有IP:
- name: 提取组内对等主机的私有IP set_fact: peer_private_ip: "{{ groups['cloudalpine'] | difference([inventory_hostname]) | map('extract', hostvars, 'private_ip') | first }}"
- 后续docker_volume任务同方法一,直接使用
{{ peer_private_ip }}即可
额外注意事项
- 确保两台主机之间可通过私有IP互通,防火墙需开放22端口
- 确认SSH密钥已在两台主机间配置免密登录,避免挂载时需要输入密码
- 若使用非默认SSH端口,需调整driver_options中的port参数
内容的提问来源于stack exchange,提问作者Aidan Hall
相关产品推荐
相关产品推荐

