【发布时间】:2020-08-01 20:11:19
【问题描述】:
我正在尝试在 Amazon AWS 上创建一个带有 ansible 的小型 webapp 基础设施,我想完成所有过程:启动实例、配置服务等,但我找不到合适的工具或模块来处理它来自 ansible。主要是 EC2 启动。
非常感谢。
【问题讨论】:
标签: amazon-web-services amazon-ec2 ansible ansible-playbook
我正在尝试在 Amazon AWS 上创建一个带有 ansible 的小型 webapp 基础设施,我想完成所有过程:启动实例、配置服务等,但我找不到合适的工具或模块来处理它来自 ansible。主要是 EC2 启动。
非常感谢。
【问题讨论】:
标签: amazon-web-services amazon-ec2 ansible ansible-playbook
这是您问题的简短回答,如果您需要详细信息和完全自动化的角色,请告诉我。谢谢
先决条件:
Ansible
Python boto 库
在环境设置中设置 AWS 访问密钥和密钥
(最好在 ~./boto 里面)
为了创建 EC2 实例,请修改您可以在“vars”下的“ec2_launch.yml”文件中找到的这些参数:
count # 要创建的实例数
一旦你提到了这些参数,请运行以下命令:
ansible-playbook -i 托管 ec2_launch.yml
hosts 文件的内容:
[local]
localhost
[webserver]
ec2_launch.yml 文件的内容:
---
- name: Provision an EC2 Instance
hosts: local
connection: local
gather_facts: False
tags: provisioning
# Necessary Variables for creating/provisioning the EC2 Instance
vars:
instance_type: t1.micro
security_group: webserver # Change the security group name here
image: ami-98aa1cf0 # Change the AMI, from which you want to launch the server
region: us-east-1 # Change the Region
keypair: ansible # Change the keypair name
count: 1
# Task that will be used to Launch/Create an EC2 Instance
tasks:
- name: Create a security group
local_action:
module: ec2_group
name: "{{ security_group }}"
description: Security Group for webserver Servers
region: "{{ region }}"
rules:
- proto: tcp
type: ssh
from_port: 22
to_port: 22
cidr_ip: 0.0.0.0/0
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: 0.0.0.0/0
rules_egress:
- proto: all
type: all
cidr_ip: 0.0.0.0/0
- name: Launch the new EC2 Instance
local_action: ec2
group={{ security_group }}
instance_type={{ instance_type}}
image={{ image }}
wait=true
region={{ region }}
keypair={{ keypair }}
count={{count}}
register: ec2
- name: Add the newly created EC2 instance(s) to the local host group (located inside the directory)
local_action: lineinfile
dest="./hosts"
regexp={{ item.public_ip }}
insertafter="[webserver]" line={{ item.public_ip }}
with_items: "{{ ec2.instances }}"
- name: Wait for SSH to come up
local_action: wait_for
host={{ item.public_ip }}
port=22
state=started
with_items: "{{ ec2.instances }}"
- name: Add tag to Instance(s)
local_action: ec2_tag resource={{ item.id }} region={{ region }} state=present
with_items: "{{ ec2.instances }}"
args:
tags:
Name: webserver
【讨论】:
local_action,什么时候不应该?我已经看到了像上面这样的代码 sn-ps(例如local_action: ec2 ...),我也看到了直接执行 ec2: ... 的代码 sn-ps,但我找不到任何关于何时可能更喜欢一个而不是其他。 AWS 上的 ansible docs intro 没有使用它,例如:docs.ansible.com/ansible/guide_aws.html
正如其他人所说,云模块包含您需要的几乎所有 AWS 配置支持。也就是说,一旦有一个现有的 SSH:able 机器可以定位和连接,Ansible 的范例就最有意义。相比之下,实例化阶段本质上要求您以本地计算机为目标并从那里调用 AWS API 端点。
和您一样,我想要一个从 EC2 实例化到其配置的优雅过渡的单次命令。在the documentation 中有关于如何完成这样的事情的建议,但它依赖于 add_host 模块来调整 Ansible 对当前主机清单的想法,即使那样我也找不到一个我觉得我在工作的解决方案反对而不是反对制度。
最后我选择了两个不同的剧本:一个使用 ec2、ec2_group、ec2_vol、ec2_eip 和 route53 模块的 provision.yml,以确保我有“硬件”,然后是 configure.yml,更像是一个传统的 Ansible site.yml,它能够将主机清单(在我的情况下是静态的,但动态的会很好)作为给定的,并进行所有良好的声明性状态转换。
这两个 playbook 都是幂等的,但它是 configure.yml,从长远来看,它意味着要一遍又一遍地重新运行。
【讨论】:
ec2 任务参数保留在单独的 group_vars 或 host_vars 文件中 - 因为还没有主机可以与 @ 987654325@ 任务正在针对localhost 运行。你是如何在provision.yml 剧本中解决这个问题的?
EC2 module 专为创建和销毁实例而设计。
如果您想要“最好”的方式,很难击败 CloudFormation,它可以从 Ansible 启动。
【讨论】: