ansible - 在3台不同的机器上部署3层应用程序

时间:2015-03-31 19:50:52

标签: ansible ansible-playbook

我有一个基本的应用程序:
- db
- api(连接到数据库)
- 前端(连接到http api)

我希望在3台不同的机器上运行3项服务。我正在使用ansible来执行此操作,但我不太确定如何定义环境变量,因此每个层都知道如何连接到底层变量。

  • api需要DB_HOST和DB_PORT才能连接到DB。它还需要提供一个PORT供自己使用。

  • 前端需要API_HOST和API_PORT才能连接到API。它还需要提供一个PORT供自己使用。

inventory.ini

[www]
192.168.1.120

[api]
192.168.1.120

[db]
192.168.1.120

[myproj:children]
www
api
db

[myproj:vars]
db_host=192.168.1.120      // needed by the api
db_port=27017              // needed by the api
api_host=192.168.1.120     // needed by the front-end
api_port=8000              // needed by the api + front-end
www_port=8001              // needed by the front-end

注意:对于我的测试,我只使用一个流浪汉VM,但3台机器在生产中将是截然不同的。

playbooks.yml

---  
- hosts: db
  sudo: True
  roles:
    - common
    - db
- hosts: api
  sudo: True
  roles:
    - common
    - api
- hosts: www
  sudo: True
  roles:
    - common
    - www

api角色示例:(roles / api / tasks / main.yml)

---
- name: clone api
  git: repo=git@github.com:...

- name: install api packages
  ...

- name: start api 
  sudo: False
  shell: npm start
  args:
    chdir: /var/app
  environment:
    PORT: ???
    DB_HOST: ???
    DB_PORT: ???

我想从hostvars获得DB_HOST / DB_PORT / PORT设置,但我无法检索我在清单中设置的变量。 这是处理这个问题的好方法吗? 我应该在其他地方声明这些变量吗?

2 个答案:

答案 0 :(得分:2)

我认为你可以做一些重构。在库存文件中包含变量通常是针对Ansible的最优价格。此页面介绍了您的剧本http://docs.ansible.com/playbooks_best_practices.html#content-organization

的最佳布局

此外,在您的广告资源文件www中,apidb是组名。 你能做的是:

[www]
web01 ansible_ssh_host=192.168.1.120

[api]
api01 ansible_ssh_host=192.168.1.120

[db]
db01 ansible_ssh_host=192.168.1.120

通过这种方式,您可以使用更友好的名称来引用您的服务器,从而使您的剧本更具可读性。

至于获取,例如数据库IP,您可以使用主机事实来提取它:

{{ hostvars[db01]['ansible_eth0']['ipv4']['address'] }}

或者,如果您想通过索引进入群组:

{{ hostvars[groups['db'][0]]['ansible_eth0']['ipv4']['address'] }}

您应该查看Ansible收集的其他事实,看看是否有适合您的用例。

答案 1 :(得分:1)

不太确定问题是什么,但这就是你要找的东西:

- name: start api 
  sudo: False
  shell: npm start
  args:
    chdir: /var/app
  environment:
    PORT: "{{P_PORT}}"
    DB_HOST: "{{P_DB_HOST}}"
    DB_PORT: "{{P_DB_PORT}}"

包括以下角色:

roles:
  - { role:api, PORT="{{P_PORT}}", DB_HOST="{{P_DB_HOST}}", DB_PORT="{{P_DB_PORT}}" }