Ansible 错误“无法在 Ansible 控制器上找到或访问”

Ansible 错误“无法在 Ansible 控制器上找到或访问”

我正在尝试编写一个 ansible playbook,以便从本地计算机向客户端计算机发送证书。我收到的错误消息是:

msg”:“无法在 Ansible 控制器上找到或访问‘/etc/icinga2/pki/clienthostname.crt’。\n如果您正在使用模块并希望文件存在于远程,请参阅 remote_src 选项”

在错误输出中我还看到这一行:

AnsibleFileNotFound(file_name=source,paths=[to_text(p) for p in search]) ansible.errors.AnsibleFileNotFound:无法在 Ansible Controller 上找到或访问“/etc/icinga2/pki/clienthostname.crt”。\n如果您正在使用模块并希望文件存在于远程,请参阅 remote_src 选项”

我添加了以下两项来提升我的权限,但什么都没有改变。我还尝试将 remote_src 添加到我的剧本中,如错误消息所建议的那样,尽管我的剧本确实没有任何错误,但文件实际上并没有被复制过来

成为:是 | 成为用户:root

这是我的剧本

name: Send client certificates
hosts: all
become: yes
become_user: root
vars:
        masternode: localhost
        clientnode: "{{ inventory_hostname }}"
tasks:
         -name: Copy files to remote host
          connection: local
          become: yes 
          become_user: root
          copy:
                  src: /etc/icinga2/pki/{{ clientnode }}.crt
                  dest: /etc/icinga2/pki

我已确认目录拼写正确,文件确实存在。作为普通用户,我无法访问此目录,因为我收到“权限被拒绝”错误,因此我将 become: yes 和 become_true 添加到我的剧本中以提升权限,但我仍然收到错误。

答案1

这是关键内容:@Zina 评论另一篇帖子关于 become,它会提升远程机器上的权限,而不是本地机器上的权限

因此问题不在于远端,而在于本地(Ansible Controller)端:这不会“变成” root,因此无法读取要复制的文件。这个问题也影响了我,试图复制一个锁定的 SSH 密钥文件。我的解决方法是将delegate_to: localhost文件slurp内容放入变量中(它以 base64 格式存储),然后将其写入目标主机,

- hosts: all
  become: true
  vars:
    key_file: /etc/ssl/private/some.key
  tasks:

    - name: Copy webserver key file into memory
      ansible.builtin.slurp:
        src: "{{ key_file }}"
      register: slurped_key_file
      delegate_to: localhost

    - name: Write copy of key file from memory
      ansible.builtin.copy:
        backup: true
        dest: "{{ key_file }}"
        group: root
        mode: 0600
        owner: root
        content: "{{ slurped_key_file['content'] | b64decode }}"

这里的技巧是,这delegate_to: localhost意味着本地机器(Ansible 控制器)被视为该节的远程机器,因此become:被应用。

答案2

你能只给出下面并尝试吗

src: {{ clientnode }}.crt

我的意思是,如果您想要复制的文件位于同一位置,则不要提供完整路径。

相关内容