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に戻します。
私が間違っているのは何ですか?
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
値を追加することでこれを回避できますか?
これが私がこれを機能させることができた唯一の方法です。
- 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"
「試行錯誤」の長い道のりで、私はこれに来ます:
- 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 }}"
ここに提示されているのと同じアイデア: https://stackoverflow.com/a/40890850/7231194
手順は次のとおりです。
例
# 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
わかりました、これは私の素朴な解決策です...おそらくクロスプラットフォームでネイティブの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