Amazon ec2 Ansible ec2仅提供所需的服务器
我有一本基本的Ansible剧本,像这样:Amazon ec2 Ansible ec2仅提供所需的服务器,amazon-ec2,ansible,ansible-playbook,ansible-inventory,Amazon Ec2,Ansible,Ansible Playbook,Ansible Inventory,我有一本基本的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: -
---
- 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
[webservers]
[dbservers]
[memcachedservers]
“配置ec2服务器”任务实现了您所期望的功能。它创建一个ec2实例;它还创建一个主机组[webservers],并将创建的实例IP添加到其中
配置{{application\u name}}}服务器步骤然后配置该服务器,安装我需要的一切
到目前为止,一切都很好,完全符合我的要求,一切似乎都正常
这就是我被困的地方。我希望能够为不同的角色启动一个ec2实例。理想情况下,我会创建一个dbserver、一个web服务器,也许还有一个memcached服务器。我希望能够单独部署此基础架构的任何部分,例如,仅创建和提供db服务器
我能想到的唯一办法就是让这一切顺利进行。。。嗯,它们不起作用
我试图简单地声明清单中没有主机的主机组:
[localhost]
127.0.0.1 ansible_python_interpreter=/usr/local/bin/python
[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实例,或者只是创建一个实例并在其上安装所有内容。最后我意识到,将堆栈的不同部分分离成单独的剧本更有意义,有一套完整的剧本,每一本都有 我的远程主机文件与上面的基本相同。堆栈特定部分的一个剧本示例如下:
---
- name: Provision ec2 apiservers
hosts: apiservers #important bit
connection: local #important bit
vars:
- host_group: apiservers
- security_group: blah
roles:
- aws
- name: Configure {{ application_name }} apiservers
hosts: apiservers:!127.0.0.1 #important bit
sudo: yes
sudo_user: root
remote_user: ubuntu
vars_files:
- env_vars/common.yml
- env_vars/remote.yml
vars:
- setup_git_repo: no
- update_apt_cache: yes
roles:
- common
- db
- memcached
- web
这意味着,每层播放的第一步将向apiservers组添加一个新主机,第二步(配置…apiservers)将能够排除本地主机,而不会出现无主机匹配错误
包装剧本非常简单,只是:
---
- name: Deploy all the {{ application_name }} things!
hosts: all
- include: webservers.yml
- include: apiservers.yml
对于ansible,我是一个非常初级的人,所以请接受这个事实,一些人试图找到一些有用的东西。可能有更好的选择,这可能违反各地的最佳实践 ec2_模块支持“精确计数”属性,而不仅仅是“计数”属性
它将创建(或终止!)与指定标记匹配的实例(“实例标记”)您可能会发现该模块很有用。您可以创建EC2实例,将其IP地址注册到变量,使用
add\u host
将其添加到内存资源清册中,然后运行设置任务。@Ben Whaley。恐怕我已经有了那个角色(它隐藏在aws角色中)。我的问题不是将实例添加到主机,而是确保只为相关主机组(由--limit模式选择的主机组)创建实例。事实上,我已经得出结论,我想用的方法目前是不可能的,并且采用了不同的方法。我很快会发布一个答案。