ansible—在3台不同的计算机上部署3层应用程序

ansible—在3台不同的计算机上部署3层应用程序,ansible,ansible-playbook,Ansible,Ansible Playbook,我有一个基本的应用程序: -db -api(连接到数据库) -前端(连接到http api) 我希望这3个服务在3台不同的机器上运行。我使用ansible来执行此操作,但我不太确定如何定义环境变量,以便每个层都知道如何连接到底层 api需要DB_主机和DB_端口连接到DB。它还需要提供一个端口供自己使用 前端需要API_主机和API_端口连接到API。它还需要提供一个端口供自己使用 inventory.ini [www] 192.168.1.120 [api] 192.168.1.120

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

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

  • api需要DB_主机和DB_端口连接到DB。它还需要提供一个端口供自己使用

  • 前端需要API_主机和API_端口连接到API。它还需要提供一个端口供自己使用

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
注意:对于我的测试,我只使用一台vagrant VM,但这三台机器在生产中是不同的

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)

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

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

- 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}}" }

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

- 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}}" }

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

- 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}}" }

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

- 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}}" }

我想你可以做一些重构。在你的库存文件中有变量通常是反对可接受的最佳价格的。本页介绍了剧本的最佳布局

此外,在清单文件
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收集的其他事实,看看是否有适合您的用例的东西。

我认为您可以进行一些重构。在你的库存文件中有变量通常是反对可接受的最佳价格的。本页介绍了剧本的最佳布局

此外,在清单文件
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收集的其他事实,看看是否有适合您的用例的东西。

我认为您可以进行一些重构。在你的库存文件中有变量通常是反对可接受的最佳价格的。本页介绍了剧本的最佳布局

此外,在清单文件
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收集的其他事实,看看是否有适合您的用例的东西。

我认为您可以进行一些重构。在你的库存文件中有变量通常是反对可接受的最佳价格的。本页介绍了剧本的最佳布局

此外,在清单文件
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收集的其他事实,看看是否有适合您的用例的东西