【问题标题】:Ansible Failed to set permissions on the temporaryAnsible 无法设置临时权限
【发布时间】:2018-03-03 07:01:30
【问题描述】:

我正在使用 ansible 为多个 RHEL6 和 RHEL7 服务器上的用户替换 ssh 密钥。我正在运行的任务是:

- name: private key   
  copy:
    src: /Users/me/Documents/keys/id_rsa
    dest: ~/.ssh/
    owner: unpriv
    group: unpriv
    mode: 0600
    backup: yes

我尝试更新的两个主机出现以下错误:

致命:[host1]:失败! => {"failed": true, "msg": "设置失败 Ansible 需要在何时创建的临时文件的权限 成为非特权用户(rc:1,err:chown:更改所有权 /tmp/ansible-tmp-19/': Operation not permitted\nchown: changing ownership of/tmp/ansible-tmp-19/stat.py':操作不 允许\n)。有关解决此问题的信息,请参阅 https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user"}

问题是这两个得到错误是一些正在更新的克隆。我比较了 sudoers 和 sshd 设置,以及 /tmp 目录上的权限和挂载选项。它们在问题主机和工作主机之间都是相同的。关于我接下来可以检查的内容有什么想法吗?

如果有帮助,我正在 Mac OS Sierra 上运行 ansible 2.3.1.0。

更新:

@techraf

我不知道为什么这对除了两个主机之外的所有主机都有效。这是原始剧本:

- name: ssh_keys
  hosts: my_hosts
  remote_user: my_user
  tasks:
    - include: ./roles/common/tasks/keys.yml
      become: yes
      become_method: sudo

和原始keys.yml:

- name: public key
  copy:
    src: /Users/me/Documents/keys/id_rsab
    dest: ~/.ssh/
    owner: unpriv
    group: unpriv
    mode: 060
    backup: yes

我将剧本更改为:

- name: ssh_keys
  hosts: my_hosts
  remote_user: my_user
  tasks:
    - include: ./roles/common/tasks/keys.yml
      become: yes
      become_method: sudo
      become_user: root

还有keys.yml 到:

- name: public key
  copy:
    src: /Users/me/Documents/keys/id_rsab
    dest: /home/unpriv/.ssh/
    owner: unpriv
    group: unpriv
    mode: 0600
    backup: yes

它适用于所有主机。

【问题讨论】:

  • 另外...您有多台 RHEL6 和 RHEL7 机器,根据您写的内容,问题出现在两台机器上。 RHEL6 听起来不像是 RHEL7 的克隆,所以它就像是一台机器,还是什么?
  • 我感谢任何花时间提供帮助的人,但关于理解英语的讽刺评论毫无用处。我是 Ansible 的新手,在提问时不确定哪些信息是相关的。提供太多信息与没有提供足够信息一样容易受到侮辱。你是对的,关于 RHEL 6 和 RHEL 7。我试图达到的目的是得到不同的结果,而我的目标主机上似乎是一致的配置。
  • 嗯,你想读的就是你读的。每个错误消息都可以从多个层次上理解。例如,您可以理解错误的英文含义,但不理解技术含义(尤其是这个)。我找不到更好的措辞。英文信息清楚地写着“成为非特权用户”,所以我问为什么你的问题中没有关于...成为非特权用户的问题——对我来说是一个自然的、完全中立的问题,对你来说是一个贬义的问题。

标签: ansible


【解决方案1】:

尝试在远程主机上安装ACL,然后执行ansible脚本

sudo apt-get install acl

【讨论】:

  • 你说得通,但为什么需要?
  • 这对我也有用,非常感谢。 @DanielHernández 这只是意味着默认情况下未安装 ansible 依赖的一些 acl 实用程序。我将 acl 添加到我的一项任务中,以确保安装了 acl 并解决了问题。
  • 要详细了解为什么需要它,请阅读docs.ansible.com/ansible/latest/user_guide/…。 “在托管主机上安装 POSIX.1e 文件系统 acl 支持。如果远程主机上的临时目录已启用 POSIX acls 并且 setfacl 工具位于远程 PATH 中,则 Ansible 将使用 POSIX acls 与第二个共享模块文件非特权用户,而不必让每个人都可以读取文件。”
【解决方案2】:

你可以试试这样的:

- name: private key 
  become: true
  become_user: root
  copy:
    src: /Users/me/Documents/keys/id_rsa
    dest: ~/.ssh/
    owner: unpriv
    group: unpriv
    mode: 0600
    backup: yes

注意:

become: true
become_user: root

查看“become”文档了解更多信息

【讨论】:

  • @Alex 那么,如果它解决了问题,您介意一开始就详细说明问题存在的原因吗?目标机器应该是相同的,不是吗?
【解决方案3】:

虽然安装 acl 模块可以工作,但还有另一种选择。

将下面的行添加到 ansible.cfg 的默认部分。 allow_world_readable_tmpfiles = True

更好的是,只需将其添加到需要它的任务中:

  vars:
    allow_world_readable_tmpfiles: true

更多细节的类似问题是Becoming non root user in ansible fails

【讨论】:

    【解决方案4】:

    我正在使用 ad-hoc,当我遇到这个问题时,在我的命令中添加 -b --become-user ANSIBLE_USER 可以解决我的问题。 示例:

    ansible all  -m file -a "path=/etc/s.text state=touch" -b --become-user ansadmin
    

    当然,在此之前,我已将 Sudo 访问权限授予用户

    如果你给你的用户 Sudo 访问权限,你可以这样写:

    ansible all  -m file -a "path=/var/s.text state=touch"  -b --become-user root
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2019-12-25
      • 2019-10-28
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多