如何使用ansible将目录替换为符号链接?

如何使用ansible将目录替换为符号链接?,ansible,ansible-playbook,Ansible,Ansible Playbook,我想用指向我的回购的符号链接替换启用的/etc/nginx/sites。我正试图使用文件模块来实现这一点,但这不起作用,因为文件模块不使用force选项删除目录 - name: setup nginx sites-available symlink file: path=/etc/nginx/sites-available src=/repo/etc/nginx/sites-available state=link force=yes notify: restart nginx 我可以

我想用指向我的回购的符号链接替换启用的
/etc/nginx/sites
。我正试图使用
文件
模块来实现这一点,但这不起作用,因为文件模块不使用force选项删除目录

- name: setup nginx sites-available symlink
  file: path=/etc/nginx/sites-available src=/repo/etc/nginx/sites-available state=link force=yes
  notify: restart nginx
我可以重新使用shell

- name: setup nginx sites-available symlink
  shell: test -d /etc/nginx/sites-available && rm -r /etc/nginx/sites-available && ln -sT /repo/etc/nginx/sites-available /etc/nginx/sites-available
  notify: restart nginx  

有没有更好的方法来实现这一点,而不是退回到shell中去?

当你采取行动时,实际上是:

  • 删除文件夹
  • 在其位置添加符号链接
这可能也是Ansible中最简洁的表示方式:

tasks:
  - name: remove the folder
    file: path=/etc/nginx/sites-available state=absent 

  - name: setup nginx sites-available symlink
    file: path=/etc/nginx/sites-available 
          src=/repo/etc/nginx/sites-available 
          state=link 
          force=yes
    notify: restart nginx
但是,始终删除和添加符号链接并不太好,因此添加任务以检查链接目标可能是一个不错的添加:

  - name: check the current symlink
    stat: path=/etc/nginx/sites-available 
    register: sites_available
以及删除任务的“何时”条件:

  - name: remove the folder (only if it is a folder)
    file: path=/etc/nginx/sites-available state=absent
    when: sites_available.stat.isdir is defined and sites_available.stat.isdir

现在我已经正确地阅读了您的问题:为什么要替换整个启用站点的文件夹?在站点中添加链接是不是更习惯于向可用站点(或其他地方,如您的项目)添加链接?这就是早期设置中的做法,我正试图用Ansible重做同样的操作。我本可以做的一件事是symlink/repo/etc/nginx/sites available/*到/etc/nginx/sites available/。在这种情况下,如果我添加了一个新的站点,我必须记住运行ansible playbook,这是我试图避免的。这需要3个步骤-统计、删除和链接。对于这样一件简单的事情来说,感觉工作量太大了。如果我需要对通过
提供的带有\u项的文件列表做同样的工作,该怎么办?当
语句时,我们如何将stat结果注册为数组并在
中访问它?我认为最初的问题是
为什么“force”指令不能按预期工作