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

时间:2016-01-20 13:51:34

标签: ansible

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

- role: cool-app
  location: /some/path/B
  config:
    some: other stuff

然后在您的角色中,您可以直接访问{{ location }}{{ config.some }}等。

创建一点动态但也更复杂 - 特别是如果你已经有了这个工作角色并且现在需要改变它 - 就是在一组实例上循环所有任务。

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

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

或者更好地在您的主机或群组中定义它。

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

- unarchive:
    src: cool-app.tgz
    dest: "{{ item.location }}"
  with_items: instances

答案 1 :(得分:0)

除了udondan's response那里 是第三种解决方案。让我们考虑以下目录结构:

host_vars/myapp01.yml
host_vars/myapp02.yml

roles/touch/tasks/main.yml

inventory.yml
play.yml

以及以下文件内容:

# 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

想法

这个想法是使用应用程序实例名称为主机命名(每个实例一个别名) 应用)。在示例中,两个别名( myapp01 myapp02 )以相同的目标 主机: 192.168.0.1 。现在,这两个应用程序实例由 完全可以作为两个单独的主机使用:

ansible-playbook play.yml -i inventory.ini

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

优势

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

ansible-playbook play.yml -i inventory.ini --limit myapp01

注意

两个DNS或IP地址也可以定位到同一台计算机。

相关问题