每个组使用一个角色并将主机分配给一个组两次
Using a role per group and assign a host twice to a group
在我的环境中,我有多个类似的主机和一个使用组来分组角色的剧本,例如 icinga、wordpress、gitlab、nginx、generic-php、java 等。每个角色都是实际上是一个 docker-compose 环境,它在服务器上的特定位置扮演角色,例如 /srv/docker/<service>/docker-compose.yml
。此路径在角色内部描述。
此服务可以有多个实例,每个客户端一个或多个。因为我不关心位置(使用哪个服务器),所以主机可能会被分配两次角色。可能有 f.e。角色 "wordpress" 多次。也许 Wordpress 是一个不好的例子,但是以通用的 php 为例,它包含一个 HTTP 服务并在其中执行 index.php。
因为服务是 Ansible 中的角色,每个角色都有一个组,例如:
- name: Install ReverseProxies
hosts: reverseproxies
roles:
- docker_reverseproxy
当我查看 inventory.yaml 喜欢
reverseproxies:
hosts:
server1:
server2:
所以我有一个问题。我怎样才能将组分配给一个角色两次。我知道如何将角色分配给主机或组两次,但是我如何将组分配给主机两次并定义 "differences" 之类的 customerId?我想念什么?这里的最佳做法是什么?
库存中的理想情况是这样的(稍后在动态库存中为 JSON)
reverseproxies:
hosts:
server1:
customerId: 1
server1:
customerId: 2
server2:
一个选项是:更改他们验证某些主机特定变量的角色。所以这将是一个示例剧本:
...
myservice:
hosts:
server1:
service_data:
customer1:
port: 1080
customer2:
port: 1081
server2:
service_data:
customer3:
port: 1080
...
并在角色内部迭代 service_data
var
- name: Configure Service instances
include_tasks: manage_service.yml
loop: "{{ service_data | default({}) | dict2items }}"
tags:
- docker
- service
包含的任务然后与 item
一起使用,或者您可以将其重命名为 loop_control
和 loop_var
。
- name: Define location
set_fact:
instance: "{{ item }}"
service_path: "{{ service.base_dir }}/{{ item.key }}"
tags:
- docker
- service
- name: Create "service" directory
file:
path: "{{ service_path }}"
state: directory
tags:
- docker
- service
- name: Copy "service" docker-compose folder
template: src={{template.src}} dest={{template.dest}} owner={{template.owner}} group={{template.group}} mode={{template.mode}}
with_items:
- { src: "docker-compose.yml.j2", dest: "{{ service_path }}/docker-compose.yml", owner: 'root', group: 'root', mode: '0640' }
loop_control:
loop_var: template
tags:
- docker
- service
....
该角色现在应该为每个 customerId 列表创建目录等,这应该会生成唯一的 docker-compose 具有唯一且独立的环境的路径:
/srv/docker/service/customer1/docker-compose.yml
/srv/docker/service/customer2/docker-compose.yml
/srv/docker/<service>/<customerId>/docker-compose.yml
...
在我的环境中,我有多个类似的主机和一个使用组来分组角色的剧本,例如 icinga、wordpress、gitlab、nginx、generic-php、java 等。每个角色都是实际上是一个 docker-compose 环境,它在服务器上的特定位置扮演角色,例如 /srv/docker/<service>/docker-compose.yml
。此路径在角色内部描述。
此服务可以有多个实例,每个客户端一个或多个。因为我不关心位置(使用哪个服务器),所以主机可能会被分配两次角色。可能有 f.e。角色 "wordpress" 多次。也许 Wordpress 是一个不好的例子,但是以通用的 php 为例,它包含一个 HTTP 服务并在其中执行 index.php。
因为服务是 Ansible 中的角色,每个角色都有一个组,例如:
- name: Install ReverseProxies
hosts: reverseproxies
roles:
- docker_reverseproxy
当我查看 inventory.yaml 喜欢
reverseproxies:
hosts:
server1:
server2:
所以我有一个问题。我怎样才能将组分配给一个角色两次。我知道如何将角色分配给主机或组两次,但是我如何将组分配给主机两次并定义 "differences" 之类的 customerId?我想念什么?这里的最佳做法是什么?
库存中的理想情况是这样的(稍后在动态库存中为 JSON)
reverseproxies:
hosts:
server1:
customerId: 1
server1:
customerId: 2
server2:
一个选项是:更改他们验证某些主机特定变量的角色。所以这将是一个示例剧本:
...
myservice:
hosts:
server1:
service_data:
customer1:
port: 1080
customer2:
port: 1081
server2:
service_data:
customer3:
port: 1080
...
并在角色内部迭代 service_data
var
- name: Configure Service instances
include_tasks: manage_service.yml
loop: "{{ service_data | default({}) | dict2items }}"
tags:
- docker
- service
包含的任务然后与 item
一起使用,或者您可以将其重命名为 loop_control
和 loop_var
。
- name: Define location
set_fact:
instance: "{{ item }}"
service_path: "{{ service.base_dir }}/{{ item.key }}"
tags:
- docker
- service
- name: Create "service" directory
file:
path: "{{ service_path }}"
state: directory
tags:
- docker
- service
- name: Copy "service" docker-compose folder
template: src={{template.src}} dest={{template.dest}} owner={{template.owner}} group={{template.group}} mode={{template.mode}}
with_items:
- { src: "docker-compose.yml.j2", dest: "{{ service_path }}/docker-compose.yml", owner: 'root', group: 'root', mode: '0640' }
loop_control:
loop_var: template
tags:
- docker
- service
....
该角色现在应该为每个 customerId 列表创建目录等,这应该会生成唯一的 docker-compose 具有唯一且独立的环境的路径:
/srv/docker/service/customer1/docker-compose.yml
/srv/docker/service/customer2/docker-compose.yml
/srv/docker/<service>/<customerId>/docker-compose.yml
...