【问题标题】:Ansible ec2 only provision required serversAnsible ec2 仅提供所需的服务器
【发布时间】:2014-09-11 17:50:05
【问题描述】:

我有一个这样的基本 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 实例。理想情况下,我会创建一个数据库服务器、一个网络服务器,也许还有一个 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 实例,要么只是创建一个实例并在其上安装所有内容。

【问题讨论】:

  • 您可能会发现add_host 模块很有用。您可以创建 EC2 实例,将其 IP 地址注册到变量,使用 add_host 将其添加到内存清单中,然后运行您的配置任务。
  • @Ben Whaley。恐怕我已经有了那部分(它隐藏在 aws 角色中)。我的问题不是将实例添加到主机,而是确保仅为相关主机组(由 --limit 模式选择的主机组)创建实例。我实际上已经得出结论,我想要的方式目前是不可能的,并采用了不同的方法。我会尽快发布答案。

标签: amazon-ec2 ansible ansible-playbook ansible-inventory


【解决方案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 的初学者,所以请务必接受这个,有些人试图找到有效的东西。可能有更好的选择,这可能会违反所有地方的最佳实践。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多