首页 > 解决方案 > 如何将信息从剧本传递到另一个剧本?

问题描述

我有一个 python 应用程序,可以帮助我构建一个包含多个剧本的工作。如下所示,在作业执行时,ansible 将在远程主机中一一播放剧本:

工作:

  1. 剧本_01
    • 任务1
  2. 剧本_02
    • 任务1
  3. 剧本_03
    • 任务1
  4. 剧本_04
    • 任务1

这些剧本中的每一个都需要远程主机信息,例如操作系统发布的主要版本(例如 RHEL7.9 为 7)。

如何一次收集所需的主机信息并将其用于所有剧本,而不是每次运行每个剧本时都收集。

我知道我可以gather_facts: true在执行任务之前在每个剧本中进行设置,但这有点慢,因为当我在上面的示例中运行所有 4 个剧本时,我必须收集总共 4 次事实。

我已尝试使用本指南register之后的模块,但由于我无法使用或.import_playbookinclude

假设我所有的剧本看起来像下面这样,并使用一些主机信息运行命令,我怎样才能重用第一个剧本中收集的事实?

---
- 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

标签: pythonlinuxansibleredhat

解决方案


推荐阅读