是否有任何 ansible 模块允许在主机上运行 python 命令,就像 ansible.builtin.shell 模块对 bash 所做的那样?

问题描述 投票: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.