Ansible 未定義変数

Ansible 未定義変数

私は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設定しないと、前のジョブが実行されず、結果が登録されない可能性があるためです。

関連情報