Ansibleで空のファイルを作成する方法は?


115

Ansibleを使用して空のファイルを作成する最も簡単な方法は何ですか?空のファイルをfilesディレクトリに保存し、それをリモートホストにコピーできることはわかっていますが、それではやや不十分です。

別の方法は、リモートホスト上のファイルを操作することです。

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

しかし、ファイルは毎回変更され、ログに黄色の線として表示されますが、これも不十分です...

この単純な問題に対するより良い解決策はありますか?

回答:


189

ファイルモジュールのドキュメントは言う

の場合state=file、ファイルが存在しないと作成されません。その動作が必要な場合は、コピーまたはテンプレートモジュールを参照してください。

したがって、コピーモジュールを使用force=noして、ファイルがまだ存在しない場合にのみ新しい空のファイルを作成します(ファイルが存在する場合、その内容は保持されます)。

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

これは宣言的でエレガントなソリューションです。


15
@ÁkosVandra:実際にはそうではありません。参照:force: no
palacsint

ありがとう-これはファイル/タッチや受け入れられた統計/ファイル回答よりもはるかに優れたソリューションであり、「with_items」で簡単に実行できます
Realist

すばらしい答えです。あなたが提供したのと同じ構成を使用して、2つの空のファイルをどのように作成するのかについて知りたくありませんか
Tasdik Rahman、2017

親ディレクトリが存在しない場合にこれを作成する方法はありますか、それとも個別に行う必要がありますか?
falsePockets

親ディレクトリが存在し、書き込み可能であることを確認する必要があります。参照してくださいstackoverflow.com/questions/22844905/...
ルネPijl

37

次のようなもの(stat最初にモジュールを使用してそれに関するデータを収集してから、条件付きでフィルタリングする)が機能するはずです。

- 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

あるいは、changed_when機能を活用できる場合もあります。


20
多分それは可能shoud:「とき:ないp.stat.exists」
PIRO

28

コマンドモジュールを使用する別のオプション:

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

'creates'引数は、ファイルが存在する場合にこのアクションが実行されないようにします。


5
べき等ではないため、コマンドはできるだけ避けてください。ryaneschinger.com/blog/...
redshark1802

4
@ redshark1802同意する。この場合でも、「/ path / to / file」がすでに存在する場合は実行されないため、タスクはべき等です。私はルネ・Pijlのソリューションは、あなたがなど、設定された所有権、モード、する必要がある場合は使用すべき1間違いなく、よりAnsibleのような3人のトップの答えのである、と考える
Leynos

15

承認された回答に基づいて、実行ごとにファイルの権限をチェックし、ファイルが存在する場合はそれに応じて変更するか、ファイルが存在しない場合はファイルを作成する場合は、以下を使用できます。

- 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
この回答は、ファイルが存在しない場合にファイルの属性を定義する際に柔軟性を与えるため、すばらしいものです。
Dejay Clayton 2016

10

file: path=/etc/nologin state=touch

touchの完全な同等物(1.4以降で新規)-ファイルのタイムスタンプを変更したくない場合は、statを使用します。


3
べき等ではなく、ファイルの日付はansibleプレイブックの実行ごとに変更されます。
ジェローム・B

3
@Jerome B Ansible 2.7の新機能:でべき等にすることができますfile: path=/etc/nologin state=touch modification_time=preserve access_time=preserve
GregV

8

ファイルモジュールは、時間を変更せずにファイルに触れる方法を提供します。

- 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

リファレンス:https : //docs.ansible.com/ansible/latest/modules/file_module.html


これはansible 2.7+の正解ですが、重要な情報が欠落しています。
Honza

3

私はこれをコメントとして置くのに十分な評判がないことがわかりました、これはこれのためのより適切な場所でしょう:

再 AllBlacktの答え、Ansibleの複数行フォーマットを希望する場合は、クォートを調整する必要がありますstate(私はこれを解決するために数分を費やしたので、これにより他の人がスピードアップすることを願っています)。

- 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

ファイルが存在しない場合は変更されました。空のファイルを作成します。

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

0

ひねりを加えた2つの答えの組み合わせ。ファイルが作成されるか、権限が更新されると、コードは変更されたものとして検出されます。

- 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"

また、所有者とグループも修正し、これらが修正されたときに変更されたものとして検出するバージョン:

- 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

ansible 2.7+のみ-言及する必要があります。
Honza
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.