我有一个像这样的基本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添加到它 .
配置{}服务器步骤然后配置该服务器,安装我需要的一切 .
到目前为止一切都很好,这一切都完全符合我的要求,一切似乎都有效 .
这就是我被困住的地方 . 我希望能够为不同的角色启动ec2实例 . 理想情况下,我会创建一个dbserver,一个Web服务器,也许还有一个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实例,要么只创建一个实例并在其上安装所有内容 .
2 回答
最后,我意识到将堆栈的不同部分分离成单独的剧本更为有意义,其中有一个称为每个部分的全栈剧本 .
我的远程主机文件与上面大致相同 . 用于堆栈的特定部分的一个剧本的示例是:
这意味着每个层的播放的第一步是向apiservers组添加一个新主机,第二步(配置... apiservers)然后能够排除localhost而不会得到没有主机匹配错误 .
包装剧本很简单,只是:
我非常喜欢ansible的初学者,所以请把它当作是什么,有些人试图找到有用的东西 . 可能有更好的选择,这可能违反了整个地方的最佳做法 .
ec2_module支持“exact_count”属性,而不仅仅是“count”属性 .
它将创建(或终止!)与指定标记匹配的实例(“instance_tags”)