Ansible shared files between roles

2019-01-18 12:46发布

Ansible Best Practices described that every role contains file directory that have all files needed by this rule.

In my case I have different roles that share the same files. But I cannot make a copy of these files in each role as there will be no one source of these files and if edit happens to one of them it will become tedious to make this change for every role.

A solution I made is to create another folder and reference it using absolute or relative path. Is this the best way of doing it?

My ansible directory look like this

play.yml
roles/
  web/
    tasks/
    files/
      common-1
      common-2
      other-multiple-files
  role-2/
    tasks/
    files/
      common-1
      common-2
      other-multiple-files
  role-3/
    tasks/
      files/
        common-2
  role-4/
    tasks/
      files/
        common-1

标签: ansible
3条回答
Deceive 欺骗
2楼-- · 2019-01-18 13:02

I use some given ansible variables like inventory_dir and place the files in relation to this path. So then I define a variable

common_files_path: "{{ inventory_dir }}/resources/shared_files"

... and then use it in the ansible task

- name: get local files
  command: cat {{ item }}
  register: some_files
  with_fileglob: "{{ common_files_path }}/*"
  delegate_to: localhost
查看更多
放荡不羁爱自由
3楼-- · 2019-01-18 13:22

You've got two reasonably decent approaches you can try here to reduce repetition.

You could have a separate shared-files directory that sits as a sibling to your role folders like this:

play.yml
roles/
  web/
    tasks/
    files/
      other-multiple-files
  role-2/
    tasks/
    files/
      other-multiple-files
  role-3/
    tasks/
  role-4/
    tasks/
  shared-files/
    common-1
    common-2

You would then reference this in the tasks with a relative file location from where the role/files folder would be:

- name: copy common-1
  copy:
    src: ../../common-1
    dest: /path/to/dest/common-1

- name: copy role specific file
    src: other-multiple-files
    dest: /path/to/dest/other-multiple-files

Or alternatively to use a relative path to the folder, you could symlink things across like this:

play.yml
roles/
  web/
    tasks/
    files/
      common-1 -> ../../common-1
      common-2 -> ../../common-2
      other-multiple-files
  role-2/
    tasks/
    files/
      common-1 -> ../../common-1
      common-2 -> ../../common-2
      other-multiple-files
  role-3/
    tasks/
    files/
      common-2 -> ../../common-2
  role-4/
    tasks/
    files/
      common-1 -> ../../common-1
  shared-files/
    common-1
    common-2

And you can then reference the file as if it was in the role/files directory directly:

- name: copy common-1
  copy:
    src: common-1
    dest: /path/to/dest/common-1

- name: copy role specific file
    src: other-multiple-files
    dest: /path/to/dest/other-multiple-files
查看更多
▲ chillily
4楼-- · 2019-01-18 13:28

My solution was to create roles for the common stuff and add them as dependencies.

For example, your playbook would look like this

play.yml
roles/
  common-1/
    files/
      common-1
  common-2/
    files/
      common-2
  web/
    meta/
      common-1
      common-2
    tasks/
    files/
      other-multiple-files
  role-2/
    meta/
      common-1
      common-2
    tasks/
    files/
      other-multiple-files
  role-3/
    meta/
      common-2
    tasks/
  role-4/
    meta/
      common-1
    tasks/

so, roles/common-1 and roles/common-2 are roles that just deploy the files, and all the roles that need those, they have it as a dependency in the meta/ folder.

查看更多
登录 后发表回答