有时我无法使用原生的 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 内联代码并未提及用于生产用途,但它有助于快速原型设计以及快速交互式测试,以便稍后实现自定义过滤器插件或自定义模块。
此外,您的方法只是将(代码的)维护和操作成本转移到其他地方。
是否有任何内置的 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 来获取它。
在这种情况下,建议熟悉开发过滤器插件。很简单,看例子
它表明如果人们正在寻找的功能不可用,则可以轻松创建它。