編集:これは、--check
パラメーターを使用して実行している場合にのみ発生するようです。この Playbook をライブで実行しても、このエラーは発生しません。しかし、何が原因なのかを知ることは依然として良いことです。
私は Ansible AWX を使用して一連のサーバーを管理し始めていますが、これまで Ansible を使用したことはありませんでしたが、多くのオンライン チュートリアルを経て、非常に快適に感じています。
多数の Web サーバーに更新をインストールするプレイブックを実行しようとしています。
エラーが発生します。これは、実行ごとに異なるホストに奇妙に表示されます。たとえば、プレイブックを実行すると、ホストserver3.mydomain.com
はこのエラーで失敗します。そのサーバーをインベントリから削除すると、で同じエラーが発生しserver2.mydomain.com
ます。
エラー出力は、これが失敗した理由を理解するのに十分な情報を提供していません.1つの小さなセクションに分離されていますが、オンライン検索で問題を見つけることができませんでした.
これはプレイブックです(オンラインで見つけたテンプレートから、いくつかの変更を加えています):
---
- 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
ここで何が欠けているのかわかりません。