Vraag Een map met sjabloonbestanden implementeren met ansible


Is er een eenvoudige manier om een ​​map vol met de template .j2-map in een linux-box te implementeren, met dezelfde naam als de sjabloon, maar zonder de .j2-extensie, in plaats van de sjabloonmodule voor elk bestand te gebruiken?

Op dit moment heb ik een lange lijst van:

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

40
2018-02-26 21:36


oorsprong




antwoorden:


Je zou kunnen gebruiken with_fileglob om de lijst met bestanden uit je sjabloondirectory te krijgen en gebruik filters om de j2-extensie als volgt te strippen ..

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

55
2017-10-28 05:08



Notitie with_fileglob werkt altijd vanuit files/, je kunt sjablonen krijgen met ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680 - ThorSummoner
Bedankt, dit is super behulpzaam. Ik ontdekte dat ik twee backslashes moest gebruiken om te ontsnappen aan de letterlijke periode in de functie regex_replace. Misschien omdat ik het volledige gedeelte van de dest-sjabloon binnen dubbele aanhalingstekens had, zodat ik het YAML-formaat kon gebruiken voor de taakdefinitie (wat ik liever heb dan het one-liner-formaat). - Tony Cesaro
dit veronderstelt alleen bestanden die live in de map sjablonen staan, als u zowel mappen als bestanden in de map sjablonen wilt ondersteunen, dan hebt u with_filetree nodig - zie stackoverflow.com/questions/41667864/... - danday74
Een opmerking dat regex_replace moet overeenkomen aan het einde van de regel \.j2$ voor gevallen waarin het patroon kan bestaan ​​binnen de bestandsnaam. - Brett Ryan


Michael DeHaan (maker van Ansible) maakte een post op CoderWall dat heeft het over een soortgelijk probleem. U kunt het aanpassen en uitbreiden op basis van uw behoeften (zoals rechten en eigendom). Het relevante deel van de post is hier:


Dit kan worden vereenvoudigd door het gebruik van "with_itemsen een single notify uitspraak. Als een van de taken verandert, wordt de service op dezelfde manier op de hoogte gesteld als dat deze opnieuw moet worden gestart aan het einde van de playbook-run.

 - 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

Let op: aangezien we taken hebben die meer dan één uniek argument gebruiken, zeggen we niet alleen:item" in de 'template:'regel, maar gebruik with_items met een hash (woordenboek) variabele. Je kunt het ook wat korter houden door lijsten te gebruiken, als je wilt. Dit is een stilistische voorkeur:

 - 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

Natuurlijk kunnen we ook de lijst die je overliep in een ander bestand definiëren, zoals een "groupvars/webservers"bestand om alle variabelen te definiëren die nodig zijn voor de webservers groep of een YAML-bestand geladen uit de "varsfiles"richtlijn in het playbook. Kijk hoe dit kan opruimen als we dat doen.

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv

18
2018-03-04 04:04



Een eenvoudigere methode zou kunnen zijn om te schrijven template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.confen gebruik vervolgens een gewone lijst met items: with_items: - foo - bar - Ethan
Dit ziet er nu echt verkeerd uit. De juiste sjabloonlijn zou zijn template: src={{item.src}} dest={{item.dest}} (d.w.z. niet ${var} maar liever {{var}}) - Fabiano Francesconi
@FabianoFrancesconi bijgewerkt. - Mxx


Het antwoord van Russel werkt, maar het moet worden verbeterd

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

Firs van alle $ moeten gaan omdat het verkeerde regex was in de regex_replace. Ten tweede moeten alle bestanden zich in de bestandsdirectory bevinden in plaats van de map met sjablonen


9
2018-01-16 16:47



Welkom bij Server Fault! Uw antwoord suggereert dat een werkbare oplossing voor de vraag beschikbaar is via een eerder antwoord, en zou dus meer geschikt zijn als een bewerking van dat antwoord. Overweeg om uw huidige antwoord te verwijderen en een bewerking van Russell's antwoord voor te stellen. - Paul


Ik heb een plug-in voor bestandszoekwoorden geschreven die kan helpen met acties in bestandsstructuren.

U kunt bestanden in een bestandsstructuur recursiveren en op basis van bestandseigenschappen acties uitvoeren (bijvoorbeeld sjabloon of kopie). Aangezien het relatieve pad wordt geretourneerd, kunt u de filetreer gemakkelijk op het doelsysteem (de doelwitten) recreëren.

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

Het zorgt voor meer leesbare playbooks.


5
2018-03-04 10:35



Het is nog niet samengevoegd :-( - Morgan Christiansson
Het is samengevoegd. - Dag Wieers
Is er een manier om alleen * .conf-bestanden te laten zeggen? - Andrey
Natuurlijk, in het gedeelte "Wanneer:" kun je een uitdrukking schrijven die bij je behoefte past. - Dag Wieers
De plug-in is niet traag, het is het proces waarbij elk bestand afzonderlijk wordt gemapped en gekopieerd, waardoor het langzaam wordt. Maar dat heeft nauwelijks iets te maken met de plug-in, de plug-in kan nuttig zijn voor andere dingen dan sjabloneren of kopiëren. - Dag Wieers


Het onderstaande commando werkte voor mij om een ​​recursieve zoekactie uit te voeren naar j2-bestanden in sjablonen en deze naar de bestemming te verplaatsen. Ik hoop dat het iemand helpt die op zoek is naar een recursief exemplaar van sjablonen naar de bestemming.

     - 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') }}"

2
2017-12-15 15:25





Er is een mogelijkheid om de lijst met actuele bestanden automatisch uit de directory te halen en ze daarna te herhalen ..

- 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() }}"

1
2017-07-31 16:07



Let op de standaard waarschuwing over splitsen op newline - bestandsnamen kunnen nieuwe regels bevatten. Een veiligere oplossing is om een ​​shell-hulpprogramma te gebruiken dat dit ondersteunt print0, zoals finden split dan op \u0000. - Dejay Clayton