Ansible中的角色重写

Ansible中的角色重写,ansible,Ansible,我已经走了很长一段路,想看看如何解决这个问题,我很快就会概述这个问题。我知道有包含、变量和默认值,但我无法掌握实现以下内容的最佳方法: 默认值 一本剧本(site.yml) 它定义了3个角色:role1、role1和role3,文件的布局如下 - site.yml - roles - role1 - tasks - main.yml - role2 - tasks - main.yml - role3

我已经走了很长一段路,想看看如何解决这个问题,我很快就会概述这个问题。我知道有包含、变量和默认值,但我无法掌握实现以下内容的最佳方法:

默认值 一本剧本(site.yml)

它定义了3个角色:role1、role1和role3,文件的布局如下

- site.yml
  - roles
    - role1
      - tasks
        - main.yml
    - role2
      - tasks
        - main.yml
    - role3
      - tasks
        - main.yml
这在大多数情况下作为默认场景运行(未传递变量)

变化 现在想象一下,我还有两个稍微偏离默认值的场景。通过传入一个变量(比如
test\u type=1
)触发该场景。在每个场景中,我仍然希望运行所有3个角色,但在场景1中,我希望角色1的逻辑不同,在场景2中,角色2的代码不同

因此,如果我运行我的场景#1,我将得到:

custom role1, role2, role3
对于场景2:

我能够将可选的
role1
role2
文件夹输出到单独的位置,但在哪里?组织这样的事情最好的方法是什么


一般来说,我希望继承我的默认场景,只覆盖我需要的内容,同时保留大部分未触及的逻辑

在我看来,如果您的角色根据输入的不同而表现不同,那么应该在角色级别执行。一种方法是在角色下的defaults/main.yml中定义一个默认变量:

测试类型:0


然后,如果没有传入任何变量,它可以使用默认值。如果您传入一个值,那么角色可以根据传入的内容执行附加逻辑。

是!有可能按我的要求去做。这里有一种方法:

首先-不要将默认角色放在
ansible/roles
位置。将
角色
重命名为其他角色,如
默认角色
。这很重要,我在下面描述的内容将不起作用,因为在默认情况下,
ansible/roles
似乎是不变的,ansible将首先查找角色

在其他位置放置替代角色。如果需要多个备选方案,则需要创建多个位置。例如,您可能会得到如下结果:

- site.yml
  - default_roles
    - role1
      - tasks
        - main.yml
    - role2
      - tasks
        - main.yml
    - role3
      - tasks
        - main.yml
  - test1_roles
    - role2
      - tasks
        - main.yml
  - test2_roles
    - role3
      - tasks
        - main.yml
现在,当您运行普通命令
ansible playbook site.yml
时,将出现错误
未找到角色“role1”
,但请尝试以下操作:
ansible\u ROLES\u PATH=default\u ROLES ansible playbook site.yml
。你的剧本在运行。幸运的是,
ANSIBLE\u ROOT\u路径
可以有多个位置。因此,如果您执行
ANSIBLE\u ROLES\u PATH=test1\u ROLES:default\u ROLES ANSIBLE playbook site.yml
,您将看到
role2
现在将从
test1\u ROLES
文件夹中选择。这里的关键是将替代位置放在默认位置之前

同样的变量可以在
ansible.cfg
中设置为
roles\u path=foo:bar:zoo
,但是设置环境变量似乎更具动态性,适合我的情况

此外,它不需要将
test1\u角色
文件夹与
default\u角色
放在同一级别上。它可以在任何地方,您可以使用绝对路径或相对路径指向它。例如
ANSIBLE\u ROLES\u PATH=../test1/ROLES:default\u ROLES ANSIBLE playbook site.yml

重要提示:我(到目前为止)无法提供
roles\u path
,除了我在这里显示的方式。在playbook中提供命令行变量或设置变量没有帮助,因为这是配置变量,必须应用于ansible进程本身


如果有人有更优雅的方式来做这件事,我会很高兴看到的

谢谢,但这不是我想要的。我不希望同一个角色的行为有所不同,我希望根据角色名称使用不同的角色来代替原来的角色
role1, custom roile2, role3
- site.yml
  - default_roles
    - role1
      - tasks
        - main.yml
    - role2
      - tasks
        - main.yml
    - role3
      - tasks
        - main.yml
  - test1_roles
    - role2
      - tasks
        - main.yml
  - test2_roles
    - role3
      - tasks
        - main.yml