#python #ansible #jinja2
#python #ansible #jinja2
Вопрос:
Я пытаюсь преобразовать строку, которая была проанализирована с использованием регулярного выражения, в число, чтобы я мог умножить его, используя Jinja2. Этот файл является шаблоном, который будет использоваться в скрипте ansible.
У меня есть серия, все из items
которых имеют форму <word><number>
, такую как aaa01
, aaa141
, bbb05
.
Идея заключалась в том, чтобы разобрать слово и число (игнорируя начальные нули) и использовать их позже в шаблоне.
Я хотел манипулировать числом путем умножения и использовать его. Ниже то, что я сделал до сих пор «
{% macro get_host_number() -%}
{{ item | regex_replace('^D*[0]?(d*)$', '\1') }}
{%- endmacro %}
{% macro get_host_name() -%}
{{ item | regex_replace('^(D*)d*$', '\1') }}
{%- endmacro %}
{% macro get_host_range(name, number) -%}
{% if name=='aaa' %}
{{ ((number*5) 100) | int | abs }}
{% elif name=='bbb' %}
{{ ((number*5) 200) | int | abs }}
{% else %}
{{ ((number*5) 300) | int | abs }}
{% endif %}
{%- endmacro %}
{% set number = get_host_number() %}
{% set name = get_host_name() %}
{% set value = get_host_range(name, number) %}
Name: {{ name }}
Number: {{ number }}
Type: {{ value }}
С помощью приведенного выше шаблона я получаю сообщение об ошибке coercing to Unicode: need string or buffer, int found
, которое, я думаю, говорит мне, что оно не может преобразовать строку в целое число, однако я не понимаю, почему. Я видел примеры, делающие это и работающие.
Комментарии:
1. Это сообщение об ошибке означает, что вы передаете целое число там, где ожидалась строка. В какой строке возникает ошибка?
Ответ №1:
Вам нужно преобразовать строку в int после числа регулярных выражений:
{% set number = get_host_number() | int %}
И тогда нет необходимости во | int
внутреннем get_host_range
макросе.