Как изменить значение, присвоенное переменной, на целое число в Ansible

#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') }}"