将值列表作为 ansible 脚本中的参数传递给 python 脚本

将值列表作为 ansible 脚本中的参数传递给 python 脚本

我在 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 模块。然后,您就可以完全访问变量。

因为我确信这只是一个简单的例子,所以我不确定哪种想法最适合你的情况。

请记住,如果你的所有软件都是通过发行版包管理系统安装的,那么你可能只需要从包装事实模块。您可能正在重新发明轮子。

相关内容