Есть ли способ преобразовать десятичную строку в шестнадцатеричную строку в Ansible 2.9? - PullRequest
3 голосов
/ 29 апреля 2020

У меня есть книга игр, которая запрашивает у сервера его SystemID, который можно преобразовать в номер модели, используя предоставленную поставщиком таблицу, которая отображает идентификатор для модели. Сервер возвращает десятичное значение, но в таблице используется шестнадцатеричный эквивалент.

Что я хочу сделать, так это преобразовать десятичную строку в шестнадцатеричную строку, которую можно сопоставить с записью в предоставленной поставщиком таблице.

Пример:

Server returns: SystemID = 1792
Matching entry in vendor table: 0x0700

Я искал в документации Ansible и в Интернете искал либо собственную команду Ansible, либо выражение jinja2 для выполнения преобразования.

Я нашел только функцию int (value, base = x) jinja2, которая противоположна тому, что я пытаюсь сделать.

Собственная команда python hex () может это сделать. Но мне нравится избегать этого, если это возможно.

Вот задача playbook, которая анализирует стандартный вывод сервера для получения значения systemid:

 set_fact:
    server_model: "{{ ( server_model_results.stdout_lines | select('match','SystemID' ) | list| first ).split('=')[1] | regex_replace('^\ |\ /$', '' )  }}"

Среда: Ansible 2.9.7 Python 3.8.0 macOS 10.15.4

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете использовать python формат с оператором % внутри строки шаблона jinja2:

$ ansible localhost -m debug -a msg="{{ '%#x' % 1792 }}"
localhost | SUCCESS => {
    "msg": "0x700"
}

Возможно, вам все еще придется иметь дело с лидирующим 0, который присутствует в вашем файле (то есть 0x0700).

Если все ваши значения дополняются до 4 шестнадцатеричных цифр в вашем файле (т.е. после префикса 0x), быстрое и грязное решение может быть:

$ ansible localhost -m debug -a msg="0x{{ '%04x' % 1792 }}"
localhost | SUCCESS => {
    "msg": "0x0700"
}

Если нет, вам придется реализовать динамическое заполнение c 0 до следующего нечетного числа символов самостоятельно.

Возможно, вы захотите переключить спецификатор типа 'x' в 'X' (см. ссылку do c выше), если шестнадцатеричные цифры выше девяти являются заглавными в таблице поставщиков

$ ansible localhost -m debug -a msg="0x{{ '%04x' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0a09"
}
$ ansible localhost -m debug -a msg="0x{{ '%04X' % 2569 }}"
localhost | SUCCESS => {
    "msg": "0x0A09"
}
...