【发布时间】:2020-03-18 13:00:19
【问题描述】:
我很难完成看似相当标准的任务,所以我希望有人能帮助我。我疯狂地用谷歌搜索了这个,大多数示例不在 VPC 中,或者使用了不推荐使用的结构,这使得它们在我的用例中错误或无法使用。
这是我的目标:
- 我想在我的 VPC 中启动一大堆新实例(相同的 下面的代码有 3 个,但可能是 100 个)
- 我想等待那些实例复活
- 然后我想配置这些实例(SSH 进入它们,更改 主机名,启用某些服务等)
现在我大概可以在 2 个任务中做到这一点。我可以在 1 个剧本中创建实例。等他们安定下来。然后运行第二个剧本来配置它们。这可能就是我现在要做的,因为我想动起来——但必须有一个一次性的答案。
这是我目前所拥有的一本剧本
---
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Provision Lunch
with_items:
- hostname: eggroll1
- hostname: eggroll2
- hostname: eggroll3
ec2:
region: us-east-1
key_name: eggfooyong
vpc_subnet_id: subnet-8675309
instance_type: t2.micro
image: ami-8675309
wait: true
group_id: sg-8675309
exact_count: 1
count_tag:
Name: "{{ item.hostname }}"
instance_tags:
Name: "{{ item.hostname }}"
role: "supper"
ansibleowned: "True"
register: ec2
- name: Wait for SSH to come up
wait_for: host={{ item.private_ip }} port=22 delay=60 timeout=900 state=started
with_items: '{{ec2.instances}}'
- name: Update hostname on instances
hostname: name={{ item.private_ip }}
with_items: '{{ec2.instances}}'
那是行不通的。我得到的是
TASK [Wait for SSH to come up] *************************************************
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
TASK [Update hostname on instances] ********************************************
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.
这让我很难过。现在这是我最新的那本剧本的化身。但是我尝试使用我在互联网上找到的每个示例来重写它。他们中的大多数都有 with_items 以不同的方式编写,但 ansible 告诉我这种方式已被贬低,然后失败了。
到目前为止,ansible 既有趣又简单,但这让我想把笔记本电脑扔到街对面。
有什么建议吗?我应该使用 register 和 with_items 吗?使用这样的东西会更好吗:
add_host: hostname={{item.public_ip}} groupname=deploy
相反?我很乐意在这里重写。我将在 2 个剧本中编写此内容,并希望得到建议。
谢谢!
****编辑**** 现在它刚刚开始感到破碎或严重改变。我用谷歌搜索了几十个示例,它们的编写方式都相同,并且都因相同的错误而失败。这是我现在的简单剧本:
---
- hosts: localhost
connection: local
gather_facts: False
vars:
builderstart: 93
builderend: 94
tasks:
- name: Provision Lunch
ec2:
region: us-east-1
key_name: dakey
vpc_subnet_id: subnet-8675309
instance_type: t2.micro
image: ami-8675309
wait: True
group_id: sg-OU812
exact_count: 1
count_tag:
Name: "{{ item }}"
instance_tags:
Name: "{{ item }}"
role: "dostuff"
extracheese: "True"
register: ec2
with_sequence: start="{{builderstart}}" end="{{builderend}}" format=builder%03d
- name: the newies
debug: msg="{{ item }}"
with_items: "{{ ec2.instances }}"
真的再简单不过了。不管我怎么写,不管我怎么改变它,我都会得到同样的基本错误:
[弃用警告]:由于未定义的错误而跳过任务,在 未来这将是一个致命错误。:'dict object' 没有属性 '实例'。
所以看起来是 with_items: "{{ ec2.instances }}" 行导致了错误。
我使用 debug 打印出 ec2 并且该错误看起来准确。看起来结构改变了我。看起来 ec2 现在包含一个字典,其中结果作为另一个字典对象的键,并且该实例是该字典中的键。但我找不到一种理智的方式来访问数据。
不管怎样,我已经尝试在 2.0.1、2.0.2 和 2.2 中访问它,但在每种情况下我都遇到了同样的问题。
你们其他人是在使用 1.9 还是其他版本?我在任何地方都找不到有效的例子。这很令人沮丧。
再次感谢您的帮助。
【问题讨论】:
-
你需要使用“可变基础设施”范式吗?一种选择是使用 Packer 提前配置您的 AMI。您甚至可以让 Packer 为您执行 Ansible 剧本。然后您可以直接启动 AMI。关于您的 Ansible 错误,不确定。
-
嗯,您的问题在于您使用 EC2 模块的方式
-
您可以使用自动缩放组来添加 ec2,然后对配置进行 ansible 完成
-
我想到了这一点,但我尽量不在我的解决方案中嵌入太多 AWS 服务,因为我不确定我们是否会在一年后仍然存在。我试图在我的方法中与云无关。不过谢谢。
标签: amazon-web-services amazon-ec2 ansible amazon-vpc