带有 ansible 的 sshfs 不会给出与在主机上手动运行它相同的结果

问题描述

我正在为我的服务器做备份。我为此使用 sshfs。当想要备份文件夹时,备份服务器会要求输入密码。这是我的任务(处理程序)的样子:

- name: Mount backup folder
  become: yes
  expect:
    command: "sshfs -o allow_other,default_permissions {{ backup_server.user }}@{{ backup_server.host }}:/ /mnt/backup"
    echo: yes
    responses:
      (.*)password(.*): "{{ backup_server.password }}"
      (.*)Are you sure you want to continue(.*): "yes"
  listen: mount-backup-folder

它运行并产生以下输出

changed: [prod1.com] => {
    "changed": true,"cmd": "sshfs -o allow_other,default_permissions user@hostname.com:/ /mnt/backup","delta": "0:00:00.455753","end": "2021-01-26 14:57:34.482440","invocation": {
        "module_args": {
            "chdir": null,"command": "sshfs -o allow_other,"creates": null,"echo": true,"removes": null,"responses": {
                "(.*)Are you sure you want to continue(.*)": "yes","(.*)password(.*)": "password"
            },"timeout": 30
        }
    },"rc": 0,"start": "2021-01-26 14:57:34.026687","stdout": "user@hostname.com's password: ","stdout_lines": [
        "user@hostname.com's password: "
    ]
}

但是当我去服务器时,文件夹没有与备份服务器同步。但是当我手动运行命令时:

sshfs -o allow_other,default_permissions user@hostname.com:/ /mnt/backup

备份确实有效。有人知道这怎么可能吗?

解决方法

我怀疑 sshfsSIGHUP 杀死。我对 Ansible 一无所知,所以不知道它是否有忽略 SIGHUP 的官方方法。作为一种解决方法,您可以这样编写:

expect:
  command: bash -c "trap '' HUP; sshfs -o ..."

我安装了 sshfs 并使用 Expect (spawn -ignore HUP ...)sexpect 验证了此 bash -c "trap ..." 解决方法(生成 -nohup ...)。我相信它也适用于 Ansible (似乎它的 expect 模块使用 Python 的 pexpect

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...