我的 Ansible 剧本中有以下内容:
- name: Create certificates directory
file:
dest: "{{ '~/wireguard/certs' | expanduser }}"
state: directory
owner: "{{ ansible_user_id }}"
group: "{{ ansible_user_id }}"
mode: 0700
run_once: true
delegate_to: localhost
但是,当它在剧本中运行时,我收到以下错误:
fatal: [1.2.3.4 -> localhost]: FAILED! => {
"changed": false,
"gid": 1000,
"group": "alex",
"mode": "0755",
"msg": "chown failed: [Errno 1] Operation not permitted: b'/home/alex/wireguard'",
"owner": "alex",
"path": "/home/alex/wireguard",
"size": 4096,
"state": "directory",
"uid": 1000
}
我需要以 root 身份运行它还是其他?如果我确实需要以 root 身份运行它,
become
可以工作吗?
Do I need to run this as root or is it something else?
需要root。例如,请参阅更改所有权
“超级用户 root 可以不受限制地更改任何文件的所有权,但普通用户只能更改他们拥有的文件的所有权。”
这实际上意味着普通用户只能将他们拥有的文件组更改为他们所属的组。
If I do need to run it as root, does become work?
是的。 成为有效。经常使用的成为插件是sudo。 become_user 的默认值为 root。
- file:
become: yes
become_method: sudo
...
一般情况下,让远程/登录用户成为root。但在您的具体情况下,由于
delegate_to: localhost
,请启用正在运行该播放的用户。例如在 localhost 进行更改
$ grep alex /etc/sudoers
alex ALL=(ALL) NOPASSWD: ALL
请参阅插件列表了解其他选项。
我意识到
ansible_user_id
没有我期望的用户名,所以我试图将所有权更改为不存在的用户。我通过为本地用户设置一个新变量来修复它。
我的 Ansible 剧本也遇到了类似的错误。我的问题是该目录的所有者与我的用户名($USER)不同。解决方法:
sudo chown -R $USER /home/alex/wireguard
或
sudo chown -R alex /home/alex/wireguard