РЕДАКТИРОВАТЬ: кажется, это происходит только при работе с параметром --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
Не вижу, чего мне здесь не хватает.