如何在Ansible上覆盖角色的文件?

时间:2014-11-25 00:24:33

标签: provisioning ansible ansible-playbook

我在我的剧本中使用zzet.rbenv role。它有一个files/default-gems文件,可以复制到配置的系统。

我需要我的剧本来检查myplaybook/files/default-gems并使用如果它存在,否则使用zzet.rbenv/files/default-gems

我该怎么做?

1 个答案:

答案 0 :(得分:3)

经过一番研究和试验/错误。我发现Ansible无法检查角色之间是否存在文件。这是由于角色依赖(角色本身)将扩展到需要它的方式,使其成为剧本的一部分。没有任何任务可以让您将my_role/files/my_file.txtrequired_role/files/my_file.txt区分开来。

问题的一种解决方法(我发现最容易和最干净的方法)是:

  1. 使用我想要使用的文件的路径向my_role添加变量(覆盖默认值)
  2. 添加一项任务(与使用默认文件的任务相同),检查是否定义了上述变量并使用它运行任务
  3. 示例

    required_role

    # Existing task
    - name: some task
      copy: src=roles_file.txt dest=some/directory/file.txt
      when: my_file_path is not defined
    
    # My custom task
    - name: my custom task (an alteration of the above task)
      copy: src={{ my_file_path }} dest=/some/directory/file.txt
      when: my_file_path is defined
    

    my_role

    #... existing code 
    my_file_path: "path/to/my/file"
    

    正如 Ramon de la Fuente 所述:此解决方案已被zzet.rbenv repo接受:)