【问题标题】:Ansible upload file to the immediate root directoryAnsible 上传文件到直接根目录
【发布时间】:2015-11-09 21:23:54
【问题描述】:

我正在尝试用 Ansible 模仿这个简洁的 scp 命令:

scp local_file user@remote_host:

上面会将local_file上传到remote_host/home/user
AnsibleBIG 问题是它需要在dst 中提供绝对路径,因为我正在上传到@987654328,所以我无法提供@...

---
- hosts: remote_host
  connection: paramiko
  gather_facts: False
  tasks:
  - name: Uploading SSH Pub Key
    copy:
      src="../keys.d/ssh-keyfile.pub" dest="/"

这个剧本很高兴地失败并出现错误:

fatal: [remote_host] => failed to transfer file to syntax error (line 1 column 5)/source

有人知道任何合理的解决方法吗?也许可以启动本地命令(在执行 ansible-playbook 的主机上),在我的情况下是scp,并提供 Ansible 变量?

【问题讨论】:

  • $HOME 变量有一个直接的方法,但是,你试过只使用dest="~/" 吗?这对我有用
  • @MikeD 感谢您的提示,但您的建议不起作用,普通的 ~ 也不起作用。就像我说的,我正在上传到 router,而不是 linux 框,所以没有像大多数 bash-like shell 那样的便捷快捷方式,~指向用户的主目录。
  • 您应该澄清问题中的路由器。查看router docs,您应该这样做:ftp -n <<EOF open 10.20.1.1 user admin admin put ../keys.d/ssh-keyfile.pub EOF。然后你必须连接并做user ssh-keys import file=ssh-keyfile.pub
  • @MikeD 我的问题不是关于路由器的具体品牌,因为这个特定的任务 ansible 会在 cisco 或任何其他设备上失败,你不能指定直接路径..我很完美请注意,我还有其他选择,例如您提到的ftp,在这种情况下,我会编写一个简单的 bash 脚本,然后使用scp 推送文件,因为我想要安全通道。然而问题是如何用 ansible 来做这件事,这很可惜,因为 ansible 在这个领域似乎远不完美。谢谢。

标签: ansible scp provisioning


【解决方案1】:

在移动文件之前发出远程命令并捕获输出是否可行?

tasks:
 - command: pwd
   register: remote_pwd
 - name: Uploading SSH Pub Key
   copy:
     src="../keys.d/ssh-keyfile.pub" dest="{{ remote_pwd }}"

好的,鉴于路由器的外壳非常有限,那么您可以试试这个(适用于我的 linux 机器,但我没有路由器可以尝试)

---
- hosts: localhost
  vars:
    user: jonathan
    host: 192.168.1.1
    file: /tmp/test
    idfile: /Users/jonathan/.ssh/id_rsa.pub
  tasks:
- name: scp
  command: "scp -i {{ idfile }} {{ file }} {{ user }}@{{ host}}:"

【讨论】:

  • 很好的尝试 Jonathan,谢谢,但就像我说的,它最终是一个 路由器不是 linux 机器没有pwd 命令。路由器有它自己的外壳,其中包含特定于该外壳的命令。它是 Mikrotik 路由器,如果您想知道的话。
  • 我查看了 Mikrotik 路由器,但您的选择确实非常有限 :-) 以上是在您的 ansible 主机上执行的本地操作,而不是路由器。
  • command - Executes a command on a remote node - 这是取自 ansible 文档。因此,您的示例将在远程主机上获取一个文件,然后尝试将其上传到{{ user }}@{{ host}}:,因为scp 在远程主机上可用。这与我的练习相反,scp 在路由器外壳上不可用。虽然谢谢你的尝试。
  • 实际上,在此示例中,“远程主机”是 localhost。我正是使用该播放将 /tmp/test 上传到主机识别的机器:变量。试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多