state: present
次の例に示すように、一致しuse: package_manager
た後に新しい行に追加したいAnsible yamlファイルがありますsed
。
# Example 1
- name: Package X Install
package:
name:
- package_1
- package_2
state: present
# Example 2
- name: Package Y Install
package:
name: package_3
state: present
# Example 3
- block:
- name: Package Z Install
package:
name: package_4
state: present
# etc. Further examples would be any combination, iteration of the above.
しかし、プレイブック全体には、先行スペースの量が異なる複数の項目があります。一致はstate
項目のすぐ下になければならず、インデントの量は同じでなければなりません。 Ansible PlayBookにはさまざまな用途があるため、state
使用している検索アンカーに問題があります。sed
state: present
私が得る最も遠いものは次のとおりです。
$ sed '/\s\{4,\}package:*\s\{6,\}state: present/a \s\{6,\}use: package_manager'
ご存知のように、まったく動作しません。迷子になりました。どんな助けでもいただければ幸いです!
答え1
一致する行の空白をキャプチャしてから、挿入時に置き換えることができると思います。
sed 's/^\( *\)state: present$/&\n\1use: package_manager/' ansible.yaml
出力:
# Example 1
- name: Package X Install
package:
name:
- package_1
- package_2
state: present
use: package_manager
# Example 2
- name: Package Y Install
package:
name: package_3
state: present
use: package_manager
# Example 3
- block:
- name: Package Z Install
package:
name: package_4
state: present
use: package_manager
# etc. Further examples would be any combination, iteration of the above.
答え2
質問のデータに適切なYAMLパーサーを使用してください。
$ yq -y '(.. | .package? | select(.state == "present")) |= (.use = "package_manager")' file.yml
- name: Package X Install
package:
name:
- package_1
- package_2
state: present
use: package_manager
- name: Package Y Install
package:
name: package_3
state: present
use: package_manager
- block:
- name: Package Z Install
package:
name: package_4
state: present
use: package_manager
これは以下を使用します。yq
パーサーvalue に対応するキーを含む各セクションにuse: package_manager
key+value を追加します。package
state
present
これは、すべてのデータを繰り返してキー値のある部分を選択することによってpackage
行われます。次に、このセクションに新しいキーと値を追加します。state
present