【发布时间】:2014-09-11 17:50:05
【问题描述】:
我有一个这样的基本 Ansible 剧本:
---
- name: Provision ec2 servers
hosts: 127.0.0.1
connection: local
roles:
- aws
- name: Configure {{ application_name }} servers
hosts: webservers
sudo: yes
sudo_user: root
remote_user: ubuntu
vars:
- setup_git_repo: no
- update_apt_cache: yes
vars_files:
- env_vars/common.yml
- env_vars/remote.yml
roles:
- common
- db
- memcached
- web
具有以下库存:
[localhost]
127.0.0.1 ansible_python_interpreter=/usr/local/bin/python
Provision ec2 服务器任务可以满足您的预期。它创建一个 ec2 实例;它还会创建一个主机组 [webservers] 并将创建的实例 IP 添加到其中。
配置 {{ application_name }} 服务器步骤然后配置该服务器,安装我需要的一切。
到目前为止一切顺利,这一切都完全符合我的要求,一切似乎都正常。
这就是我卡住的地方。我希望能够为不同的角色启动一个 ec2 实例。理想情况下,我会创建一个数据库服务器、一个网络服务器,也许还有一个 memcached 服务器。我希望能够单独部署此基础架构的任何部分,例如只创建和配置数据库服务器
我能想到的唯一方法可以使这项工作......好吧,它们不起作用。
我尝试简单地声明清单中没有主机的主机组:
[webservers]
[dbservers]
[memcachedservers]
但这是一个语法错误。
我可以明确地配置每个服务器并声明它的主机组,如下所示:
- name: Provision webservers
hosts: webservers
connection: local
roles:
- aws
- name: Provision dbservers
hosts: dbservers
connection: local
roles:
- aws
- name: Provision memcachedservers
hosts: memcachedservers
connection: local
roles:
- aws
但这些组在相应步骤完成之前不存在,所以我认为这也行不通。
我看过很多关于动态清单的内容,但我无法理解这对我有什么帮助。我还查看了无数 ansible ec2 配置项目的示例,它们总是要么配置预先存在的 ec2 实例,要么只是创建一个实例并在其上安装所有内容。
【问题讨论】:
-
您可能会发现
add_host模块很有用。您可以创建 EC2 实例,将其 IP 地址注册到变量,使用add_host将其添加到内存清单中,然后运行您的配置任务。 -
@Ben Whaley。恐怕我已经有了那部分(它隐藏在 aws 角色中)。我的问题不是将实例添加到主机,而是确保仅为相关主机组(由 --limit 模式选择的主机组)创建实例。我实际上已经得出结论,我想要的方式目前是不可能的,并采用了不同的方法。我会尽快发布答案。
标签: amazon-ec2 ansible ansible-playbook ansible-inventory