Implantando uma pasta de arquivos de modelo usando ansible

40

Existe uma maneira fácil de implantar uma pasta cheia de pasta template .j2 em uma caixa linux, usando o mesmo nome do modelo, mas sem a extensão .j2, em vez de usar o módulo template para cada arquivo?

Agora eu tenho uma longa lista de:

- name: create x template
  template:
    src=files/x.conf.j2
    dest=/tmp/x.conf
    owner=root
    group=root
    mode=0755
  notify:
    - restart myService
    
por Trololololol 26.02.2014 / 21:36

6 respostas

56

Você pode usar with_fileglob para obter a lista de arquivos do seu diretório de modelos e usar filtros para remover a extensão j2 dessa maneira.

- name: create x template
  template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('\.j2','') }}
  with_fileglob:
    - ../templates/*.j2
    
por 28.10.2014 / 05:08
18

Michael DeHaan (criador do Ansible) fez um post no CoderWall que fala sobre um problema muito parecido. Você pode ajustá-lo e expandi-lo de acordo com suas necessidades (como permissões e propriedade). Parte relevante do post está aqui:

Isso pode ser simplificado usando " with_items " e uma única instrução notify . Se alguma das tarefas mudar, o serviço será notificado exatamente da mesma maneira que é necessário reiniciar no final da execução do livro de exercícios.

 - name:  template everything for fooserv
   template: src={{item.src}} dest={{item.dest}}
   with_items:
      - { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
      - { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
   notify: 
      - restart fooserv

Observe que, como temos tarefas que exigem mais de um argumento exclusivo, não dizemos apenas " item " na linha " template: ", mas usamos with_items com uma variável hash (dicionário). Você também pode mantê-lo um pouco mais curto usando listas, se quiser. Esta é uma preferência estilística:

 - name:  template everything for fooserv
   template: src={{item.0}} dest={{item.1}}
   with_items:
      - [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
      - [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
   notify: 
      - restart fooserv

É claro que também poderíamos definir a lista em que você estava caminhando em outro arquivo, como um arquivo " groupvars/webservers " para definir todas as variáveis necessárias para o grupo webservers ou um arquivo YAML carregado de " varsfiles "diretiva dentro do playbook. Veja como isso pode ser limpo se o fizermos.

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv
    
por 04.03.2014 / 04:04
9

A resposta de Russel funciona, mas precisa ser melhorada

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

Firs de todos os $ precisam passar por regex incorreto no regex_replace. Em segundo lugar, todos os arquivos devem estar no diretório de arquivos, em vez de no diretório de modelos

    
por 16.01.2015 / 16:47
5

Eu escrevi um plug-in de pesquisa de arquivos que pode ajudar com ações em árvores de arquivos.

Você pode recorrer a arquivos em uma árvore de arquivos e, com base nas propriedades do arquivo, executar ações (por exemplo, modelo ou cópia). Como o caminho relativo é retornado, você pode recriar o filetree no (s) sistema (s) de destino com facilidade.

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

Torna os playbooks mais legíveis.

    
por 04.03.2016 / 10:35
2

O comando abaixo funcionou para eu fazer uma pesquisa recursiva de arquivos j2 em modelos e movê-los para o destino. Espero que ajude alguém que esteja procurando uma cópia recursiva de modelos para o destino.

     - name: Copying the templated jinja2 files
       template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
       with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"
    
por 15.12.2015 / 15:25
1

Existe a possibilidade de pegar a lista de arquivos reais do diretório automaticamente e iterá-los posteriormente.

- name:         get the list of templates to transfer
  local_action: "shell ls templates/* | sed 's~.*/~~g'"
  register:     template_files

- name:         iterate and send templates
  template:     src=templates/{{ item }} dest=/mydestination/{{ item }}
  with_items:
  - "{{ template_files.stdout.splitlines() }}"
    
por 31.07.2014 / 16:07