1

我有一个基本的 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 servers 任务可以满足您的期望。它创建一个 ec2 实例;它还创建一个主机组 [webservers] 并将创建的实例 IP 添加到其中。

配置 {{ application_name }} 服务器步骤然后配置该服务器,安装我需要的一切。

到目前为止一切顺利,这一切都完全符合我的要求,一切似乎都有效。

这就是我卡住的地方。我希望能够为不同的角色启动一个 ec2 实例。理想情况下,我会创建一个数据库服务器、一个网络服务器,也许还有一个 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 实例,要么只是创建一个实例并在其上安装所有东西。

4

2 回答 2

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 而不会出现 no hosts match 错误。

包装剧本非常简单,只是:

---

- name: Deploy all the {{ application_name }} things!
  hosts: all

- include: webservers.yml
- include: apiservers.yml

对于ansible,我非常是一个初学者,所以请务必接受这个,有些人试图找到有效的东西。可能有更好的选择,这可能会违反所有地方的最佳实践。

于 2014-12-19T11:30:34.663 回答
1

ec2_module 支持“exact_count”属性,而不仅仅是“count”属性。

它将创建(或终止!)匹配指定标签(“instance_tags”)的实例

于 2015-03-13T12:40:44.370 回答