6

我正在尝试制作一些 Ansible 剧本,这些剧本将提供一个环境(n 个数据库、m 个 Web 服务器等)并保存这些主机以供以后使用,以便我可以针对它们运行部署。我能想到的最好的方法是https://gist.github.com/geowa4/7686681(复制如下)。这是因为它为各种服务器类型创建机器并将它们保存到主机文件中。我将使用新生成的 hosts 文件的部署脚本确保在部署源代码之前正确安装和配置了正确的包。这是使用 Ansible 完成配置和部署的唯一方法吗?如果我想动态添加一个新的 Web 服务器怎么办?我必须手动编辑静态主机文件吗?到目前为止,使用 Rackspace 的动态清单脚本,它只是列出了一大堆服务器,无法按类型对它们进行分组。如果我能得到它,我会欣喜若狂。

主机.j2:

[a]
{% for a in a_provision.instances %}
{{ a.rax_accessipv4 }}
{% endfor %}

[b]
{% for b in b_provision.instances %}
{{ b.rax_accessipv4 }}
{% endfor %}

主要.yml:

---
- name: a - build request
  local_action:
    module: rax
    username: username
    api_key: key
    name: test-a
    count: 1
    flavor: 3
    image: a-image-id
    files:
      /root/.ssh/authorized_keys: ~/.ssh/id_rsa.pub
    state: present
    wait: yes
    wait_timeout: 1000
    networks:
    - private
    - public
  register: a_provision

- name: b - build request
  local_action:
    module: rax
    username: username
    api_key: key
    name: test-b
    flavor: 5
    image: b-image-id
    files:
      /root/.ssh/authorized_keys: ~/.ssh/id_rsa.pub
    state: present
    wait: yes
    wait_timeout: 1000
    networks:
    - private
    - public
  register: b_provision

- name: add new nodes to hosts configuration
  template: 'src=hosts.j2 dest=provisioned_hosts'
4

1 回答 1

5

最近版本的 Ansible(我使用的是 1.4.1)中的 Rackspace 模块和动态清单确实可以让您对服务器进行分组!

rax模块接受存储在创建的服务器元数据中的“组”参数,然后 Rackspace 动态库存插件将提取该参数以创建 Ansible 组,因此后续播放可以使用您指定的组名称。

但是,看起来库存只在播放开始时被查询。要在同一运行中使用新启动的服务器,您需要使用add-host模块在运行时将它们添加到清单中:

- name: build webservers
  local_action:
    module: rax
    name: webserver
    group: webservers
    exact_count: true
    credentials: ~/.rackspace_cloud_credentials
    flavor: 2
    image: df27d481-63a5-40ca-8920-3d132ed643d9
    files:
      /root/.ssh/authorized_keys: ~/.ssh/id_rsa.pub
    state: present
    disk_config: manual
    wait: yes
    wait_timeout: 10000
  register: webserversvar

- name: add newly provisioned webservers to a group
  local_action: add_host hostname={{ item.accessIPv4 }} groupname=webservers
  with_items: webserversvar.instances

- name: build databases
  local_action:
    module: rax
    name: database
    group: databases
    exact_count: true
    credentials: ~/.rackspace_cloud_credentials
    flavor: 2
    image: df27d481-63a5-40ca-8920-3d132ed643d9
    files:
      /root/.ssh/authorized_keys: ~/.ssh/id_rsa.pub
    state: present
    disk_config: manual
    wait: yes
    wait_timeout: 10000
  register: databasesvar

- name: add newly provisioned databases to a group
  local_action: add_host hostname={{ item.accessIPv4 }} groupname=databases
  with_items: databasesvar.instances

一篇关于在 AWS 上执行此操作的文章,其中涵盖了许多相同的高级概念,即使提供者不同。

于 2013-12-02T19:56:10.827 回答