如何使用Ansible在主机上安装多个服务实例?

ras*_*ebo 3 ansible

我有一个主机,我想多次安装相同的服务,但具有不同的路径,服务名称等(可以通过变量配置的东西).

我通常不会为此使用相同的主机,但这是一个特殊的用例场景,我无法更改架构.

使用Ansible(我已经在使用2.0)的最佳方法是什么?

udo*_*dan 7

鉴于您有安装应用程序的角色,您可以使用滚动参数来配置所有移动的部分.

- role: cool-app
  location: /some/path/A
  config:
    some: stuff

- role: cool-app
  location: /some/path/B
  config:
    some: other stuff
Run Code Online (Sandbox Code Playgroud)

然后你的角色里面,你可以直接访问{{ location }}{{ config.some }}等.


更具动态性但也更复杂的创建 - 特别是如果您已经具有此工作角色并且现在需要更改它 - 是将所有任务循环到一组实例上.

您可以再次将其作为角色参数传递:

- role: cool-app
  instances:
    - location: /some/path/A
      config:
        some: stuff
    - location: /some/path/B
      config:
        some: other stuff
Run Code Online (Sandbox Code Playgroud)

或者更好地在主机或组中定义它.

然后,每个对于实例唯一的任务都需要遍历instances变量.因此,例如解压缩:

- unarchive:
    src: cool-app.tgz
    dest: "{{ item.location }}"
  with_items: instances
Run Code Online (Sandbox Code Playgroud)


小智 5

除了udondan 的回应之外,还有第三种解决方案。让我们考虑以下目录结构:

host_vars/myapp01.yml
host_vars/myapp02.yml

roles/touch/tasks/main.yml

inventory.yml
play.yml
Run Code Online (Sandbox Code Playgroud)

以及以下文件内容:

# host_vars/myapp01.yml
myvar: myval01

# host_vars/myapp02.yml
myvar: myval02

# roles/touch/tasks/main.yml
- name: touch
  command: touch {{ myvar }}

# inventory.yml
myapp01 ansible_host=192.168.0.1
myapp02 ansible_host=192.168.0.1

# play.yml
- hosts: all
  roles:
    - touch
Run Code Online (Sandbox Code Playgroud)

主意

这个想法是使用应用程序实例名称为主机添加别名(每个应用程序实例一个别名)。在示例中,两个别名(myapp01myapp02)针对同一主机:192.168.0.1。现在,这两个应用程序实例被 ansible 完全视为两个单独的主机,并且:

ansible-playbook play.yml -i inventory.ini
Run Code Online (Sandbox Code Playgroud)

将在主机192.168.0.1上安装应用程序的两个实例(触摸文件myval01myval02)。

优点

例如,该解决方案允许仅在应用程序的一个实例上执行播放:

ansible-playbook play.yml -i inventory.ini --limit myapp01
Run Code Online (Sandbox Code Playgroud)

笔记

两个 DNS 或 IP 地址也可以针对同一台计算机。