Ansible 无法在目录之间创建符号链接,即使使用 force=true

问题描述 投票:0回答:1

我有一个非常简单的 Ansible 任务,它试图在两个目录之间创建一个符号链接。这些文件还不存在,所以现在我只是创建指向目标目录的符号链接。即使我使用

force: true
,它仍然失败。根据我对 Ansible 文档的理解,这应该在以下情况下使用:

Force the creation of the symlinks in two cases: the source file does not exist (but will appear later).

参考:Ansible文件文档

当我尝试在具有绝对路径的测试服务器上创建符号链接时,它工作得很好,就像这样:

ln -s /src/mydir /mydir

我在 Ansible 中做同样的事情,像这样:

- name: Create symlink
  file:
    src: /src/mydir
    dest: /mydir
    state: link
    force: true

在我的剧本中,我也在使用

become:true
.

但是,在 Ansible 中,这失败了,因为 Ansible 似乎正在尝试创建临时目录和文件,并且失败并显示无法访问的错误消息:

UNREACHABLE! => {"changed": false, "msg": "Failed to create temporary directory.
In some cases, you may have been able to authenticate and did not have 
permissions on the target directory. 
Consider changing the remote tmp path in ansible.cfg to 
a path rooted in \"/tmp\", for more error information use -vvv. 

失败的命令是:

( umask 77 && mkdir -p \"` echo /src/mydir/.ansible/tmp `\"&& mkdir \"` echo /src/mydir/.ansible/tmp/ansible-tmp `\" && echo ansible-tmp-\"` echo /src/mydir/.ansible/tmp/ansible-tmp `\" ), 
exited with result 1", "unreachable": true}

到目前为止,所有其他任务都成功运行。从输出中可以看出,此任务返回为无法访问:

default: ok=18   changed=15   unreachable=1    failed=0    skipped=7    rescued=0    ignored=0

我按照错误消息说明进行操作,并在我的

ansible.cfg
项目根目录中创建了一个
ansible
文件并将远程tmp设置为
/tmp/.ansible/tmp
.

ansible.cfg:

[defaults]
remote_tmp = /tmp/.ansible/tmp

尽管如此,它仍然失败并出现同样的错误。

目录结构:

tree ansible/

ansible/
├── ansible.cfg
├── role1
│   └── tasks
│       └── main.yml
├── playbook.yml
├── role2
│   └── tasks
│       └── main.yml
└── role3
    └── tasks
        ├── main.yml

您可以在我的项目根目录中看到

ansible.cfg
文件,当我运行
ansible-config view
它返回文件的内容时没有任何错误:

[ defaults ]
remote_tmp = /tmp/.ansible/tmp

通过

-vvv
后,这是我得到的以下错误:
"msg": "Error while linking: [Errno 2] No such file or directory: b'/src/mydir' -> b'/mydir'", "path": "/mydir"

即使我在创建符号链接之前添加此任务:

- name: Create directory for symbolic link
  file:
    state: directory
    path: /src/my_dir

它仍然失败并出现同样的错误。

ansible ansible-2.x configuration-management
1个回答
0
投票

下面的戏如期而至

shell> cat pb.yml
- hosts: all
  become: true

  tasks:

    - file:
        state: directory
        path: /src/mydir
    - file:
        src: /src/mydir
        dest: /mydir
        state: link
        force: true
shell> ansible-playbook -l test_11 pb.yml

PLAY [test_11] ********************************************************************************

TASK [file] ***********************************************************************************
changed: [test_11]

TASK [file] ***********************************************************************************
changed: [test_11]

PLAY RECAP ************************************************************************************
test_11: ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

shell> ssh admin@test_11 'ls -la / | grep src'
lrwxr-xr-x    1 root  wheel    10 Apr 24 22:56 mydir -> /src/mydir
drwxr-xr-x    3 root  wheel     3 Apr 24 22:56 src

选项

force: true
也按预期工作。链接创建到丢失的源

- hosts: all
  become: true

  tasks:

    - file:
        state: absent
        path: /src
    - file:
        src: /src/mydir
        dest: /mydir
        state: link
        force: true
shell> ssh admin@test_11 'ls -la / | grep src'
lrwxr-xr-x    1 root  wheel    10 Apr 24 22:53 mydir -> /src/mydir
© www.soinside.com 2019 - 2024. All rights reserved.