Как запустить код Python на хосте, как это делает модуль ansible.builtin.shell для Bash?

Иногда я не могу использовать встроенные функции 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, обратите внимание, что пример встроенного кода 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.

Да, такое иногда случается, и не только с тобой. В таком случае рекомендуется ознакомиться с Разработка плагинов фильтров. Это довольно просто, см. пример

Он показывает, что функциональность, которую вы ищете, недоступна ее можно легко создать.

Другие вопросы по теме