我有一个主机,我希望多次安装相同的服务,但使用不同的路径,服务名称等(可以通过变量配置的东西)。
我通常不会使用相同的主机,但这是一个特殊的用例场景,我无法改变架构。
使用Ansible(我已经在使用2.0)的最佳方法是什么?
答案 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地址也可以定位到同一台计算机。