我有一个基本的应用程序:
- 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设置,但我无法检索我在清单中设置的变量。 这是处理这个问题的好方法吗? 我应该在其他地方声明这些变量吗?
答案 0 :(得分:2)
我认为你可以做一些重构。在库存文件中包含变量通常是针对Ansible的最优价格。此页面介绍了您的剧本http://docs.ansible.com/playbooks_best_practices.html#content-organization
的最佳布局此外,在您的广告资源文件www
中,api
和db
是组名。
你能做的是:
[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}}" }