【问题标题】:Copy local file to remote AWS EC2 instance with Ansible使用 Ansible 将本地文件复制到远程 AWS EC2 实例
【发布时间】:2017-02-21 00:09:31
【问题描述】:

我正在尝试使用 Packer 和 Ansible 构建一个 AWS AMI,以预置我的 AMI。我无法使用 Ansible 将一些本地文件复制到我新启动的 EC2 实例中。我正在使用 Ansible 中的 copy 模块来执行此操作。这是我的 Ansible 代码的样子:

    - name: Testing copy of the local remote file
      copy:
        src: /tmp/test.test
        dest: /tmp

这是我得到的错误:

 amazon-ebs: TASK [Testing copy of the local remote file] ***********************************

 amazon-ebs: fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "Unable to find '/tmp/test.test' in expected paths."}

我已验证文件 /tmp/test.test 存在于运行 Ansible 的本地计算机上。

对于我的主机文件,我只有 localhost,因为 packer 告诉 Ansible 它需要知道的关于在哪里运行 Ansible 命令的所有信息。

我不确定从这里去哪里或者如何正确调试这个错误,所以我希望能得到一点帮助。

我的 Packer 脚本如下所示:

  {
  "variables": {
    "aws_access_key": "{{env `access_key`}}",
    "aws_secret_key": "{{env `secret_key`}}"
  },
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "{{user `aws_access_key`}}",
    "secret_key": "{{user `aws_secret_key`}}",
    "region": "us-east-1",
    "source_ami": "ami-116d857a",
    "instance_type": "t2.micro",
    "ssh_username": "admin",
    "ami_name": "generic_jenkins_image",
    "ami_description": "Testing AMI building with Packer",
    "vpc_id": "xxxxxxxx",
    "subnet_id": "xxxxxxxx",
    "associate_public_ip_address": "true",
    "tags": {"Environment" : "Dev", "Product": "SharedOperations"}
  }],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sleep 30",
        "sudo rm -f /var/lib/dpkg/lock",
        "sudo apt-get update -y --fix-missing",
        "sudo apt-get -y install libpq-dev python-dev libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev libffi-dev gcc build-essential python-pip",
        "sudo pip install ansible"
      ]
    },
    {
      "type": "ansible-local",
      "playbook_file": "ansible/main.yml"
    }
  ]
}

这是我的整个 Ansible 文件:

---
- hosts: all
  sudo: yes
  tasks:
    - name: Testing copy of the local remote file
      copy:
        src: /tmp/test.test
        dest: /tmp

【问题讨论】:

  • @techraf 不是 100% 确定它为什么提供那个地址,但我知道那是 EC2 实例。我已经运行了一些其他命令(例如用户创建),以确保我的 Ansible 脚本实际上是在远程主机上而不是我的本地主机上执行的。
  • 我能想到的唯一想法是 Packer 只是将我的 Ansible 脚本推送到新创建的 EC2 实例然后运行它。在这种情况下,这个文件移动当然会失败,因为它不存在。不过,我不是 100% 确定这一点,因为我不完全确定这是如何在幕后工作的。

标签: amazon-web-services amazon-ec2 ansible packer


【解决方案1】:

您正在使用 ansible-local provisioner 直接在目标上运行 playbook(在 HashiCorp 的 Vagrant 等产品中为“本地”,Packet 用于描述配置机器的观点)。

目标没有/tmp/test.test 文件,因此您会收到错误消息。

您实际上想使用常规的 Ansible provisioner 运行 playbook。

【讨论】:

  • 在您指出我出于某种原因忽略的明显 127.0.0.1 地址之后,我才恍然大悟。我猜我想使用 Ansible Remote 供应商...谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2020-12-13
  • 2019-03-13
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多