Ansible 权限问题

7

我有一个简单的Ansible任务,用于创建一个文件:

- name: create fake file 
  file:
    name: /opt/refdata/PROD02/roman.delete
    state: touch

我已生成公钥/私钥,将公钥添加到目标主机上正在运行的用户的authorized_keys2中。

当我尝试运行它时,我会收到以下错误:

failed: [experiment01] => {"failed": true, "parsed": false}
Traceback (most recent call last):
  File "/home/acplus_uat01/.ansible/tmp/ansible-tmp-1441921944.69-3869708445827/file", line 1999, in <module>
    main()
  File "/home/acplus_uat01/.ansible/tmp/ansible-tmp-1441921944.69-3869708445827/file", line 372, in main
    open(path, 'w').close()
IOError: [Errno 2] No such file or directory: '/opt/refdata/PROD02/roman.delete'

所以,为了检查我是否有ssh或python的问题,我尝试了以下操作-创建一个只有一行代码的python文件:
open('/opt/refdata/PROD02/roman.delete', 'w').close()

我从与ansible相同的位置和使用相同的用户运行了这个命令:

cat test2.py | ssh -i ~/.ssh/myPrivateKey -q target_user@targethost python -

它创建了文件。

所以,我的问题是 - 问题出在哪里,为什么无法创建文件?

我运行playbook的方式是这样的:

ansible-playbook -i inventory/prod/ acc.yml -v --vault-password-file=~/.ansible-vault-pw --private-key ~/.ssh/myPrivateKey

我也尝试在 /tmp/ 中创建文件,ansible 可以正常工作。
编辑:另外一个更新 - 我将要写入的目录设置为全局可写权限(777),这样就能够创建文件了。所以问题是 - Ansible 中有什么不同呢?
 cat test2.py | ssh -i ~/.ssh/myPrivateKey -q target_user@targethost python -

使用Ansible进行的工作和实现的基本相同,但是与之不同的是。


由于ansible playbook可以在/tmp中编写文件,但不能在此处编写文件,因此我会在play中添加一个步骤来debug: var=ansible_ssh_user并检查它是否与运行您的python脚本的用户匹配。 - nikobelia
你尝试过使用“-vvvv”运行playbook吗? - alfredocambera
/opt/refdata/PROD02/ 存在吗?如果不存在,则应首先创建目录 file name=/opt/refdata/PROD02 state=directory recurse=yes - Nick Roz
/opt/refdata/PROD02/ 目录存在,并且已分配正确的用户和组。 - Roman Goyenko
@Gregory Shulov:/dev/mapper/appvg1-applv1 在 /opt/refdata 上挂载,类型为 ext4(读写)。这是 ext4 挂载。 - Roman Goyenko
显示剩余3条评论
1个回答

3
如果/opt/refdata/PROD02/不存在,您应该先创建目录。
file:
  name: /opt/refdata/PROD02
  state: directory
  recurse: yes
  mode: 0755

Ansible文档指出:

recurse - 设置指定文件属性(仅适用于state=directory

因此,Ansible无法通过一个命令创建文件并创建其路径中的所有目录。

然后,您需要使用第二个命令创建文件本身。

name: create fake file 
  file:
    name: /opt/refdata/PROD02/roman.delete
    state: touch

/opt/refdata/PROD02/ 存在。 - Roman Goyenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接