如何像 Bash 中的“ansible.builtin.shell”模块一样在主机上运行 Python 代码?

问题描述 投票:0回答:1

有时我无法使用原生 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.shell:
    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处理起来更加友好(不要专注于获取昨天的日期任务,例如,考虑一些特定的正则表达式替换)。

因此,获取昨天日期的 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 bash cmd ansible stdout
1个回答
0
投票

首先,请注意,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 来获取它。

在这种情况下,建议熟悉开发过滤器插件。很简单,看例子

它表明如果人们正在寻找的功能不可用,则可以轻松创建它。

© www.soinside.com 2019 - 2024. All rights reserved.