You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中像shell模块执行Bash一样运行Python代码?

在Ansible控制节点运行Python代码并注册输出的方法

当Ansible/Jinja2原生函数无法满足需求时,我们可以通过Bash或Python实现复杂逻辑。比如获取yyyy-mm-dd格式的昨日日期,原生方式较为繁琐:

- name: 打印昨日日期(原生方式)
  debug:
    msg: "{{ '%Y-%m-%d'|strftime(ansible_date_time.epoch|int - 86400) }}"

改用Bash实现时,需使用ansible.builtin.shell模块(因用到Shell特性,command模块不支持):

- name: 用Bash注册昨日日期
  ansible.builtin.shell: |
    echo "$(date -d 'yesterday' '+%Y-%m-%d')" 
  register: yesterday_date_bash_echo_result

- name: 显示Bash获取的结果
  ansible.builtin.debug:
    msg: "yesterday_date_bash_echo_result.stdout 是 {{ yesterday_date_bash_echo_result.stdout }}"

如果需要用Python处理字符串、正则替换这类擅长的任务,Ansible可通过以下两种内置模块实现:

方法1:用ansible.builtin.shell直接执行Python代码

通过python3 -c参数在playbook中嵌入Python代码,同时指定在控制节点运行:

- name: 用Python获取昨日日期并注册结果
  ansible.builtin.shell: |
    python3 -c "
from datetime import datetime, timedelta
yesterday = datetime.now() - timedelta(days=1)
print(datetime.strftime(yesterday, '%Y-%m-%d'))
    "
  register: yesterday_date_python_result
  delegate_to: localhost  # 强制在控制节点运行,若playbook目标就是localhost可省略

- name: 打印Python获取的昨日日期
  ansible.builtin.debug:
    msg: "昨日日期是: {{ yesterday_date_python_result.stdout }}"

方法2:用ansible.builtin.script运行本地Python脚本

若逻辑复杂,建议将Python代码写成单独的脚本文件(比如get_yesterday.py):

from datetime import datetime, timedelta
yesterday = datetime.now() - timedelta(1)
print( datetime.strftime(yesterday, '%Y-%m-%d') )

然后在playbook中调用该脚本:

- name: 运行本地Python脚本获取昨日日期
  ansible.builtin.script: get_yesterday.py
  register: yesterday_date_script_result
  delegate_to: localhost

- name: 打印脚本输出结果
  ansible.builtin.debug:
    msg: "昨日日期是: {{ yesterday_date_script_result.stdout }}"

关键说明

  • delegate_to: localhost:确保代码在控制节点执行,而非远程目标节点(若playbook本身针对localhost则可省略)
  • 若控制节点默认Python版本为2,将python3替换为python即可

内容的提问来源于stack exchange,提问作者Tms91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:57:44