我有一个像这样的基本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实例。理想情况下,我会创建一个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实例,要么只创建一个实例并在其上安装所有内容。
答案 0 :(得分:1)
最后,我意识到将堆栈的不同部分分成单独的剧本更为有意义,并使用一个称为每个剧本的全栈剧本。
我的远程主机文件与上面大致相同。用于堆栈特定部分的一个剧本的示例是:
---
- 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)然后能够排除localhost而不会得到没有主机匹配错误。
包装剧本很简单,只是:
---
- name: Deploy all the {{ application_name }} things!
hosts: all
- include: webservers.yml
- include: apiservers.yml
我非常关心ansible的初学者,所以请把它当作是什么,有些人试图找到有用的东西。可能有更好的选择,这可能违反了整个地方的最佳做法。
答案 1 :(得分:1)
ec2_module支持“exact_count”属性,而不仅仅是“count”属性。
它将创建(或终止!)与指定标签匹配的实例(“instance_tags”)