1

我正在尝试构建一个简单的逻辑,其中在框/实例(A 和 B)中与 sudo 相同的用户,但在实例(C 和 D)中将其作为普通用户。

我有is_sudo一个布尔变量,我正在检查它是否为真,然后让用户进入 sudoers,如果整个设置中的条件相同,它就可以完美运行。现在我想有一些条件,如果实例是 C 或 D,那么用户应该被创建为普通用户。我正在考虑覆盖 dict 变量值以在这些实例上将其设置为 false,但似乎不可能动态覆盖 dict 变量。

例子:

var/main.yml [来自用户更新角色]

users:
  - username: user1
    is_sudo: true
  - username: user2
    is_sudo: false

主机1.yml

roles:
  - userupdate
vars:
  users:
    username: user1
    is_sudo: false

如果有什么快点?

4

1 回答 1

2

查看了解变量优先级。( play varsprecedence 12.) 不会覆盖role vars (defined in role/vars/main.yml)(precedence 15)。关于如何覆盖还有更多选项role vars。例如,使用role params(优先级 20)。请参阅在游戏级别使用角色

    roles:
      - role: userupdate
        users:
          - username: user1
            is_sudo: false

笔记

  • 这是如何在播放级别覆盖角色变量的唯一选项。其他选项(优先级 16、17、18、19)位于任务级别。

  • 正确角色的目录vars不是var. 评论应该是# cat vars/main.yml [from userupdate role]

  • 变量users是一个列表。这也不应该即时更改。

  • 该变量users将被覆盖而不是合并。

  • 阅读使用 var #66610 时角色变量泄漏给其他角色中的注释。报价:

以下格式称为role params

roles:
  - role: foo
    foo: bar

而以下是vars

roles:
  - role: foo
    vars:
      foo: bar

合并更新

如果要合并更新,请将结构更改为字典和combine通用和更新。例如

shell> cat roles/userupdate/vars/main.yml
users_common:
  user1:
    is_sudo: true
  user2:
    is_sudo: false
users: "{{ users_common|combine(users_update|default({})) }}"

shell> cat roles/userupdate/tasks/main.yml
- debug:
    var: users

然后调用角色

  roles:
    - role: userupdate
      users_update:
        user1:
          is_sudo: false

  users:
    user1:
      is_sudo: false
    user2:
      is_sudo: false
于 2020-12-15T06:54:24.030 回答