Неопределенная переменная ошибка 'dict object' на разных хостах при запуске playbook - PullRequest
0 голосов
/ 20 сентября 2018

РЕДАКТИРОВАТЬ: кажется, это происходит только при работе с параметром --check.Запуск этого playbook в реальном времени не выдает эту ошибку.Но все же было бы хорошо узнать, что является причиной этого.

Я начинаю использовать Ansible AWX для управления группой серверов и раньше не использовал Ansible, хотя я прошел черезнесколько онлайн-уроков, и я чувствую себя довольно комфортно.

Я пытаюсь запустить playbook, который устанавливает обновления для ряда веб-серверов.

Выдает ошибку, которая странно выглядитна разных хостах на разных трассах.Например, если я запускаю playbook, хост server3.mydomain.com не работает с этой ошибкой.Если я удалю этот сервер из инвентаря, то получу ту же ошибку на server2.mydomain.com, и т. Д. И т. П.

Вывод ошибки не дает мне достаточно информации, чтобы понять, почему это такне удается, даже если он изолирует его в один небольшой раздел, и мне не удалось найти проблему с помощью онлайн-поиска.

Это книга игр (из шаблона, который я нашел в Интернете, с некоторыми изменениями):

---
- name: ensure services are up before doing anything
  hosts: webservers
  become: true
  any_errors_fatal: true
  serial: 1
  tasks:

- name: upgrade packages and reboot (if necessary)
  hosts: webservers
  become: true
  serial: 1 
  any_errors_fatal: true
  max_fail_percentage: 0

  tasks: 

    - name: apt-get update
      apt:
        update-cache: yes
      changed_when: 0

    - name: get list of pending upgrades
      command: apt-get --simulate dist-upgrade
      args:
        warn: false 
      register: apt_simulate
      changed_when: 0

    - name: parse apt-get output to get list of changed packages
      set_fact: 
        updates: '{{ apt_simulate.stdout_lines | select("match", "^Inst ") | list | sort }}'
      changed_when: 0

    - name: show pending updates
      debug:
        var: updates
      when: updates.0 is defined

    - name: apt-get autoremove
      command: apt-get -y autoremove
      args:
        warn: false
      when: '"Inst linux-image-" in apt_simulate.stdout'
      changed_when: 0

    - name: apt-get dist-upgrade
      apt:
        upgrade: dist 
      register: upgrade_output

    - name: check if reboot needed
      stat: path=/var/run/reboot-required
      register: file_reboot_required

    - meta: end_play
      when: not file_reboot_required.stat.exists

    - name: reboot node
      shell: sleep 2 && shutdown -r now "Reboot triggered by ansible"
      async: 1
      poll: 0
      ignore_errors: true

    - name: wait for node to finish booting
      wait_for_connection:
          connect_timeout=10
          delay=30
          timeout=120

    - name: wait for ssh to start fully
      pause:
        seconds: 45

И это ошибка:

fatal: [server3.mydomain.com]: FAILED! => {
    "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'stdout_lines'\n\nThe error appears to have been in '/var/lib/awx/projects/_8__infrastructure_management/projects/infrastructure-management/test/test.yml': line 30, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n    - name: parse apt-get output to get list of changed packages\n      ^ here\n"

Итак, ошибка, по-видимому, относится к этому блоку, но помимо этого я застрял:

- name: parse apt-get output to get list of changed packages
  set_fact: 
    updates: '{{ apt_simulate.stdout_lines | select("match", "^Inst ") | list | sort }}'
  changed_when: 0

Не вижу, чего мне здесь не хватает.

1 Ответ

0 голосов
/ 20 сентября 2018

Работа с --check не имеет возможности «пробного запуска» модуля command: или shell:, так как он не может предсказать, что безопасно работать, а не нет.Таким образом, поскольку command: не запускается, он не создает никаких stdout_lines в этой переменной apt_simulate.Интересно, что использование debug: var=apt_simulate показывает, что на самом деле оно говорит apt_simulate.skipped=True, а также apt_simulate.msg="remote module (command) does not support check mode".Таким образом, вы можете решить для себя, хотите ли вы просто защитить эту updates: ссылку с when: not apt_simulate.skipped или даже пойти так далеко, как when: not {{ansible_check_mode}}

К счастью, вы можете переопределить поведение command, указав check_mode: no если вы уверены - как это имеет место в вашей команде - что действительно безопасно выполнять команду даже в режиме проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...