使用 Ansible 为每个角色定义 `become=yes'

问题描述 投票:0回答:7

在使用 Ansible 进行系统配置时,我不想在每个任务中指定

become=yes
,因此我在项目主目录中创建了以下 ansible.cfg,Ansible 会自动以 root 身份运行所有内容:

[privilege_escalation]
become = True

但是随着项目不断发展,一些新角色不应该以 root 身份运行。我想知道是否可以在角色内部有一些指令,即该角色内的所有任务都应以 root 身份运行(例如 vars/ 中的某些任务),而不是上面的全局 ansible.cfg 解决方案!

ansible
7个回答
94
投票

我已经找到了解决方案,尽管我认为更好的解决方案应该由 Ansible 团队实施。将 main.yml 重命名为 tasks.yml,然后将以下内容写入 main.yml:

---
- { include: tasks.yml, become: yes }

另一种解决方案是直接在site.yml中传递参数,但问题的主要思想是在其他项目中重用该角色,而不忘记它需要root:

---
- hosts: localhost
  roles:
    - { role: name, become: yes }

60
投票

您还可以将任务包装在一个块中,然后将

become: yes
放在该块上。所以,在你的
roles/role_name/tasks/main.yml
内,你会这样做:

- block:

  - name: Tasks go here as normal
    ...

  become: yes

这将以 root 身份运行块内的所有任务。 Ansible 块的更多详细信息此处最新文档)。


18
投票

这并不是一个根本不同的答案,而是对已经说过的内容进行了表面上的重新格式化。对我来说看起来最短、最干净、最像 YAML:

- name: My play
  hosts: myhosts
  roles:
    - role: role1
      become: yes

    - role: role2

角色 1 将以 root 身份运行,而角色 2 则不会。


4
投票

在 2.4 的 Ansible 文档中,您可以找到定义连接变量的方法,例如 ansible_become

ansible_user
。它们被定义为通常的变量。下面是一个片段。

第一个角色

prepare_user

使用没有提升权限的用户 root 连接到

hosts
。第二个角色
register
使用通过
hosts
设置的
remote_user
连接到
ansible.cfg
(按
定义的顺序
查找;搜索“按以下顺序”)。 --- - hosts: all name: Prepare VMs for cluster roles: - role: prepare_user vars: - ansible_become: false - ansible_user: root - role: register ...



3
投票
become


在底层,Ansible 使用变量

ansible_become

来确定是否使用 Bebe 来完成该任务。在您的角色中,您可以创建一个

defaults/main.yml
并设置
ansible_become: [true/false]
这将导致整个角色接受该值,除非被更高优先级的定义覆盖(了解
变量优先级
很重要) 这里关键的“陷阱”是,如果您使用定义了该角色的角色,它将影响剧中在其下方调用的所有其他角色,除非他们也定义了该角色。

示例:

role_default_become_true

ansible_become: true
默认定义为 true
role_default_become_false
ansible_become: false
默认定义为 true
role_no_default
没有默认
ansible_become

--- - name: test1 hosts: localhost connection: local roles: - role_default_become_true - role_default_become_false - role_no_default - name: test2 hosts: localhost connection: local roles: - role_default_become_false - role_default_become_true - role_no_default - name: test3 hosts: localhost connection: local roles: - role_default_become_false - role_default_become_true - { role: role_no_default, become: false }

在test1中,
role_no_default

会运行而不会成为,因为之前的角色将其定义为false,并且它没有自己的定义。


在test2中,

role_no_default

会以become运行,因为之前的角色将其定义为true,并且它没有自己的定义。


在test3中,

role_no_default

将运行而不会成为,因为它有自己的定义。

    


3
投票
include_task

模块 创建一个

main.yaml

,其中包含带有任务的 yaml

---
- name: main
  include_tasks:
    file: "my_tasks_that_needs_become_true.yaml"
    apply:
      become: true



0
投票

成为一系列导入任务上的_root,以分隔角色中的文件。

角色/my_fav_role/main.yml

--- name: block to perform tasks defined below as root become: true block: - import_tasks: task_file1.yml - import_tasks: task_file2.yml

角色/my_fav_role/task_file1.yml

--- - name: example task debug: msg: "yay"

另请参阅:

    ansible 文档 - 导入与包含
© www.soinside.com 2019 - 2024. All rights reserved.