使用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>'
(我明显修改了网址。但真正的网址是那种格式。)
很明显,该网址上有一个对象。 Ansible刚刚创建它,我正在使用它给我的价值,我通过网络控制台查看了S3存储桶以验证它在那里。该对象存在。有“这样的文件或目录”。
这可能是权限问题。我的意思是,我正在运行一个连续的Ansible游戏:上传文件,获取网址,然后使用该网址运行。这一切都是作为相同的IAM角色完成的。所以我不明白为什么它会成为权限问题,但是我再也不了解S3权限,公共,私有等。
为什么会失败?为什么Ansible在上传后无法看到该对象?
问题的根源在于错误:“没有这样的文件或目录”。有时候你必须比平常更多地犯错误。在这种情况下,Ansible是对的。没有名称以“https://”开头的文件或目录。这是一个URL,而不是文件或目录。
好吧,好吧,也许愚蠢太苛刻了。我本来希望你为“模板”指定一些内容,并且知道它是否是一个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”。