如何在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
相关产品推荐
相关产品推荐

