Иногда я не могу использовать встроенные функции Ansible/Jinja2, чтобы получить то, что хочу, поэтому я получаю это через Bash.
Например, мне пришлось ввести вчерашнюю дату в формате yyyy-mm-dd, и я нашел самый простой способ Ansible сделать ее слишком сложной, поскольку задача такая простая.
- name: print yesterday date
debug:
msg: "{{ '%Y-%m-%d'|strftime(ansible_date_time.epoch|int - 86400) }}"
Поэтому я написал следующие задачи, чтобы получить его через Bash.
- name: Register yesterday date using Bash
ansible.builtin.???:
cmd: |
echo "$(date -d 'yesterday' '+%Y-%m-%d')"
register: yesterday_date_bash_echo_result
- name: Show yesterday_date_bash_echo_result
ansible.builtin.debug:
msg: "yesterday_date_bash_echo_result.stdout is {{ yesterday_date_bash_echo_result.stdout }}"
Теперь я хотел бы сделать то же самое с помощью Python, который еще более удобен в использовании, когда дело доходит до преобразования и форматирования строк (не сосредотачивайтесь, например, на получении вчерашней задачи с датой, подумайте о какой-то конкретной подстановке регулярных выражений).
Итак, команды Python для получения вчерашней даты:
from datetime import datetime, timedelta
yesterday = datetime.now() - timedelta(1)
print( datetime.strftime(yesterday, '%Y-%m-%d') )
Как я могу заставить свою управляющую машину запускать их в задаче, чтобы я мог зарегистрировать выходные данные Python?
Мне нужно что-то вроде следующего
- name: Register yesterday date using Python
ansible.builtin.shell:
cmd: |
from datetime import datetime, timedelta
yesterday = datetime.now() - timedelta(1)
print( datetime.strftime(yesterday, '%Y-%m-%d') )
- name: Show yesterday_date_python_echo_result
ansible.builtin.debug:
msg: "yesterday_date_python_echo_result.stdout is {{ yesterday_date_bash_echo_result.stdout }}"
Есть ли встроенный модуль Ansible для этого?






Во-первых, обратите внимание, что пример встроенного кода Python не упоминается для промышленного использования, но он может быть полезен для быстрого прототипирования и/или быстрого интерактивного тестирования с целью последующей реализации подключаемого модуля пользовательского фильтра или пользовательского модуля. Более того, ваш подход просто переносит затраты на обслуживание и эксплуатацию (кода) куда-то еще.
Есть ли встроенный модуль Ansible для этого?
Не имеет прямого названия, а просто модуль command, вызывающий исполняемый файл python.
Минимальный пример сборника сценариев
---
- hosts: localhost
become: false
gather_facts: false
tasks:
- name: Python Inline Code example
command: /usr/bin/python
args:
stdin: |
from datetime import datetime, timedelta
yesterday = datetime.now() - timedelta(1)
print( datetime.strftime(yesterday, '%Y-%m-%d') )
register: results
- name: Show result
debug:
msg: "{{ results.stdout }}"
приведет к требуемому результату
TASK [Show result] ******
ok: [localhost] =>
msg: '2023-09-21'
Похожие вопросы и ответы
Как действовать дальше?
Иногда я не могу использовать встроенные функции Ansible/Jinja2, чтобы получить то, что хочу, поэтому я получаю это через Bash.
Да, такое иногда случается, и не только с тобой. В таком случае рекомендуется ознакомиться с Разработка плагинов фильтров. Это довольно просто, см. пример
Он показывает, что функциональность, которую вы ищете, недоступна ее можно легко создать.