Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 如何切换每个任务或一组任务的用户?_Ansible - Fatal编程技术网

Ansible 如何切换每个任务或一组任务的用户?

Ansible 如何切换每个任务或一组任务的用户?,ansible,Ansible,ansible剧本中经常出现的一个主题是,我经常必须以sudo权限执行命令(sudo:yes),因为我想为某个用户执行命令。理想情况下,我更愿意使用sudo切换到该用户并正常执行命令。因为这样我就不必执行我通常的post命令清理,比如chowning目录。以下是我的一本剧本中的一个片段: - name: checkout repo git: repo=https://github.com/some/repo.git version=master dest={{ dst }} sudo:

ansible剧本中经常出现的一个主题是,我经常必须以sudo权限执行命令(
sudo:yes
),因为我想为某个用户执行命令。理想情况下,我更愿意使用sudo切换到该用户并正常执行命令。因为这样我就不必执行我通常的post命令清理,比如chowning目录。以下是我的一本剧本中的一个片段:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
- name: change perms
  file: dest={{ dst }} state=directory mode=0755 owner=some_user
  sudo: yes

理想情况下,我可以作为不同的用户运行命令或命令集,即使它需要sudo来su给该用户。

解决方案是使用
include
语句和
remote\u user
var(在此处描述:),但必须在playbook而不是任务级别执行。

使用Ansible 1.9或更高版本 Ansible使用
been
been\u user
been\u方法
指令实现权限提升。您可以将它们应用于整个剧本或剧本,在包含的剧本中设置它们,或为特定任务设置它们

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user
您可以使用
been_with
指定如何实现权限提升,默认为
sudo

该指令在使用它的块的范围内有效()

有关其他示例和更详细的文档,请参阅

除了任务范围内的
been
been_user
指令外,Ansible 1.9还添加了一些新变量和命令行选项,以便在没有明确指令的情况下,在播放期间设置这些值:

  • 对于等效的
    变成
    /
    变成用户
    指令
  • 可以按主机或组设置
从Ansible 2.0.2.0开始,下面描述的较旧的
sudo
/
sudo\u用户
语法仍然有效,但弃用通知指出,“此功能将在未来版本中删除。”


以前的语法,自Ansible 1.9起已弃用并计划删除:
在Ansible>1.4中,您实际上可以在任务级别指定一个远程用户,该用户应允许您以该用户的身份登录并执行该命令,而无需求助于sudo。如果您不能以该用户的身份登录,那么sudo_用户解决方案也会起作用

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

请参见Ansible 2.x中的

,您可以对任务组使用

- block:
    - name: checkout repo
      git:
        repo: https://github.com/some/repo.git
        version: master
        dest: "{{ dst }}"
    - name: change perms
      file:
      dest: "{{ dst }}"
      state: directory
      mode: 0755
      owner: some_user
  become: yes
  become_user: some user

您可以指定
been_method
以覆盖在
ansible.cfg
中设置的默认方法(如果有),该方法可以设置为
sudo、su、pbrun、pfexec、doas、dzdo、ksu
之一

- name: I am confused
  command: 'whoami'
  become: true
  become_method: su
  become_user: some_user
  register: myidentity

- name: my secret identity
  debug:
    msg: '{{ myidentity.stdout }}'
应该显示

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}

要从变量中指定sudo_用户,请在变量模板周围使用引号,如-
sudo_用户:“{{ansible\u ssh_user}}”
,否则会出现yaml语法错误。很好。我试图尽可能地匹配OP对问题的表述,但我同意使用变量插值将是最常见的选择。从Ansible 1.9开始,它取代了“sudo*”。1.9+语法表示“Been”是正确的。您可能还希望选中“变成方法”,因为“su”有时可能比默认的“sudo”更好,这取决于您的系统设置。
添加了新的Ansible变量和命令行选项,以在播放期间设置这些值
@Brett那么这是否意味着在此之后的后续任务将由
某个用户运行,而不是由用于连接主机的原始用户
远程用户运行,对吗?对于上述用例,这不是一个好的解决方案。然而,我很长时间没有意识到这个解决方案。我想我只能包含角色。这是在你没有sudo特权的情况下最好的解决方案
TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}