Ansible 复制模块并成为 - 权限被拒绝

atb*_*ker 4 linux permissions ansible

我正在运行一个 ansible 脚本来localhost将文件夹复制到另一个位置。然而,

- name: Copy Network
  become: yes
  become_user: root
  copy:
    src: /d/
    dest: "/dest/d/"
    mode: 0644
  tags: [network]
Run Code Online (Sandbox Code Playgroud)

正在给我[Errno 13] Permission denied: b'd/f1'。我期望become_user能让命令以 root 身份执行,但没有成功。该文件的权限是0600(root:root).

您能给我指点一下如何使用 ansible 访问该文件并复制它吗?

笔记:

  • sudo ansible-playbook p.ymlsudo工作完美,但是,如果不需要,我不想与 ansible 命令一起使用,并且 ansible 有一个技巧。

  • command: cp -r /d/ /dest/d/sudo无需附加到 ansible 命令 ( )即可工作ansible-playbook p.yml。但是,如果我可以帮助它,我不想使用command它,因为幂等性和copy模块具有mode任务所需的选项。

Vla*_*tka 9

更新:如果您可以将权限升级为本地主机上的root,解决方案是设置remote_src: true(信用@ivandov)

- copy:
    src: /d/
    dest: /dest/d/
    mode: '0644'
    remote_src: true
  become: true
  become_user: root
Run Code Online (Sandbox Code Playgroud)

以下详细信息描述了您无法升级到本地主机上的 root 的情况。给定本地主机上的文件

shell> ll /tmp/test/d/f1
-rw-r----- 1 root root 0 Aug 25 23:23 /tmp/test/d/f1
Run Code Online (Sandbox Code Playgroud)

模块副本按预期工作

- copy:
    src: /tmp/test/d/
    dest: /tmp/test/dest/
  become: true
  become_user: root
Run Code Online (Sandbox Code Playgroud)

首先,它尝试读取文件但失败

致命:[localhost]:失败!=> msg: '尝试读取文件 ''/tmp/test/d/f1'' 时发生错误: [Errno 13] 权限被拒绝: b''/tmp/test/d/f1''。[Errno 13] 权限被拒绝:b''/tmp/test/d/f1'''

默认情况下,模块复制将文件从src(要复制到远程服务器的文件的本地路径)复制到dest(文件应复制到的远程绝对路径)。在这种情况下,become: true意味着 Ansible 会提升远程主机上的权限,但不会提升本地主机上的权限。尽管该任务在本地主机上运行,​​即主主机和远程主机都是本地主机,但remote_src: true该设置become: true仅适用于写入文件而不适用于读取文件。如果您无法在 localhost 设置上升级到 rootremote_src: true

- copy:
    src: /tmp/test/d/
    dest: /tmp/test/dest/
    remote_src: true
  become: true
  become_user: root
Run Code Online (Sandbox Code Playgroud)

将失败

致命:[localhost]:失败!=> 更改=假 ansible_facts: Discover_interpreter_python: /usr/bin/python3 module_stderr: |- sudo: 需要密码 module_stdout: '' msg: |- MODULE FAILURE 请参阅 stdout/stderr 以了解确切的错误 rc: 1


问:“有什么解决办法吗?”

答:如果不升级到根目录,就没有解决方法。这会侵犯文件的所有权和权限。例如,给定控制器上的文件

shell> ll f1
-rw-rw---- 1 root root 0 Sep 13 18:17 f1
Run Code Online (Sandbox Code Playgroud)

下面的剧本是由非特权用户启动的

shell> cat playbook.yml
- hosts: test_01
  become: true
  tasks:
    - copy:
        src: f1
        dest: /tmp
Run Code Online (Sandbox Code Playgroud)

会崩溃

TASK [copy] ****
fatal: [test_01]: FAILED! => 
  msg: 'an error occurred while trying to read the file ''/scratch/f1'':
       [Errno 13] Permission denied: b''/scratch/f1'''
Run Code Online (Sandbox Code Playgroud)

如果您无法升级到 localhost master 上的 root,解决方案是使运行 playbook 的用户可以读取该文件。

  • 不客气。不应该有任何解决方法可以在没有 root 权限的情况下访问 root 文件。 (2认同)