我有 1 台虚拟机,上面有多个应用程序。每个应用程序都在自己的用户下运行。
host:
– host1
users:
– app1
– app2
它们有相似的配置文件,不同之处在于名称和一些敏感数据。那么,有没有办法使用 ansible 在 1 个主机上并行为多个用户运行 1 个任务。
像这样。
存货:
[webservers:children]
app1
app2
[app1]
127.0.0.1
[app2]
127.0.0.1
group_vars/app1/vars.yml:
---
app_user: app1
var2: value
group_vars/app2/vars.yml:
---
app_user: app2
var2: value
任务/测试.yml:
---
- hosts: webservers
tasks:
- name: Copy config
become: true
become_user: {{ app_user }}
template: ....
因此,以这种方式调用任务仅适用于第一个应用程序。我知道我可以为每个 app_user 制作一个剧本,或者为每个 app_user 编写一个包含一系列任务的剧本,但是有没有办法做我想做的事情?
答案1
这是行不通的,因为:
在任何部分中,重新定义 var 都会覆盖前一个实例。如果多个组具有相同的变量,则最后加载的组将获胜。如果您在 play 的 vars: 部分中两次定义变量,则第二次将获胜。
Ansible 文档:playbooks_variables
app_user
据我了解,下的文档group_vars/app2/vars.yml
应该覆盖app_user
下的group_vars/app1/vars.yml
。
应该做的是在单独的剧中调用每个主机组:
---
- hosts: app1
tasks:
- name: Copy config
become: true
become_user: {{ app_user }}
template: ....
- hosts: app2
tasks:
- name: Copy config
become: true
become_user: {{ app_user }}
template: ....
还:
使用 becom_user 执行任务不是必需的,也不是一个好的做法template
。使用模板模块如下:
---
- hosts: app1
tasks:
- name: Copy config
template:
src: template.j2
dest: /some/remote/path
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: 0755
答案2
我会尝试创建一个角色并多次调用它,并给出不同的变量(用户)。
--- - 主机:网络服务器 角色: - 常见的 - { 角色:foo_app_instance, 目录:'/opt/a', app_port:5000 } - { 角色:foo_app_instance, 目录:'/opt/b', app_port:5001 }
取自这里这样你就可以重用你的代码(如果任务确实相似的话)。