Простий спосіб автоматичного створення неіснуючого режиму в ansible


117

У моїй іграшці Ansible багато разів мені потрібно створити там файл

 - name: Copy file
   template:
     src: code.conf.j2
     dest: "{{project_root}}/conf/code.conf"

зараз багато разів confреєра немає. Тоді я повинен створити більше завдання, щоб спершу створити цей реж.

Чи є якийсь простий спосіб автоматичного створення режиму dir, якщо він не існує з певним варіантом



Я не можу повірити, що це все ще проблема у відповіді 2.9. Як важко було б для цих модулів створити перемикач створення режиму, за замовчуванням вимкнено. Це дозволило б заощадити стільки суворості у книжкових книжках, щоб зіткнутися з претензіями, як відповіді нижче
krad

Відповіді:


139

Зараз це єдиний спосіб

- name: Ensures {{project_root}}/conf dir exists
  file: path={{project_root}}/conf state=directory
- name: Copy file
  template:
    src: code.conf.j2
    dest: "{{project_root}}/conf/code.conf"

2
Я думаю, переконатися, що це правильне слово. Запевняйте: «скажіть комусь щось позитивно, щоб розвіяти будь-які сумніви», переконайтесь: «переконайтесь, що (щось) відбудеться чи буде так».
Даніель Комптон

Це, здається, перевіряє, чи існує режисера, але, схоже, це не створює.
Метт

8
Слід зазначити, що ви можете додати recurse=yesдо fileдзвінка, щоб отримати mkdir -pповедінку типу
Мітч

1
Ще одна частина головоломки , яка може бути корисною є анзібль конкретного dirnameфільтра , щоб отримати каталог , який містить файл.
Каспар

1
@radtek файловий модуль вже робить це з каталогом state =. Не вдасться, якщо неможливо забезпечити, щоб запропонований шлях файлу вказував на каталог.
Олександр Жардим

21

Для забезпечення успіху з повним шляхом використовуйте reccurse = так

- name: ensure custom facts directory exists
    file: >
      path=/etc/ansible/facts.d
      recurse=yes
      state=directory

2
Згідно з документацією (і моїми тестами), підкаталоги завжди створюються і recurse=yesзастосовують дозволи лише рекурсивно. Однак у документації зазначено, що це відбувається автоматично з версії 1.7, тому recurseцілком може бути застарілим.
До 마 SE

16

Якщо ви працюєте Ansible> = 2.0, є також фільтр dirname, який ви можете використовувати для вилучення частини каталогу в шляху. Таким чином, ви можете просто використовувати одну змінну, щоб утримати весь шлях, щоб обидва завдання ніколи не виходили з синхронізації.

Наприклад, якщо у вас є книга для записів із dest_pathвизначеною такою змінною, ви можете повторно використовувати ту саму змінну:

- name: My playbook
  vars:
    dest_path: /home/ubuntu/some_dir/some_file.txt
  tasks:

    - name: Make sure destination dir exists
      file:
        path: "{{ dest_path | dirname }}"
        state: directory
        recurse: yes

    # now this task is always save to run no matter how dest_path get's changed arround
    - name: Add file or template to remote instance
      template: 
        src: foo.txt.j2
        dest: "{{ dest_path }}"

1
хоча це рішення все ще є багатослівним, я думаю, що воно найближче до намірів автора. Мені б сподобалося, якби був такий простий параметр 'makedirs', як Salt: docs.saltstack.com/en/latest/ref/states/all/…
lsh

7

AFAIK, єдиний спосіб зробити це можна за допомогою state=directoryпараметра. Хоча templateмодуль підтримує більшість copyопцій, що, в свою чергу, підтримує більшість fileпараметрів, ви не можете використовувати щось подібне state=directoryдо нього. Більше того, це було б досить заплутано (це означало б, що {{project_root}}/conf/code.confце каталог? Чи це означатиме, що його {{project_root}}/conf/слід створити першим.

Тому я не думаю, що зараз це можливо без додавання попереднього fileзавдання.

- file: 
    path: "{{project_root}}/conf"
    state: directory
    recurse: yes

7

Відповідно до останнього документа, коли стан встановлено для каталогу, вам не потрібно використовувати рекурсивний параметр для створення батьківських каталогів, файловий модуль подбає про це.

- name: create directory with parent directories
  file:
    path: /data/test/foo
    state: directory

це плата за проїзд досить , щоб створити батьківські каталоги даних і тест з взувши

зверніться до опису параметра - " стан " http://docs.ansible.com/ansible/latest/modules/file_module.html


Будь ласка, додайте сюди рішення замість посилання, яке може бути розірвано в майбутньому.
Ігнасіо Ара

@IgnacioAra дякую за цінний коментар, я додав рішення.
Елбі

1

ви можете створити папку, використовуючи наведене нижче, залежно від версії, яка відповідає.

Остання версія 2 <

- name: Create Folder
  file: 
   path: "{{project_root}}/conf"
   recurse: yes
   state: directory

Старіша версія:

- name: Create Folder
  file: 
      path="{{project_root}}/conf"
      recurse: yes
      state=directory

Посилання - http://docs.ansible.com/ansible/latest/file_module.html


1

Модуль копіювання створює каталог, якщо його немає. У цьому випадку він створив каталог разрешений.conf.d

- name: put fallback_dns.conf in place                                                                 
  copy:                                                                                                
    src: fallback_dns.conf                                                                             
    dest: /etc/systemd/resolved.conf.d/                                                                
    mode: '0644'                                                                                       
    owner: root                                                                                        
    group: root                                                                                        
  become: true                                                                                         
  tags: testing
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.