AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1005000
Accepted
logax
logax
Asked: 2020-02-29 08:42:21 +0800 CST2020-02-29 08:42:21 +0800 CST 2020-02-29 08:42:21 +0800 CST

Ansible 将文件从 S3 下载到 ec2 实例错误

  • 772

我正在尝试学习 Ansible。我正在创建一个实例并将文件上传到其中,我想放入 ec2 实例的文件存储在 S3 中,但它一直说 c2 内的目标不存在,但它确实存在.

这是失败的,在此之前的所有其他事情,包括创建实例都工作正常:

- name: Deploy war file
        aws_s3:
            bucket: "{{ war_bucket }}"
            object: "{{ war_file }}"
            dest: "{{ war_deploy_path }}/{{ war_file }}"
            mode: get
            overwrite: no
        register: war_downloaded

这就是我声明变量的方式:

war_file: file.war
war_bucket: ansible-bucket
war_deploy_path: /opt/folder/file.war

这是我得到的错误:

[Errno 2] No such file or directory: '/opt/folder/file.war.1f1ccA91'

为什么要添加这个奇怪的代码“1f1cA91”?是不是造成了问题?

更新:我尝试将目的地从“{{ war_deploy_path }}/{{ war_file }}”更改为“{{ war_deploy_path }}”,但同样的问题仍然存在,现在只有错误[Errno 2] No such file or directory: '/opt/folder.Ac2926c3'。

重要更新 2:好的,所以为了测试,我决定在我的本地机器上创建相同的路径,令我惊讶的是,这个脚本实际上是在我的本地机器上运行它而不是 ec2 实例大声笑,所以现在,我如何让它在 ec2 实例 xD 上运行。

amazon-ec2 amazon-s3 amazon-web-services ansible
  • 1 1 个回答
  • 2192 Views

1 个回答

  • Voted
  1. Best Answer
    kenlukas
    2020-03-03T06:30:17+08:002020-03-03T06:30:17+08:00

    在 ansible 中创建一个主机,然后在同一个 playbook 中处理它是可能的,但需要对清单文件进行一些动态更改并重新读取 playbook 中的清单。

    首先,在您的库存文件中添加一个占位符,例如:

    [local]
        localhost ansible_connection=local ansible_python_interpreter=python
    
    [new_ones]
    

    其次,在您的剧本中,您将需要两个部分,一个用于运行本地作业,第二个用于针对您从第一部分创建的主机运行。在第一部分中,您将创建主机,然后将主机 IP 添加到您在上面创建的清单中。然后你会告诉 ansible 用命令重新读取清单,meta然后等待主机提出pause命令。这是一个例子:

    ---
    
    - name: Testing Part One
      hosts: local
      become: yes
      tasks:
        - name: create an ec2 instance
          local_action: 
              module: ec2
              aws_secret_key: <redacted>
              aws_access_key: <redacted>
              group_id: sg-1234567
              key_name: my_key
              instance_type: t2.micro
              image: ami-0123456789abcde
              wait: yes
              count: 1
              vpc_subnet_id: subnet-987654321
              assign_public_ip: no
              region: us-east-1
          register: ec2
    
    # This part adds the IP address of the host that was created above to the
    #   inventory file
    
        - name: Add instance to inventory
          local_action:
              module: lineinfile
              path: inv/hosts_default
              regexp: "{{ item.private_ip }}"
              insertafter: "new_ones"
              line: "{{ item.private_ip }}"
          with_items: '{{ ec2.instances }}'
    
    # Have the playbook reread the inventory file
        - meta: refresh_inventory
    
    # Wait for a bit to ensure SSH is enabled
        - pause:
            minutes: 5
    

    然后你在同一个剧本中创建另一个条目来复制你的文件。默认情况下,我没有在我的主机上安装 pip,所以补充说以防万一你在同一条船上:

    - name: Testing Part Two
      hosts: new_ones
      become: yes
      tasks:
    
    # Install pip, boto, boto3, and botocore.  You may not need this
        - name: install pip
          easy_install:
            name: pip
            state: latest
    
        - name: install boto, boto3 and botocore
          pip:
             name: "{{ item }}"
          loop:
            - boto
            - boto3
            - botocore
    
    # Finally we get to what you were trying to do to begin with...
    
        - name: Deploy war file
          aws_s3:
              aws_secret_key: <redacted>
              aws_access_key: <redacted>
              bucket: "mybucketname"
              object: "blah.txt"
              dest: "/tmp/blah.txt"
              mode: get
              overwrite: no
          register: war_downloaded
    

    如果您仍然感到困惑,这是完整的剧本:

    ---
    
    - name: Testing Part 1
      hosts: local
      become: yes
      tasks:
        - name: create an ec2 instance
          local_action: 
              module: ec2
              aws_secret_key: <redacted>
              aws_access_key: <redacted>
              group_id: sg-1234567
              key_name: my_key
              instance_type: t2.micro
              image: ami-0123456789abcde
              wait: yes
              count: 1
              vpc_subnet_id: subnet-987654321
              assign_public_ip: no
              region: us-east-1
          register: ec2
    
        - name: Add instance to inventory
          local_action:
              module: lineinfile
              path: inv/hosts_default
              regexp: "{{ item.private_ip }}"
              insertafter: "new_ones"
              line: "{{ item.private_ip }}"
          with_items: '{{ ec2.instances }}'
    
        - meta: refresh_inventory
    
        - pause:
            minutes: 5
    
    - name: Testing Part Two
      hosts: new_ones
      become: yes
      tasks:
        - name: install pip
          easy_install:
            name: pip
            state: latest
    
        - name: install boto, boto3 and botocore
          pip:
             name: "{{ item }}"
          loop:
            - boto
            - boto3
            - botocore
    
        - name: Deploy war file
          aws_s3:
              aws_secret_key: <redacted>
              aws_access_key: <redacted>
              bucket: "mybucketname"
              object: "blah.txt"
              dest: "/tmp/blah.txt"
              mode: get
              overwrite: no
          register: war_downloaded
    

    参考

    Ansible 元模块

    PS我只测试了这个建筑一个主机,如果你建造多个你的里程可能会有所不同。

    • 1

相关问题

  • 权限被拒绝(公钥)。从本地 Ubuntu 到 Amazon EC2 服务器的 SSH

  • 管理员如何管理他们的 EC2 EBS 和快照?

  • 云有多大?[关闭]

  • EC2 映像启动

  • 如何将安全组添加到正在运行的 EC2 实例?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve