Ansible任务已授权的主机上运行的问题时,文件名匹配的主机名

问题描述:

我有一个剧本,其中在任务中是模板文件复制到具有delegate_to特定的服务器:一个名为“格罗弗”Ansible任务已授权的主机上运行的问题时,文件名匹配的主机名

存货清单,这里的重要服务器是:bigbird,grover,oscar

这些模板文件必须具有与每个服务器的主机名匹配的名称,并且委托服务器grover也必须具有它自己的所述文件实例。只有在文件尚不存在的情况下,才能进行此模板复制操作。/tmp/grover预先存在于服务器grover上,并且它需要保持未被剧本运行所改变。

最终除了服务器grover上的/ tmp/grover之外,在运行之后还应该存在:/ tmp/bigbird和/ tmp/oscar。

我遇到的问题是,当剧本运行时没有任何条件,它确实有效,但它也会破坏/覆盖/ tmp/grover,这是不可接受的。但是,如果我在之前的播放中添加任务以预先检查这些文件,然后在模板播放时有条件跳过grover(如果该文件已存在),它不仅会跳过grover,而且会跳过其他所有服务器那将会在那场比赛中同时运行。如果我尝试将它设置为在其他所有服务器上运行但是grover,它仍会失败,因为代理服务器是grover,并且会被跳过。

下面是实际的示例代码snipits,剧本是由于主机模式的所有3台服务器上运行:

- hosts: bigbird:grover:oscar 

    - name: File clobber check. 
    stat: 
     path: /tmp/{{ansible_hostname}} 
    register: clobber_check 
    delegate_to: "{{ item }}" 
    with_items: 
     - "{{ grover }}" 

    - name: Copy templates to grover. 
    template: 
     backup: yes 
     src: /opt/template 
     dest: /tmp/{{ansible_hostname}} 
     group: root 
     mode: "u=rw,g=rw" 
     owner: root 
    delegate_to: "{{ item }}" 
    with_items: 
     - "{{ grover }}" 
    when: (not clobber_check.stat.exists) and (clobber_check is defined) 

如果我运行,和/ tmp目录/格罗弗在格罗弗存在,那么它就会简单地跳过因为条件失败,所以整个副本都会播放。因此,由于此问题,其他服务器永远不会将其/ tmp/bigbird和/ tmp/oscar模板复制到grover。

最后,我想避免贫民区的解决方案,如保存grover的原始配置文件的备份,允许clobber,然后将保存的文件复制回最后一项任务。

我必须在这里失去一些东西,我不能是唯一遇到这种情况的人。任何人有任何想法如何编码?

+0

开始删除不必要的'with_items' ... –

+0

@Konstantin Suvorov:谢谢!这实际上是答案,但我不知道如何制作,因为这是一条评论。在我使用实际库存主机名的那一刻,它开始按预期工作。但有点令人失望,我无法正确地将变量分配给一个组,并让它们参与该组中的每个主机,就像我希望的那样。这意味着我现在必须设立更多的任务,但我想这只是一个小细节。再次感谢! – Viscosity

这个问题的答案是删除代码中不必要的with_items。尽管使用with_items的确可以让您委派一个主机模式组,但它也使得变量无法正确定义/分配给该组中的主机。

为delegate_to定义单个主机实体可修复此问题,然后按预期在所定义的所有主机上执行任务。

康斯坦丁苏沃洛夫应该得到这个信用,因为他是原来的答案呃。

此外,我很惊讶,Ansible不允许轻松委派一组主机。一定有他们不允许的理由。