首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用subprocess.run从python运行ansible playbook不会传递额外的变量

基础概念

subprocess.run 是 Python 标准库中的一个函数,用于执行外部命令。Ansible Playbook 是 Ansible 的一部分,用于定义一系列任务并在目标主机上执行这些任务。

问题描述

当你尝试使用 subprocess.run 从 Python 运行 Ansible Playbook 并传递额外的变量时,可能会遇到变量未被正确传递的问题。

原因分析

subprocess.run 执行的命令是在一个新的子进程中运行的,这意味着环境变量和命令行参数需要正确传递给子进程。Ansible Playbook 通常通过命令行参数或环境变量来接收额外的变量。

解决方法

你可以使用 subprocess.runenv 参数来设置环境变量,或者将变量作为命令行参数传递。以下是两种方法的示例:

方法一:通过环境变量传递

代码语言:txt
复制
import subprocess

# 设置环境变量
env = {
    'ANSIBLE_STDOUT_CALLBACK': 'debug',
    'ANSIBLE_VAULT_PASSWORD_FILE': '/path/to/vault/password/file'
}

# 运行 Ansible Playbook
result = subprocess.run(['ansible-playbook', 'playbook.yml'], env=env)

print(result.returncode)

方法二:通过命令行参数传递

代码语言:txt
复制
import subprocess

# 定义额外的变量
extra_vars = {
    'my_var': 'value'
}

# 将变量转换为 JSON 格式
extra_vars_json = json.dumps(extra_vars)

# 运行 Ansible Playbook 并传递额外的变量
result = subprocess.run(['ansible-playbook', 'playbook.yml', '--extra-vars', extra_vars_json])

print(result.returncode)

参考链接

应用场景

这种方法适用于需要在 Python 脚本中自动化执行 Ansible Playbook 的场景,例如在 CI/CD 管道中自动部署应用程序。

优势

  • 灵活性:可以通过环境变量或命令行参数传递额外的变量,适应不同的需求。
  • 自动化:可以在 Python 脚本中集成 Ansible Playbook 的执行,实现自动化部署和管理。

通过以上方法,你可以确保在使用 subprocess.run 从 Python 运行 Ansible Playbook 时正确传递额外的变量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Nebula Graph Ansible 实践

具有以下几个特点: 默认协议是基于 SSH,相比于 SaltStack不 需要额外部署 agent。 使用 playbook, role, module 来定义部署过程,比较灵活。 操作行为幂等。...使用 playbook 来定义部署过程,Python Jinja2 作为模板渲染引擎,对于熟悉的人来说会比较方便,而对于没有使用过的人,会增加学习成本。...在运行任务时候,首先 Ansible 会根据 module 代码,将参数代入,生成一个新 Python 文件,通过 SSH 放到远程 tmp 文件夹,然后通过 SSH 远程执行 Python 将输出结果返回...文件标准输出,然后 Ansible 再对返回结果做额外处理。...中,graphd 机器组来运行 graphd role,如果 A B 不在 graphd 机器组,就不会将 graphd 配置文件上传。

77930
  • 现代 IT 人一定要知道 Ansible系列教程:playbook

    默认情况下,Ansible 会收集有关清单信息,以便在 playbook使用这些信息。 每个任务状态。每个任务都有一个状态, ok 表示它已成功运行。...在模式中使用变量 可以使用变量来允许将带有 -e 参数组说明符传递ansible-playbook: webservers:!...即使您目标主机未在清单中定义,这也有效,但此方法不会读取与此主机绑定变量清单,并且 playbook 所需任何变量都需要在命令行中手动指定。... 指定仅传递给 SCP 额外参数(例如 -l) --sftp-extra-args 指定仅传递给 SFTP 额外参数(例如 -f、...> 指定仅传递给 ssh 额外参数(例如 -R) --start-at-task 在与此名称匹配任务处启动 playbook --step 在运行前确认每个任务 --

    36210

    如何在 Ansible Playbook 中进行变量替换,解决环境之间差异问题?

    直接运行,如下: ? 如上,playbook 文件中定义变量对所有主机都有效,可理解为主机组变量。 在playbook文件内使用vars_files ?...使用register内变量 Ansible playbook内task之间还可以互相传递数据,比如我们总共有两个tasks,其中第2个task是否执行是需要判断第1个task运行结果,这个时候我们就得在...Ansible task之间传递数据使用register方式 ?...info 结果是一段 Python 字典数据,存储着很多信息,包括执行时间状态变化输出等信息。字典中,取出想要值 ?...使用vars_prompt传入 Ansible 支持在运行 playbook 时,通过交互式方式给定义好参数传入参数值,只需在playbook中定义vars_prompt变量名和交互式提示内容即可

    5K20

    自动化运维实践 | Ansible变量

    Ansible使用变量几个场景 在playbook中, 常用几种变量包括以下几种情况: 1)在playbook中用户自定义变量 2)用户无须自定义。...3)在文件模板中,可以直接使用上述两种变量 4)把任务运行结果作为一个变量使用,这个变量叫做注册变量 5)为了使playbook更灵活、通用性更强,允许用户在执行playbook时传入变量值,这个时候就需要用到...把运行结果当做变量使用-注册变量 把任务执行结果当做一个变量值也是可以。这个时候就需要用到"注册变量",即把执行结果注册到一个变量中,待后面的任务使用。...用命令行传递参数 为了使playbook更灵活,通用性更强,允许用户在执行时候传入变量值,这时候就需要用到"额外变量"。...Host facts Ansible在执行playbook时,会自动搜索远程直接信息。关于这些主机系统变量都可以在playbook中直接使用。 8.

    2K30

    如何在 Ansible Playbook 中进行变量替换,解决环境之间差异问题?

    直接开始测试,先看定义host文件: 接下来,编写一个playbook文件验证变量引用是否正确,内容如下: 运行playbook(不指定绝对路径要在playbook文件下运行),如下所示: 可以看到...使用register内变量 Ansible playbook内task之间还可以互相传递数据,比如我们总共有两个tasks,其中第2个task是否执行是需要判断第1个task运行结果,这个时候我们就得在...Ansible task之间传递数据使用register方式 这里把第1个task执行hostname结果register给info这个变量,然后第2个task把这个结果使用debug模板打印出来,如下...字典中,取出想要值 修改 register.yaml 文件内容,info[‘stdout’]是一个标准 Python 语言在字典中取值用法,执行 playbook,如下所示: 使用vars_prompt...传入 Ansible 支持在运行 playbook 时,通过交互式方式给定义好参数传入参数值,只需在playbook中定义vars_prompt变量名和交互式提示内容即可。

    2.3K20

    Ansible工具安装介绍

    使用无代理模式(agentless mode)来完成任务,这意味着您无需在目标主机上安装任何额外软件。Ansible 通过 SSH 连接到目标主机并执行任务。什么是无代理模式?...Playbook 使用 YAML 编写,YAML 是一种易于阅读和编写语言。建立连接:Ansible使用 SSH 连接到目标主机。...Ansible 核心组件Ansible 核心组件包括:PlaybookPlaybookAnsible 中用于定义任务列表文件。Playbook 使用 YAML 编写。...变量变量用于存储和传递数据。Ansible 支持多种类型变量,包括事实变量、inventory 变量Playbook 变量和角色变量。模板:模板用于生成配置文件和其他文本文件。...-o :此标志告诉 Ansible运行 playbook 一次。它对于 ping 模块不是必需,但在其他上下文中可能很有用。-u root :指定连接到目标主机时要使用远程用户。

    17310

    学习如何安装Ansible运行Playbooks

    您可以源代码构建Ansible,也可以使用下面的正确命令安装最新稳定软件包。...如果这不匹配,请使用-u username参数传递正确用户名。 注意如果您不想使用SSH密钥,可以添加--ask-pass交换机。...为简洁起见,我们不会处理通常可能涉及所有功能和配置,但会覆盖足以让您入门。 警告以下播放手册仅用于学习目的,不会产生强化或安全服务器。使用它们来学习,但不要将它们用于生产实例!...*:ALL state=present 使用以下命令控制计算机运行playbookansible-playbook setup_webserver.yml --ask-become-pass 当这个剧本完成后...处理程序:在变更时运行操作 角色 变量 Playbook最佳实践 更多信息 有关此主题其他信息,您可能需要参考以下资源。

    5K10

    ansible 学习笔记

    --ask-pass 登录密码,提示输入SSH密码而不是假设基于密钥验证 -K --ask-sudo-pass 提示密码使用sudo -s --sudo sudo运行 -S --su...playbook 文件,不是实际执行该 playbook 文件 --list-tasks 列出所有将被执行任务 -C, --check 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生变化...EXTRA_VARS 额外变量设置为键=值或YAML / JSON #cat update.yml --- - hosts: { { hosts...centos下yum、pythonpip或easy_install....该指令使用需要谈到ansible另一种模式---pull 模式,这和我们平常经常用push模式刚好相反,其适用于以下场景:你有数量巨大机器需要配置,即使使用非常高线程还是要花费很多时间;你要在一个没有网络连接机器上运行

    49910

    Ansible安装基本原理及操作(初识)

    Playbook 使用 YAML 编写,YAML 是一种易于阅读和编写语言。 建立连接:Ansible使用 SSH 连接到目标主机。...Ansible 核心组件 Ansible 核心组件包括: PlaybookPlaybookAnsible 中用于定义任务列表文件。Playbook 使用 YAML 编写。...变量变量用于存储和传递数据。Ansible 支持多种类型变量,包括事实变量、inventory 变量Playbook 变量和角色变量。 模板:模板用于生成配置文件和其他文本文件。...Ansible 使用 Jinja2 模板引擎。 角色:角色是 Ansible 中用于组织任务和变量集合。角色可以用于共享代码和提高代码可重用性。...-o :此标志告诉 Ansible运行 playbook 一次。它对于 ping 模块不是必需,但在其他上下文中可能很有用。 -u root :指定连接到目标主机时要使用远程用户。

    11510

    243张图片为你解析Linux轻量级自动运维化工具Ansible

    ; 支持自定义模块,使用任意编程语言; 强大playbook机制; 幂等性; 安装及程序环境: 程序: ansible ansible-playbook ansible-doc 配置文件: /etc/...playbook使用ansible-playbook命令 (1) 检测语法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 测试运行...,而非传递playbook变量ansible_ssh_host ansible_ssh_port ansible_ssh_user ansible_ssh_pass ansible_sudo_pass...,发现也是正常,此处68因为已经安装过vsftpd所以就不会执行,所以并不会changed 示例2:在playbook中定义变量 测试,也没有问题 思考?...假如同时利用-e参数传递一个变量参数的话会怎么样? 测试结果如下,是-e传递变量参数优先级更高,这样的话能避免传递参数时候,因为文本里面定义优先级更高而出错?

    1.4K30

    243张图片为你解析Linux轻量级自动运维化工具Ansible

    ; 部署简单:agentless; 支持自定义模块,使用任意编程语言; 强大playbook机制; 幂等性; 安装及程序环境: 程序: ansible ansible-playbook ansible-doc...playbook使用ansible-playbook命令 (1) 检测语法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 测试运行...中定义 vars: - var_name: value - var_name: value (4) Inventory还可以使用参数: 用于定义ansible远程连接目标主机时使用属性,而非传递playbook...,此处68因为已经安装过vsftpd所以就不会执行,所以并不会changed 示例2:在playbook中定义变量 测试,也没有问题 思考?...假如同时利用-e参数传递一个变量参数的话会怎么样? 测试结果如下,是-e传递变量参数优先级更高,这样的话能避免传递参数时候,因为文本里面定义优先级更高而出错?

    1.6K60

    243 张图片为你解析 Linux 轻量级自动运维化工具 Ansible

    使用任意编程语言; 强大playbook机制; 幂等性; 安装及程序环境: 程序: ansible ansible-playbook ansible-doc 配置文件: /etc/ansible/ansible.cfg...playbook使用ansible-playbook命令 (1) 检测语法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 测试运行...中定义 vars: - var_name: value - var_name: value (4) Inventory还可以使用参数: 用于定义ansible远程连接目标主机时使用属性,而非传递playbook...修改一下变量,发现也是正常,此处68因为已经安装过vsftpd所以就不会执行,所以并不会changed ? 示例2:在playbook中定义变量 ? 测试,也没有问题 ? 思考?...以上是运行成功了,但是细心同学会发现,这样所有程序都跑一遍也麻烦,所以我们可以用之前了解到标签来执行特定操作即可,也可以直接传递相应变量。 ? 直接传递参数测试运行,好像没有问题 ?

    1.2K20

    243张图片为你解析Linux轻量级自动运维化工具Ansible

    使用任意编程语言; 强大playbook机制; 幂等性; 安装及程序环境: 程序: ansible ansible-playbook ansible-doc 配置文件: /etc/ansible/ansible.cfg...playbook使用ansible-playbook命令 (1) 检测语法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 测试运行...中定义 vars: - var_name: value - var_name: value (4) Inventory还可以使用参数: 用于定义ansible远程连接目标主机时使用属性,而非传递playbook...修改一下变量,发现也是正常,此处68因为已经安装过vsftpd所以就不会执行,所以并不会changed ? 示例2:在playbook中定义变量 ? 测试,也没有问题 ? 思考?...以上是运行成功了,但是细心同学会发现,这样所有程序都跑一遍也麻烦,所以我们可以用之前了解到标签来执行特定操作即可,也可以直接传递相应变量。 ? 直接传递参数测试运行,好像没有问题 ?

    1.2K20

    Ansible高级用法(运维开发篇)

    也许这是常识,但也值得分享:任何管理系统受益于被管理机器在主控机附近运行.如果在云中运行,可以考虑在使用云中一台机器来运行Ansible....,而是模拟执行一遍,然后输出本次执行会对远程主机造成修改 -e EXTRA_VARS, --extra-vars=EXTRA_VARS # 设置额外变量如:key=value 形式 或者...指示使用哪个主机或主机组来运行下面的tasks, # 每个playbook都必须指定hosts,hosts也可以使用通配符格式。...# 主机或主机组在inventory清单中指定,可以使用系统默认/etc/ansible/hosts, # 也可以自己编辑,在运行时候加上-i选项,指定清单位置即可。...变量定义方式 变量名可以为字母,数字以及下划线 playbook变量 1. playbookyaml文件中定义变量赋值 > 2. --exxtra-vars执行参数赋给变量 > 3.

    3.5K52

    ansiblePlaybook

    ansible使用playbook来管理自动化task,playbook是yaml格式文件,其基本内容可以认为是多条ansiblead-hoc语句组成。...同时,playbook开创了很多特性,它可以允许你传输某个命令状态到后面的指令,如你可以从一台机器文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂部署机制,这是ansible...秒 -T TIMEOUT, --timeout=TIMEOUT # 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成修改 -C, --check...# 设置额外变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e -e EXTRA_VARS, --extra-vars=EXTRA_VARS...文件语法是否有问题,不会执行该 playbook --syntax-check # 当 play 和 task tag 为该参数指定值时才执行,多个 tag 以逗号分隔 -t TAGS,

    1K20

    Ansible之 AWX 启用facts缓存和模板问卷调查

    包含主机特定信息,这些信息可以像常规变量一样使用。通常,每个剧本都会在执行第一个任务之前自动运行setup模块,以便剧本中主机模式匹配托管主机中收集事实。...一个 Playbook 可以为清单中所有主机收集事实并缓存这些事实,以便后续 Playbook 可以在不收集事实或手动运行 setup 模块情况下使用它们。...存储 Ansible 事实自上次修改后被视为有效最长时间(以秒为单位)。只有有效且未过时事实才会被 playbook 访问。注意,这不会影响数据库中删除 ansible_facts。...建议 Ansible 用户编写可在不同情况下重复使用 Playbook,或者当部署到系统时应具有略微不同行为、配置,或在不同环境中运行。...用户无需详细了解额外变量运行方式或使用情况。他们也不需要了解 Playbook使用额外变量名称。

    1.2K30
    领券