在不同的主机上执行Ansible任务

tgc*_*oud 4 ansible ansible-playbook

我创建了一个角色,我已经定义了所有的ansible任务.此外,我在库存中有主机A和主机B. 是否可以在主机A上执行90%的任务,在主机B上执行10%的任务?我的Ansible控制器是主机C.

Xio*_*iov 11

如果你在两个不同主机之间分配一个角色中的所有任务,那么这些主机中都没有真正具有该角色,是吗?我说这是滥用角色系统,当你真的有两个任务时,将所有这些任务集中到一个角色.

如果您有多个主机As,会发生什么?多个主机B怎么样?

在我看来,你实际上并不想在这里使用一个角色 - 你只想使用一个简单的''剧本.

- hosts: A
  tasks:
    [...]

- hosts: B
  tasks:
    [...]
Run Code Online (Sandbox Code Playgroud)

Playbooks用于按特定顺序定义一系列动作,而且"只有在A上执行此操作后才能在B上执行此操作"就是这样.

  • 我倾向于同意,但是从理论上讲,您可以设计一个角色来设置Hadoop集群,并且您需要在主服务器和从服务器上运行不同的任务。这不仅包括配置管理,还包括基础架构部署,但在Ansible中受支持。 (2认同)

Mil*_*eek 6

我能想到的第一种方法是使用基于库存的条件.

在库存中为A创建一个组,为B创建一个组.我将这些组称为group_A和group_B

# inventory
[group_A]
192.168.1.20

[group_B]
192.168.1.30
Run Code Online (Sandbox Code Playgroud)

然后在你的任务上使用条件

- name: run this on A
  debug: msg="this runs only on A
  when: "'group_A' in {{group_names}}"

- name: run this on B
  debug: msg="this runs only on B
  when: "'group_B' in {{group_names}}"
Run Code Online (Sandbox Code Playgroud)

根据您拥有的任务数量,为每个任务设置条件可能太多,因此您可以在包含上使用条件,如下所示:

文件结构:

-tasks
|- main.yml
|- A_tasks.yml
|- B_tasks.yml
Run Code Online (Sandbox Code Playgroud)

main.yml:

- include: A_tasks.yml
  when: "'group_A' in {{group_names}}"
- include: B_tasks.yml
  when: "'group_B' in {{group_names}}"
Run Code Online (Sandbox Code Playgroud)

A_tasks.yml:

- name: run on A
  debug: msg="this only runs on A"
Run Code Online (Sandbox Code Playgroud)

B_tasks.yml:

- name: run on B
  debug: msg="this only runs on B"
Run Code Online (Sandbox Code Playgroud)

  • 这可能在旧版本的Ansible中正常工作,但至少从版本2.4.2.0开始,条件应该是"when:"group_names中的'group_A'". (2认同)