如何在Ansible中使用通配符包含多个文件以使用环境变量?

时间:2019-06-07 10:23:17

标签: ansible wildcard devops ansible-inventory ansible-template

我正在尝试自定义安装openedx,并且在这样的路径中有一堆.yml文件,其中包含环境变量

playbooks/roles/<component-name>/defaults/main.yml

然后,在运行安装所有此类组件的剧本时,我使用的是这样的命令

ansible-playbook ./openedx_native.yml -e"@roles/<component-name-1>/defaults/main.yml" -e"@roles/<component-name-2>/defaults/main.yml"

现在,我希望能够使用所有组件中的main.yml文件,其中大约有20-25个,因此我正在寻找一种使用通配符将它们包括在内的方法,类似这样的

ansible-playbook ./openedx_native.yml -e"@roles/*/defaults/main.yml"

这当然是行不通的,Ansible会抛出这样的错误

  

错误!文件名   '/var/tmp/configuration/playbooks/roles/*/defaults/main.yml'不   存在或不可读

我该如何实现?请帮忙!

2 个答案:

答案 0 :(得分:1)

一种选择是查找文件和include_vars

  tasks:
    - command: "sh -c 'find {{ playbook_dir }}/roles/*/defaults/main.yml'"
      register: result
    - include_vars:
        file: "{{ item }}"
      loop: "{{ result.stdout_lines }}"

答案 1 :(得分:0)

如果您可以灵活地更改和重新排列/group/all.yaml中的环境变量及其值,例如environments: - { name: ‘development’, profile: 'small' } - { name: ‘staging’, profile: ‘medium’ } - { name: ‘production’, profile: ‘complex’ }

然后您可以将此变量用于任何任务,例如您要使用环境名称创建文件夹

    - name: create folders for Environment
  file: 
    path: "{{ target }}/{{ item.name }}"
    state: directory
    mode: 0755
  with_items: "{{ environments }}"