Ansible ec2仅提供所需的服务器

时间:2014-09-11 17:50:06

标签: 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:
    - 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实例,要么只创建一个实例并在其上安装所有内容。

2 个答案:

答案 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”)