Ansible lineinfile(공백 및 상태 변경)

Ansible lineinfile(공백 및 상태 변경)

우리는 이해하는 데 시간을 투자한 독특한 문제가 있지만 우리가 취하고 있는 접근 방식이 실제로 올바른지 확신할 수 없습니다. 우리의 목표는 특정 UNIX 시스템 파일 /etc/login.def과 해당 파일의 특정 값을 확인하는 것입니다 .

강화 요구 사항을 위해 PASS_MAX_DAYS구성 파일에 캡처 logins.def하고 해당 상태를 (녹색 OK) 또는 (빨간색 또는 노란색)으로 보고하려고 합니다. 이는 추가 확인이 필요함을 의미합니다. 우리의 목표는아니요변경을 수행하되 해당 구성 파일의 상태를 캡처하십시오.

다음은 코드 조각입니다.


---
- name: My Machine
  hosts: localhost
  gather_facts: true

  tasks:
    - name: "PASS_MAX_DAYS - 90 Days - Validator"
      become: yes
      become_user: ansible
      tags: PASS_MAX_DAYS
      lineinfile:
        path: /etc/login.defs
        regex: '^PASS_MAX_DAYS\s+'
        line: 'PASS_MAX_DAYS    90'
        state: present
      check_mode: yes
      register: PASS_MAX_DAYS_output

이에 대한 아이디어는 간단합니다. 파일이 PASS_MAX_DAYS90일로 설정되어 있는지 확인하고, 그렇다면 (녹색 OK)로 보고하거나 건너뛰어도 문제 없습니다. 값이 90일 값에서 벗어나면 문제(빨간색 또는 주황색)로 표시하고 값을 캡처하고(등록/디버그 사용) 실행기에 의미 있는 메시지를 출력하고 값을 파일에 캡처합니다. .

참고: 조건을 확인했지만 when사용 가능한지 확실하지 않습니다. "행 교체됨" 메시지와 함께 출력 상태가 "변경됨"으로 설정되는 문제가 항상 발생합니다.

참고: 일부 시스템 관리자는 단일 공백을 사용하고, 다른 시스템 관리자는 탭을 사용하고, 다른 시스템 관리자는 여러 공백을 사용하기 때문에 정규식을 가능한 한 일반적으로 만들어야 합니다(왜냐고 물을 수 있음). 따라서 우리는 해당 값을 일치시키려고 하기 때문에 각 값 사이에 공백이 몇 개인지 신경쓰지 않습니다.

답변1

나는 "raw" 모듈을 사용하고 간단히 다음과 같은 것을 사용합니다:

- name: fetch PASS_MAX_DAYS
  raw: awk '/^PASS_MAX_DAYS/ {print $2}' /etc/login.defs
  register: PASS_MAX_DAYS_output
- name: check PASS_MAX_DAYS ok
  assert:
    that:
      - "PASS_MAX_DAYS_output.stdout != 90"
    msg: "PASS_MAX_DAYS is not 90"

이는 다른 검사에 쉽게 적응할 수 있을 만큼 유연합니다.

답변2

묻다:"PASS_MAX_DAYS 파일이 90일로 설정되어 있는지 확인하세요. 그렇다면 보고(녹색 OK)하거나 건너뛰세요. 문제 없습니다. 값이 90일 값에서 벗어나면 계속해서 문제로 표시하세요(빨간색 또는 주황색). "

답변: Ansible 모듈의 멱등성은 핵심 패러다임입니다. 이런 점에서 Ansible 코드는 프로세스라기보다는 상태의 정의로 보아야 합니다. 따라서 Ansible 코드를 실행하기만 하면 정의된 시스템 상태가 설정됩니다. 예를 들어, 스크립트

$ cat test.yml 
- hosts: localhost
  gather_facts: false
  tasks:
    - lineinfile:
        path: /scratch/tmp/login.defs
        regex: '^PASS_MAX_DAYS\s+'
        line: 'PASS_MAX_DAYS    90'

작업이 변경되었음을 보고합니다(구성하려는 색상으로).ANSIBLE_COLOR_CHANGED)

$ ansible-playbook test.yml 

PLAY [localhost]
TASK [lineinfile] 
changed: [localhost]
PLAY RECAP 
localhost: ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
$ cat /scratch/tmp/login.defs 
PASS_MAX_DAYS    90

플레이북을 다시 실행하여 1개의 작업이 정상이라고 보고합니다(구성하려는 모든 색상으로).ANSIBLE_COLOR_OK)

PLAY RECAP
localhost: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

심사

시스템을 변경하지 않고 잠재적인 차이점만 찾으려면 확인 모드에서 플레이북을 실행하세요.

-C, --check
    don't make any changes; instead, try to predict some of the changes that may occur

예를 들어, 스크립트

$ cat login.defs 
PASS_MAX_DAYS    80
$ ansible-playbook test.yml --check

할 일 1개가 변경될 예정이라고 보고합니다. 즉, 검토가 실패했습니다.

PLAY [localhost]
TASK [lineinfile] 
changed: [localhost]
PLAY RECAP
localhost: ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

보고서

꽤 많이 있습니다콜백 플러그인쓸 수 있는. 그 중 어느 것도 귀하의 목적에 적합하지 않으면 사용자 정의 플러그인을 작성하거나 다음을 사용할 수 있습니다.앤서블 러너그리고 분석하다문화 유물.Python 모듈사용 가능.


묻다:"/etc/login.defs 파일에는 파일에 탭 값이 있습니다. Unix 플랫폼에 대해 똑같은 테스트를 실행하면 ansible 플레이북의 실행 상태가 항상 변경된 대로 반환되는 것을 볼 수 있습니다."

대답: 그것은 당신의 선택입니다. 간격을 바꾸거나 간격을 동일하게 유지하고 싶습니다. 공백과 탭은 login.defs에서 유효한 구분 기호입니다. 사용할 수 있다역참조, regex공백을 변경하고 그대로 두십시오 line. 예를 들어, 다음 작업

    - lineinfile:
        path: /scratch/tmp/login.defs
        regex: '^PASS_MAX_DAYS(\s+)(\S*)$'
        line: 'PASS_MAX_DAYS\g<1>90'
        backrefs: true

~하지 않을 것이다“항상 변해서 돌아오세요”.

관련 정보