web-dev-qa-db-ja.com

Ansible:存在しない場合は行を挿入

Ansibleを使用してプロパティファイルに行を挿入しようとしています。プロパティが存在しない場合は追加しますが、そのようなプロパティが既にファイルに存在する場合は置き換えません。

私のansibleロールに追加します

- name: add couchbase Host to properties
  lineinfile: dest=/database.properties regexp="^couchbase.Host"  line="couchbase.Host=127.0.0.1"

ただし、ファイルに既に存在する場合、これはプロパティ値を127.0.0.1に戻します。

私が間違っているのは何ですか?

22
Pavel Bernshtam

lineinfile モジュールは、想定されることを行います。lineで定義された行がファイルに存在し、regexp。そのため、設定の値に関係なく、新しいlineによって上書きされます。

行をオーバーライドしたくない場合は、最初にコンテンツをテストしてから、その条件をlineinfileモジュールに適用する必要があります。ファイルの内容をテストするためのモジュールはないため、おそらくgrepコマンドでShellを実行し、.stdoutコンテンツ。このようなもの(未テスト):

- name: Test for line
  Shell: grep "^couchbase.Host" /database.properties
  register: test_grep

そして、lineinfileタスクに条件を適用します:

- name: add couchbase Host to properties
  lineinfile:
    dest: /database.properties
    line: couchbase.Host=127.0.0.1
  when: test_grep.stdout != ""

regexpは削除できます。これは、行が存在しないことを確認して、一致しないようにするためです。

しかし、多分あなたは物事を前からやり直しています。ファイル内のその行はどこから来たのですか? Ansibleを使用してシステムを管理する場合、同じ構成ファイルに干渉する他のメカニズムは存在しないはずです。おそらく、あなたの役割にdefault値を追加することでこれを回避できますか?

26
udondan

これが私がこれを機能させることができた唯一の方法です。

- name: checking for Host
  Shell: cat /database.properties | grep couchbase.Host | wc -l
  register: test_grep

- debug: msg="{{test_grep.stdout}}"

- name: adding license server
  lineinfile: dest=/database.properties line="couchbase.Host=127.0.0.1"
  when: test_grep.stdout == "0"
6
kmjackson788

「試行錯誤」の長い道のりで、私はこれに来ます:

- name: check existence of line in the target file
  command: grep -Fxq "ip addr add {{ item }}/32 dev lo label lo:{{ app | default('app') }}" /etc/rc.local
  changed_when: false
  failed_when: false
  register: ip_test
  with_items:
    - "{{ list_of_ips }}"

- name: add autostart command
  lineinfile: dest=/etc/rc.local 
              line="ip addr add {{ item.item }}/32 dev lo label lo:{{ app | default('app') }}"
              insertbefore="exit 0"
              state=present
  when: item.rc == 1
  with_items:
    - "{{ ip_test.results }}"
3
user2658174

ここに提示されているのと同じアイデア: https://stackoverflow.com/a/40890850/7231194

手順は次のとおりです。

  • 回線を交換してください。
  • Modを交換して変更した場合は、復元します
  • MODの置き換えが変わらない場合は、次の行を追加します

# Vars
- name: Set parameters
  set_fact:
    ipAddress    : "127.0.0.1"
    lineSearched : "couchbase.Host={{ ipAddress }}"
    lineModified : "couchbase.Host={{ ipAddress }} hello"

# Tasks
- name: Try to replace the line
  replace:
    dest    : /dir/file
    replace : '{{ lineModified }} '
    regexp  : '{{ lineSearched }}$'
    backup  : yes
 register  : checkIfLineIsHere

# If the line not is here, I add it
- name: Add line
  lineinfile:
  state   : present
  dest    : /dir/file
  line    : '{{ lineSearched }}'
  regexp  : ''
  insertafter: EOF
when: checkIfLineIsHere.changed == false

# If the line is here, I still want this line in the file, Then restore it
- name: Restore the searched line.
  lineinfile:
    state   : present
    dest    : /dir/file
    line    : '{{ lineSearched }}'
    regexp  : '{{ lineModified }}$'
  when: checkIfLineIsHere.changed
1
Je.Go

わかりました、これは私の素朴な解決策です...おそらくクロスプラットフォームでネイティブのAnsibleではありません(私はこのツールを使い始めてまだ学習しています)が、間違いなく短いです:

- name: Update /path/to/some/file
  Shell: grep -q 'regex' /path/to/some/file && echo exists || echo 'text-to-append' >> /path/to/some/file
  register: result
  changed_when: result.stdout.find('exists') == -1
0
zaufi