코드 설명자: Ansible 코드의 Regex 및 Backrefs

최근에 작업 중인 고객 프로젝트에 코드 업데이트를 제출했습니다. 저는 Ansible과 같은 단순화 프레임워크를 사용하는 경우에도 매우 조밀한 코드를 작성하는 경향이 있습니다. 그 결과 코드리뷰를 하신 분의 질문에 답변을 드려야 했습니다. 궁극적으로, 나는 그들이 검토하도록 요청한 것에 대한 설명자를 작성할 가치가 있다고 생각했습니다…

문제의 Ansible 기반 코드는 실제로는 하나의 플레이에 불과했습니다.

---
- name: Remove sha512 from the LOG option-list
  ansible.builtin.lineinfile:
    backrefs: true
    line: '\g<log>\g<equals>\g<starttoks>\g<endtoks>'
    path: /etc/aide.conf
    regexp: '^#?(?P<log>LOG)(?P<equals>(\s?)(=)(\s?))(?P<starttoks>.*\w)(?P<rmtok>\+?sha512)(?P<endtoks>\+?.*)'
    state:present
...


위의 내용은 RHEL 7 구성 파일 "/etc/aide.conf"의 내용이 정의된 스캔 정의 "LOG"에 대한 적절한 옵션을 설정하도록 하기 위한 것입니다. 라인의 원래 내용은 다음과 같습니다.

LOG = p+u+g+n+acl+selinux+ftype+sha512+xattrsfor


해당 행의 내용이 실제로 다음과 같아야 함을 나타내도록 STIG가 업데이트되었습니다.

LOG = p+u+g+n+acl+selinux+ftype+xattrsfor


Ansible 플레이의 regexp 및 backrefs 속성 값은 Ansible lineinfile module's 기능을 통해 제공되는 고급 줄 편집을 사용하도록 설계되었습니다. Ansible은 Python 기반 서비스입니다. 이 모듈의 고급 줄 편집 기능은 Pythonre() function을 사용하여 구현됩니다. regexp 속성의 값은 참조 가능한 검색 그룹화를 수행하는 re() 함수의 기능을 사용하도록 작성됩니다. 검색 그룹화는 괄호로 구분된 검색 규칙(예: "(SEARCH_SYNTAX)")을 사용하여 지정됩니다.

기본적으로 지정된 검색 그룹은 왼쪽에서 오른쪽 색인 번호로 참조됩니다. 이 번호는 "1"부터 시작합니다. 그런 다음 대체 문자열의 값을 구성하는 데 도움이 되도록 대체 문자열에서 참조 ID를 참조할 수 있습니다. "backrefs"라고도 합니다. 색인 번호 방법을 사용하면 대체 문자열은 "\1\2\6\8"이 됩니다.

가독성을 높이기 위해 각 그룹의 이름을 명시적으로 지정할 수 있습니다. 검색 그룹에 이름을 지정하려면 검색 그룹 시작 부분에 ?P 구문을 사용합니다. 그룹에 이름이 할당되면 이후에 "\g"구문을 사용하여 해당 이름으로 그룹을 참조할 수 있습니다.

웹 사이트를 방문하여 왼쪽 메뉴에서 "Python"정규식 유형을 선택하면 위의 정규식이 해석되는 방식을 시각적으로 확인할 수 있습니다. "TEST STRING"섹션에 평가할 문자열을 입력한 다음 REGULAR EXPRESSION 상자에 regexp 매개 변수 값을 입력합니다. 그런 다음 사이트는 정규식이 테스트 문자열을 어떻게 자르는지 보여주고 왜 그런 식으로 잘랐는지 알려줍니다.

Regex101 Screen-cap

좋은 웹페이지 즐겨찾기