저는 ansible [core 2.11.10]을 사용하고 있으며 최근에 다음 yaml 파일을 만들었습니다.
- name: Linux Security Patching Playbook
hosts: Linux_NPROD
become: true
become_user: root
vars:
ansible_python_interpreter: auto_silent
tasks:
- name : " Debian / Ubuntu Patching "
shell : 'grep security /etc/apt/sources.list > /tmp/security.list && sudo apt-get upgrade -oDir::Etc::Sourcelist=/tmp/security.list -s'
register: response
when : ansible_os_family == "Debian" or ansible_os_family == "Ubuntu"
- debug: msg="{{ response.stdout }}"
- name: " CentOS / RHEL Patching "
shell : 'yum update --security'
register: x
when : ansible_os_family == "RedHat"
- debug: msg="{{ x.stdout }}"
"Debian/Ubuntu Patching" 작업에서는 출력이 제대로 작동하지만 두 번째 작업에서는 다음 오류가 발생합니다.
치명적: []: 실패! => {"msg": "작업에 정의되지 않은 변수가 있는 옵션이 포함되어 있습니다. 오류: 'dict object'에 'stdout' 속성이 없습니다.\n\n오류는 '/home/superuser/Ansible/playbooks에 있는 것 같습니다. /security_patching .yaml': 18행, 7열, 그러나 \n은 특정 구문 문제에 따라 파일의 다른 곳에 있을 수 있습니다. \n\n문제의 행은 다음과 같습니다:\n\n 시기: ansible_os_family = = "RedHat"\ n - debug: msg="{{ x.stdout }}"\n ^ 여기서는 틀릴 수도 있지만\n 문제가 될 수 있는 것 같습니다.\n항상 시작 부분에 템플릿 표현식을 인용하세요. 예: \n\n with_items:\n - {{ foo }}\n\n은 다음과 같이 작성되어야 합니다: \n\n with_items:\n - "{{ foo }}"\n"}
다음과 같이 yaml 파일을 수정하면 동일한 오류가 발생합니다.
- name: Linux Security Patching Playbook
hosts: Linux_NPROD
gather_facts: true
become: true
become_user: root
vars:
ansible_python_interpreter: auto_silent
tasks:
- name : " Debian / Ubuntu Patching "
shell : 'grep security /etc/apt/sources.list > /tmp/security.list && sudo apt-get upgrade -oDir::Etc::Sourcelist=/tmp/security.list -s'
register: response
when : ansible_os_family == "Debian" or ansible_os_family == "Ubuntu"
- debug: msg="{{ response.stdout }}"
- name: " CentOS Patching "
yum:
security: yes
state: latest
check_mode: yes
register: yum_output
become: true
when : ansible_os_family == "RedHat"
- debug: msg="{{ yum_output.stdout }}"
마지막 yaml 파일에서 첫 번째 작업에 주석을 달면 두 번째 작업이 제대로 작동합니다.
이 오류를 어떻게 해결할 수 있는지 아이디어가 있나요?
답변1
이와 같은 작업
- name: "CentOS / RHEL command"
shell:
cmd: 'echo "I was running"'
register: result
when: ansible_os_family == "RedHat"
예사실을 기반으로 실행 또는 건너뛰기. 그래서등록결과조건이 참인 경우에만 발생합니다.
이 오류를 어떻게 해결할 수 있는지 아이디어가 있나요?
등록된 변수의 존재에 의존하는 다음 작업이 실패하지 않도록 하기 위해 이 문제는 다양한 방법으로 해결될 수 있습니다.
이전 작업과 동일한 조건을 추가하여
- name: Show result
debug:
msg: "{{ result.stdout }}"
when: ansible_os_family == "RedHat"
추가하여변수 기반 조건
when: result.stdout is defined
증가시킴으로써기본가치
- name: Show result
debug:
msg: "{{ result.stdout | default('I was not running') }}"
통과블록으로 작업 그룹화조건이 true이면 함께 실행됩니다.
해당되는 경우 주소는 다음과 같습니다.check_mode
- name: Show result
debug:
msg: "{{ result.stdout | default('I was not running') }}"
when: not ansible_check_mode
check_mode: false
설정하지 않으면 이전 작업이 실행되지 않아 결과가 등록되지 않을 수 있기 때문입니다.