Ansible ile boş bir dosya nasıl oluşturulur?


115

Ansible kullanarak boş bir dosya oluşturmanın en kolay yolu nedir? filesDizine boş bir dosya kaydedebileceğimi ve sonra onu uzaktaki ana bilgisayara kopyalayabileceğimi biliyorum, ancak bunu biraz yetersiz buluyorum.

Başka bir yol da uzak ana bilgisayardaki bir dosyaya dokunmaktır:

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555

Ancak daha sonra dosyaya her seferinde dokunuluyor ve günlükte sarı bir çizgi olarak görünüyor ki bu da tatmin edici değil ...

Bu basit soruna daha iyi bir çözüm var mı?

Yanıtlar:


189

Dosya modülünün dokümantasyonu diyor ki

state=fileDosya yoksa , dosya OLUŞTURULMAYACAKTIR, bu davranışı istiyorsanız kopya veya şablon modülüne bakın.

Bu nedenle, force=noyalnızca dosya henüz mevcut olmadığında (dosya varsa, içeriği korunur) yeni bir boş dosya oluşturmak için kopyalama modülünü kullanırız .

- name: ensure file exists
  copy:
    content: ""
    dest: /etc/nologin
    force: no
    group: sys
    owner: root
    mode: 0555

Bu açıklayıcı ve zarif bir çözümdür.


15
@ ÁkosVandra: Aslında öyle değil. Bkz: force: no.
palacsint

Teşekkürler - bu, dosya / dokunma veya kabul edilen istatistik / dosya yanıtından çok daha hoş bir çözüm ve "with_items" ile yapılması daha kolay
Realist

Harika yanıt, sağladığınız aynı yapıyı kullanarak iki boş dosyanın nasıl oluşturulacağını merak ettiniz mi?
Tasdik Rahman

Bunun yoksa ana dizini oluşturmasını sağlamanın bir yolu var mı yoksa bunu ayrıca yapmam mı gerekiyor?
falsePockets

Üst dizinin var olduğundan ve yazılabilir olduğundan emin olmanız gerekir. Stackoverflow.com/questions/22844905/… sayfasına
René Pijl

37

Bunun gibi bir şey ( statmodülü önce onunla ilgili veri toplamak için kullanmak ve sonra bir koşullu kullanarak filtrelemek) işe yaramalıdır:

- stat: path=/etc/nologin
  register: p

- name: create fake 'nologin' shell
  file: path=/etc/nologin state=touch owner=root group=sys mode=0555
  when: p.stat.exists is defined and not p.stat.exists

Alternatif olarak, changed_whenişlevsellikten yararlanabilirsiniz .


20
belki de şu olabilir: "ne zaman: not p.stat.exists"
piro

28

Komut modülünü kullanan başka bir seçenek:

- name: Create file
  command: touch /path/to/file
  args:
    creates: /path/to/file

'Oluşturur' argümanı, dosya varsa bu eylemin gerçekleştirilmemesini sağlar.


5
İdempotent olmadığı için komuttan mümkün olduğunca kaçınmalısınız. ryaneschinger.com/blog/…
redshark1802

4
@ redshark1802 Kabul edildi. Bu durumda, görev idempotenttir, çünkü "/ yol / / dosyaya" zaten varsa çalıştırılmayacaktır. Bence René Pijl'in çözümü en çok kullanılan üç
cevaptan daha Ansible'a benziyor ve

15

Kabul edilen yanıta dayalı olarak, dosyanın her çalıştırmada izinler için kontrol edilmesini ve dosya mevcutsa buna göre değiştirilmesini veya dosya yoksa yalnızca dosyayı oluşturmasını istiyorsanız, aşağıdakileri kullanabilirsiniz:

- stat: path=/etc/nologin
  register: p

- name: create fake 'nologin' shell
  file: path=/etc/nologin 
        owner=root
        group=sys
        mode=0555
        state={{ "file" if  p.stat.exists else "touch"}}

3
Bu yanıt, bir dosyanın yoksa dosya özniteliklerini tanımlamada size sağladığı esneklik nedeniyle harika.
Dejay Clayton

10

file: path=/etc/nologin state=touch

Dokunmanın tam eşdeğeri (1.4+ sürümünde yeni) - dosya zaman damgasını değiştirmek istemiyorsanız stat kullanın.


3
Bu idempotent değil, dosya tarihi yanıtlanabilir başucu kitabının her yürütülmesinde değiştirilecek.
Jérôme B

3
@ Jérôme B Ansible 2.7'deki yenilikler: ile idempotent yapabilirsiniz file: path=/etc/nologin state=touch modification_time=preserve access_time=preserve.
GregV

8

dosya modülü, zamanını değiştirmeden dosyaya dokunmanın yolunu sağlar.

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: u+rw,g-wx,o-rwx
    modification_time: preserve
    access_time: preserve

Referans: https://docs.ansible.com/ansible/latest/modules/file_module.html


Bu yanıtlanabilir 2.7+ için doğru cevaptır, ancak önemli bilgiler eksiktir.
Honza

3

Bunu bir yorum olarak koymak için yeterli itibarım olmadığı ortaya çıktı, bu da bunun için daha uygun bir yer olurdu:

Yeniden. AllBlackt'in cevabı, Ansible'ın çok satırlı formatını tercih ediyorsanız, alıntıyı ayarlamanız gerekir state(bunu çözmek için birkaç dakika harcadım, bu yüzden umarım bu bir başkasını hızlandırır),

- stat:
    path: "/etc/nologin"
  register: p

- name: create fake 'nologin' shell
  file:
    path: "/etc/nologin"
    owner: root
    group: sys
    mode: 0555
    state: '{{ "file" if  p.stat.exists else "touch" }}'

0

Uzak makinede ad-hoc komutuyla bir dosya oluşturmak için

ansible client -m file -a"dest=/tmp/file state=touch"

Yanlışım varsa lütfen düzelt


0

Dosya yoksa değiştirildi. Boş dosya oluşturun.

- name: create fake 'nologin' shell
  file:
    path: /etc/nologin
    state: touch
  register: p
  changed_when: p.diff.before.state == "absent"

0

Bir bükülme ile iki cevabın kombinasyonu. Dosya oluşturulduğunda veya izin güncellendiğinde kod değiştirilmiş olarak algılanacaktır.

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    mode: 0644
    modification_time: preserve
    access_time: preserve
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644"

ve sahibi ve grubu da düzelten ve bunları düzelttiğinde değiştirilmiş olarak algılayan bir sürüm:

- name: Touch again the same file, but dont change times this makes the task idempotent
  file:
    path: /etc/foo.conf
    state: touch
    state: touch
    mode: 0644
    owner: root
    group: root
    modification_time: preserve
    access_time: preserve
  register: p
  changed_when: >
    p.diff.before.state == "absent" or
    p.diff.before.mode|default("0644") != "0644" or
    p.diff.before.owner|default(0) != 0 or
    p.diff.before.group|default(0) != 0

yalnızca 2.7+ ansible - bundan bahsedilmelidir.
Honza
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.