【问题标题】:Ansible CloudFormation Module Can't See S3 ObjectAnsible CloudFormation 模块看不到 S3 对象
【发布时间】:2018-07-24 22:44:07
【问题描述】:

使用 Ansible,我正在尝试将 AWS CloudFormation 模板上传到 S3 存储桶,然后使用生成的 URL 运行模板。

- name: create s3 bucket
  s3_bucket:
    name: '{{ s3.bucket_name }}'
    state: present
  register: s3_bucket

- name: stage cloudformation template
  aws_s3:
    bucket: '{{ s3_bucket.name }}'
    object: cloudformation-template-vpc.yaml
    src: ../files/cloudformation-template-vpc.yaml
    mode: put
  register: s3_file

- name: 'call cloudformation with state {{ vpc.state }}'
  cloudformation:
    stack_name: '{{ vpc.stack_name }}'
    state: '{{ vpc.state | default("present") }}'
    template: '{{ s3_file.url }}'
  register: vpc_ref

但是当我这样做时,我得到一个错误:

IOError: [Errno 2] No such file or directory:
'https://mybucket.s3.amazonaws.com/cloudformation-template-vpc.yaml?AWSAccessKeyId=<access-key>&Expires=<a-number>&Signature=<signature>'

(我明显修改了url。但真正的url是那个格式的。)

显然在那个 url 上有一个对象。 Ansible 刚刚创建了它,我正在使用它返回给我的值,并且我通过 Web 控制台查看了 S3 存储桶以验证它是否存在。对象存在。有“这样的文件或目录”。

这可能是权限问题。我的意思是,我正在运行一个连续的 Ansible 游戏:上传文件,取回 url,然后使用该 url 运行。这一切都是作为同一个 IAM 角色完成的。所以我不明白为什么这会是一个权限问题,但是我还是不太了解 S3 权限、公共、私有等。

为什么会失败?为什么 Ansible 上传后看不到对象?

【问题讨论】:

  • 能否详细说明在哪个任务中显示错误
  • 我不熟悉 aws_s3 模块,但您是否尝试设置 permission: public-read ?我认为这可能是由于需要一些时间才能使对象可用,所以也许您必须使用getuntil 关键字进行pause 或url 检查以执行几次重试。
  • 按照建议,将该对象设为公开。您可以从控制台执行此操作。如果可能,请在另一个选项卡中以隐身模式验证来自浏览器的公共访问权限。这将有助于确定这是否是 S3 权限问题。
  • 好建议!我尝试将权限设置为“bucket-owner-full-control”,我无法设置公共读取,即使只是为了测试。 (“不能?还是不会?”——好吧,不会。这太荒谬了。)让剧本在做之前暂停是个好主意。我试过了,但很可惜,它没有帮助。不过,我确实想通了,我会在稍后发布答案。

标签: amazon-web-services amazon-s3 ansible amazon-cloudformation


【解决方案1】:

问题的根源在于错误:“没有这样的文件或目录”。有时你必须比平时更直接地接受错误。在这种情况下,Ansible 是对的。没有名称以“https://”开头的文件目录。这是一个 URL,而不是文件或目录。

  • 问:Egads,有这么笨吗?
  • A:你说谁傻,伙计?根据 Ansible 文档,“模板”参数用于“cloudformation 模板的本地路径”。还有一个名为“template_url”的参数,用于“包含模板主体的文件的位置。URL 必须指向位于 S3 存储桶中的模板”。这就是你想要做的。

好吧,好吧,也许愚蠢太苛刻了。我只是希望您会为“模板”指定一些内容,并且它会足够聪明地知道它是 URL 还是本地路径。学过的知识。总是 RTFM。

所以鉴于我最初是这样调用 cloudformation 模块的:

- name: 'call cloudformation with state {{ vpc.state }}'
  cloudformation:
    stack_name: '{{ vpc.stack_name }}'
    state: '{{ vpc.state | default("present") }}'
    template: '{{ s3_file.url }}'
  register: vpc_ref

...纠正这个问题的方法是像这样改变倒数第二行:

- name: 'call cloudformation with state {{ vpc.state }}'
  cloudformation:
    stack_name: '{{ vpc.stack_name }}'
    state: '{{ vpc.state | default("present") }}'
    template_url: '{{ s3_file.url }}'
  register: vpc_ref

该块中倒数第二行变为“template_url”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多