우리는 이해하는 데 시간을 투자한 독특한 문제가 있지만 우리가 취하고 있는 접근 방식이 실제로 올바른지 확신할 수 없습니다. 우리의 목표는 특정 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_DAYS
90일로 설정되어 있는지 확인하고, 그렇다면 (녹색 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
~하지 않을 것이다“항상 변해서 돌아오세요”.