【问题标题】:Copy files from remote host to vagrant instance using ansible使用 ansible 将文件从远程主机复制到 vagrant 实例
【发布时间】:2018-06-20 22:58:06
【问题描述】:

之前有人问过类似的问题,但没有一个问题得到回答或针对 Vagrant。

我在主机 master 上有一个目录,我想与我的 vagrant 实例同步。这是我的剧本:

- hosts: master
  vars:
    backup_dir: /var/backups/projects/civi.common.scot/backups/latest/
    dest_dir: /var/import
  tasks:
    - name: Synchronize directories
      synchronize:
        src: "{{ backup_dir }}"
        dest: "{{ dest_dir }}"
        mode: pull
      delegate_to: default

这是我的库存:

default ansible_host=192.168.121.199 ansible_port=22  ansible_user='vagrant' ansible_ssh_private_key_file='/run/media/daniel/RAIDStore/Workspace/docker/newhume/.vagrant/machines/default/libvirt/private_key'
master ansible_host=hume.common.scot

当我运行这个播放时,该过程似乎没有将任何文件复制到磁盘,但也没有出错或退出。

在我的Vagrantfile 中使用ssh.config.forward_agent = true,我可以从 Vagrant 来宾发出以下命令:

rsync --rsync-path='sudo rsync' -avz -e ssh $remote_user@$remote_host:$remote_path $local_path`

但是,以下剧本起作用(与使用synchronize 模块时的问题相同):

- name: synchronize directories (bugfix for above)
  command: "rsync --rsync-path='sudo rsync' -avz -e ssh {{ remote_user }}@{{ remote_host }}:{{ backup_directory }} {{ dest_dir }}"

我也尝试过使用shell 而不是command

如何将这些文件复制到我的 vagrant 实例?

【问题讨论】:

  • 只是为了确认一下,这是为了备份吗?您没有这样说,但是您的剧本使用“backup_dir”作为变量。因为您可以轻松地将一个文件夹从您的主机映射到您的 vagrant,这将使其保持同步,而无需使用 ansible。
  • 不用于备份目的,不。这个想法是将开发机器的内容数据库与生产主机同步。由于生产系统有一个每天填充的备份目录,然后与它自己的备份系统同步,因此使用该备份目录作为数据存储将数据拉入开发环境是有意义的。该开发环境可以是远程云服务器,如果开发人员远程工作,它可以是培训系统,也可以是本地流浪主机。

标签: ansible vagrant rsync


【解决方案1】:

“syschronize”Ansible 模块“在运行 Ansible 的本地主机上运行并源自”(来自手册页的引用)。所以它是从 local 复制到 remote 的。您要做的是从 remote A (master) 复制到 remote B (default)。 要实现这一点,您必须将特定用户的 ssh 密钥从 B 交换到 A,反之亦然,以用于 known_hosts。以下内容将指导您完成整个过程:

- hosts: default
  tasks:
    # transfer local pub-key to remote authorized_keys
    - name: fetch local ssh key from root user
      shell: cat /root/.ssh/id_rsa.pub
      register: ssh_keys
      changed_when: false
    - name: deploy ssh key to remote server
      authorized_key:
              user: "root"
              key: "{{ item }}"
      delegate_to: "master"
      with_items:
              - "{{ ssh_keys.stdout }}"

    # fetch remote host key and add to local known_hosts
    # to omit key accept prompt
    - name: fetch ssh rsa host key from remote server
      shell: cat /etc/ssh/ssh_host_rsa_key.pub
      register: ssh_host_rsa_key
      delegate_to: master
      changed_when: false
    - name: create /root/.ssh/ if not existant
      file:
          path: "/root/.ssh/"
          owner: root
          group: root
          mode: 0700
          state: directory
    - name: add hostkey to root known host file
      lineinfile:
          path: "/root/.ssh/known_hosts"
          line: "{{ master.fqdn }} {{ ssh_host_rsa_key.stdout }}"
          mode: 0600
          create: yes
          state: present
      with_items:
          - "{{ ssh_keys.stdout }}"

    # now call rsync to fetch from master
    - name: fetch from remote
      shell: rsync --rsync-path='sudo rsync' -avz -e ssh root@{{ master.fqdn }}:{{ backup_directory }} {{ dest_dir }}

【讨论】:

  • 感谢您的帮助,不知道为什么它被否决了。有没有办法通过代理转发来做到这一点?
  • “代理转发”是什么意思? ssh代理? => 不知道;另一种方法是下载到/tmp/,然后上传。但这可能不是你想要的。
  • 代理转发是SSH协议的一项功能,它允许SSH服务器上的SSH客户端登录并与其他SSH服务器进行身份验证,而无需与原始客户端交换密钥,绕过安全问题以您描述的方式将 SSH 密钥上传到远程主机。更多详情请看这里:yakking.branchable.com/posts/ssh-A
猜你喜欢
  • 2017-05-02
  • 2016-05-22
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多