GNU/Linux >> Znalost Linux >  >> Linux

Nasazení složky souborů šablon pomocí ansible

Řešení 1:

Můžete použít with_fileglob získat seznam souborů z adresáře šablon a pomocí filtrů odstranit rozšíření j2 takto:

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

Řešení 2:

Michael DeHaan (tvůrce Ansible) zveřejnil příspěvek na CoderWall, který hovoří o velmi podobném problému. Můžete jej upravit a rozšířit podle svých potřeb (jako jsou oprávnění a vlastnictví). Relevantní část příspěvku je zde:

To lze zjednodušit pomocí "with_items “ a jeden notify tvrzení. Pokud se některá z úloh změní, služba bude upozorněna přesně stejným způsobem, jakým je třeba ji restartovat na konci spuštění playbooku.

 - 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

Všimněte si, že protože máme úlohy, které mají více než jeden jedinečný argument, neříkáme jen "item “ v 'template: ', ale použijte with_items s proměnnou hash (slovník). Pokud chcete, můžete jej také ponechat o něco kratší pomocí seznamů. Toto je stylistická preference:

 - 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

Samozřejmě bychom mohli také definovat seznam, přes který jste procházeli, v jiném souboru, například "groupvars/webservers " k definování všech proměnných potřebných pro webservers nebo soubor YAML načtený z "varsfiles "" uvnitř příručky. Podívejte se, jak to může vyčistit, pokud to uděláme.

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

Řešení 3:

Odpověď Russela funguje, ale potřebuje zlepšení

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

Nejprve musí $ odejít, protože v regex_replace byl nesprávný regulární výraz. Za druhé, všechny soubory by měly být v adresáři souborů spíše než v adresáři šablon

Řešení 4:

Napsal jsem plugin pro vyhledávání ve filetree, který může pomoci s akcemi na stromech souborů.

  • https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
  • https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)

Přes soubory ve stromové struktuře souborů můžete procházet a na základě vlastností souboru provádět akce (např. šablona nebo kopírování). Protože je vrácena relativní cesta, můžete snadno znovu vytvořit strom souborů na cílovém systému (systémech).

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

Díky tomu jsou příručky čitelnější.

Řešení 5:

Níže uvedený příkaz mi pomohl provést rekurzivní vyhledávání souborů j2 v šablonách a přesunout je do cíle. Doufám, že to pomůže někomu, kdo hledá rekurzivní kopie šablon do cíle.

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

Linux
  1. Víceprůchodové virtuální stroje pomocí Ansible

  2. Jak vytvořit uživatele Linuxu pomocí Ansible

  3. Procházet složku a vypisovat soubory?

  1. Ansible Guide:Správa souborů pomocí Ansible

  2. Jak bezpečně přenášet soubory pomocí SCP

  3. Přesuňte složku v Linuxu pomocí příkazu mv

  1. Tisknout všechny soubory ve složce?

  2. Jak třídit soubory podle jejich oprávnění pomocí Ls?

  3. Seřadit soubory v konkrétní složce pomocí Ranger?