Amazon ec2 Ansible ec2仅提供所需的服务器

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: -

我有一本基本的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
[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模式选择的主机组)创建实例。事实上,我已经得出结论,我想用的方法目前是不可能的,并且采用了不同的方法。我很快会发布一个答案。