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 플레이북에는 다른 용도가 있기 때문에 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