首页 文章

Ansible ec2仅提供所需的服务器

提问于
浏览
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服务器任务可以满足您的期望 . 它创建了一个ec2实例;它还创建一个主机组[webservers]并将创建的实例IP添加到它 .

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

到目前为止一切都很好,这一切都完全符合我的要求,一切似乎都有效 .

这就是我被困住的地方 . 我希望能够为不同的角色启动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 回答

  • 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

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

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

相关问题