私は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」ジョブでは出力は正常に機能しますが、2番目のジョブでは次のエラーが発生します。
致命的:[]:失敗! => {"msg": "ジョブに定義されていない変数を含むオプションが含まれています。エラー: 'dict object' に 'stdout' 属性がありません。\n\nエラーは '/home/superuser/Ansible/ playbooks にあるようです。 n時期:ansible_os_family = = "RedHat"を引用します。例:\ n \ n with_items:\ n - {{ foo }} "}
次のように 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 ファイルで最初のタスクにコメントを付けると、2 番目のタスクが正常に動作します。
このエラーをどのように解決できるのか考えがありますか?
答え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
設定しないと、前のジョブが実行されず、結果が登録されない可能性があるためです。