#ansible
Вопрос:
Я пытаюсь сравнить два значения файловой /var
/tmp
системы и в соответствии с результатом должен выполнить соответствующий сборник исправлений.
- name: check top utilized files. shell: du -sx --exclude=/proc --exclude=/sys* --exclude=/dev* --exclude=/u02* --exclude=/usr* --exclude=/boot* --exclude=/swapfile* --exclude=/run* -t 200M "{{fs_input}}"* | sort -n -r register: top_files - debug: msg: "{{ top_files.stdout_lines }}" - debug: msg: "{{ item.split('t/')[0]}}" with_items: "{{ top_files.stdout_lines[0] }}" register: value1 - debug: msg: "{{ value1 |int * 1024 }}" - debug: msg: "{{ item.split('t/')[0]}}" with_items: "{{ top_files.stdout_lines[1] }}" register: value2 - debug: msg: "{{ value2 |int * 1024 }}"
Значение отладки 0
выводится в качестве выходного.
Комментарии:
1. Что вас
top_files.stdout_lines
беспокоит?
Ответ №1:
Здесь многое происходит. register
сохраняет результат задачи, но вы пытаетесь обработать зарегистрированную переменную так, как будто она содержит единственное значение, которое вы хотите. Вы зацикливаетесь на отдельных элементах, что сделает зарегистрированный результат более сложным, чем это должно быть.
debug
register
не очень хороший способ манипулировать переменными, но вы можете заставить его работать:
# Removing the unnecessary loop - debug: msg: "{{ top_files.stdout_lines.0.split('t/')[0] }}" register: value1 - debug: msg: "{{ value1.msg | int * 1024 }}" # Or you can leave it in, if you really want - debug: msg: "{{ item.split('t/')[0]}}" loop: - "{{ top_files.stdout_lines[1] }}" register: value2 - debug: msg: "{{ value2.results.0.msg | int * 1024 }}"
Однако лучше использовать функции Ansible, которые на самом деле предназначены для этого типа работы.
- set_fact: value1: "{{ top_files.stdout_lines.0.split('t/')[0] }}" value2: "{{ top_files.stdout_lines.1.split('t/')[0] }}" - debug: msg: "{{ value1 | int * 1024 }} / {{ value2 | int * 1024 }}"
или
- debug: msg: "{{ value1 | int * 1024 }} / {{ value2 | int * 1024 }}" vars: value1: "{{ top_files.stdout_lines.0.split('t/')[0] }}" value2: "{{ top_files.stdout_lines.1.split('t/')[0] }}"
Лично я мог бы написать это скорее так:
- debug: msg: "{{ values.0 | int * 1024 }} / {{ values.1 | int * 1024 }}" vars: values: "{{ top_files.stdout_lines | map('split', 't/') | map('first') }}"