我在 ansible playbook 中有一个 python 脚本:
---
- hosts: localhost
become: yes
become_method: sudo
become_user: root
gather_facts: false
tasks:
- name: execute script
command: ./qwe.py
register: python_output
- debug:
var: python_output.stdout_lines
qwe.py:
#!/usr/bin/python
import subprocess
import os
import json
import ssl
import platform
from requests import get
#import psutil
data = subprocess.Popen(['uname', '-r'], stdout = subprocess.PIPE)
output = str(data.communicate())
a = output[2:len(output)-10]
if "3.10.0-1062.9.1.el7.x86_64" == a:
print(json.dumps({"status":"pass", "kernelVersion":a}))
else:
print(json.dumps({"status":"fail", "kernelVersion":a}))
b = ssl.OPENSSL_VERSION
if "OpenSSL 1.0.2k-fips 26 Jan 2017" == b:
print(json.dumps({ "status":"pass","OpenSSLVersion":b}))
else:
print(json.dumps({"status":"fail", "OpenSSLVersion":b}))
我需要从脚本外部传递这些值列表,例如:“OpenSSL 1.0.2k-fips 26 Jan 2017”,“3.10.0-1062.9.1.el7.x86_64”,而不是对其进行编码。这样,我需要传递 15 个值。
我们怎样才能实现它?感谢您的帮助和时间!!
答案1
你有很多种可能性。
- 使用您的 vars/config模板出一个
.py
文件并导入它。 - 模板化您的完整脚本。
- 将数据作为命令行参数传递。也许使用 base64 编码,这样您就不必处理那么多转义问题。请参阅 b64encode 过滤器的文档,也许还有 to_json 过滤器。这样做很容易
command: a.py {{ some_ansible_var | to_json|b64encode }}
。 - 将数据写入某种分隔的临时文件,并为命令提供临时文件的路径。使用模板写入文件,使用
- 通过 stdin 传递数据。(你需要 shell 而不是命令)
- 设置环境变量(参见任务参数
environment
) - 将脚本重写为 ansible 模块。然后,您就可以完全访问变量。
因为我确信这只是一个简单的例子,所以我不确定哪种想法最适合你的情况。
请记住,如果你的所有软件都是通过发行版包管理系统安装的,那么你可能只需要从包装事实模块。您可能正在重新发明轮子。