python - 如何将信息从剧本传递到另一个剧本?
问题描述
我有一个 python 应用程序,可以帮助我构建一个包含多个剧本的工作。如下所示,在作业执行时,ansible 将在远程主机中一一播放剧本:
工作:
- 剧本_01
- 任务1
- 剧本_02
- 任务1
- 剧本_03
- 任务1
- 剧本_04
- 任务1
这些剧本中的每一个都需要远程主机信息,例如操作系统发布的主要版本(例如 RHEL7.9 为 7)。
如何一次收集所需的主机信息并将其用于所有剧本,而不是每次运行每个剧本时都收集。
我知道我可以gather_facts: true
在执行任务之前在每个剧本中进行设置,但这有点慢,因为当我在上面的示例中运行所有 4 个剧本时,我必须收集总共 4 次事实。
我已尝试使用本指南register
之后的模块,但由于我无法使用或.import_playbook
include
假设我所有的剧本看起来像下面这样,并使用一些主机信息运行命令,我怎样才能重用第一个剧本中收集的事实?
---
- hosts: "{{ host }}"
gather_facts: true
tasks:
- name: "Run command in remote server"
shell: {{some_ansible_fact_variable}}...
或者
如何在第一个剧本中使用注册变量并重用于后续剧本?
# playbook_01
---
- hosts: "{{ host }}"
gather_facts: false
tasks:
- name: "Getting facter os.release.major"
shell: facter os.release.major
register: OSMajorVersion
- name: "Run command in remote server"
shell: {{OSMajorVersion.stdout}}...
# playbook_02
---
- hosts: "{{ host }}"
gather_facts: false
tasks:
- name: "Run command in remote server"
shell: {{OSMajorVersion.stdout}}...
#Edit 每个剧本都被添加到一个 AnsibleTask 类中,并作为 python 进程执行和运行
class AnsibleTask(object):
def run(self):
split_cmd = shlex.split(self.cmd)
# Set log file
self.process_env['ANSIBLE_LOG_PATH'] = '{}/{}.log'.format(
config['ansible']['ansible_logs_dir'],
self.props['hostname'])
logger.info("running command: %s" % self.cmd)
p = subprocess.Popen(
split_cmd,
cwd=self.playbooks_path,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=self.process_env)
output, error = p.communicate()
p.wait()
def execute(self):
self.process_env['ANSIBLE_STDOUT_CALLBACK'] = 'json'
(ret, out, err) = self.run()
host = self.props['host']
try:
out_dict = json.loads(out)
except ValueError as e:
logger.error('error parsing json: %s' % str(e))
raise AnsibleTaskError(AnsibleTaskError.E_PARSE_JSON)
if ret > 0:
...
else:
return out_dict
解决方案
推荐阅读
- ruby-on-rails - 验证名称没有制表符或反斜杠 - Rails
- jquery - 包含值时如何在 window.open 中使用 _self?
- machine-learning - 在新的未标记的单一观察或数据集上使用经过测试的机器学习模型?
- php - 每x分钟后php post函数调用
- laravel - Laravel 在数据获取上更改 img src
- docker - Nginx & Docker:自动代理路由
- vtiger - 项目模块,如何选择默认的“relatedto”字段值
- python - 我们可以使用win32com.client和xlrd在python中使用xlrd.openworkbook中的outlook.attachments对象而不保存excel文件吗
- python - 是否可以矢量化 scipy fsolve?
- c# - 可以在 UWP 中从 C# 代码设置 package.manifest 属性吗?