Ansible:在多个用户下在 1 台主机上运行 1 个任务

Ansible:在多个用户下在 1 台主机上运行 1 个任务

我有 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 }

取自这里这样你就可以重用你的代码(如果任务确实相似的话)。

相关内容