在使用 Ansible 进行系统配置时,我不想在每个任务中指定
become=yes
,因此我在项目主目录中创建了以下 ansible.cfg,Ansible 会自动以 root 身份运行所有内容:
[privilege_escalation]
become = True
但是随着项目不断发展,一些新角色不应该以 root 身份运行。我想知道是否可以在角色内部有一些指令,即该角色内的所有任务都应以 root 身份运行(例如 vars/ 中的某些任务),而不是上面的全局 ansible.cfg 解决方案!
我已经找到了解决方案,尽管我认为更好的解决方案应该由 Ansible 团队实施。将 main.yml 重命名为 tasks.yml,然后将以下内容写入 main.yml:
---
- { include: tasks.yml, become: yes }
另一种解决方案是直接在site.yml中传递参数,但问题的主要思想是在其他项目中重用该角色,而不忘记它需要root:
---
- hosts: localhost
roles:
- { role: name, become: yes }
这并不是一个根本不同的答案,而是对已经说过的内容进行了表面上的重新格式化。对我来说看起来最短、最干净、最像 YAML:
- name: My play
hosts: myhosts
roles:
- role: role1
become: yes
- role: role2
角色 1 将以 root 身份运行,而角色 2 则不会。
在 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
...
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
将运行而不会成为,因为它有自己的定义。
成为一系列导入任务上的_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
:
---
- name: example task
debug:
msg: "yay"
另请参阅: