我正在尝试编写一个 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
我的意思是,如果您想要复制的文件位于同一位置,则不要提供完整路径。