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

Ansible Variables:覆盖时set_fact的意外行为

Ansible Variables: 覆盖时 set_fact 的意外行为

在 Ansible 中,变量(variables)是一种非常重要的概念。通过变量,我们可以在 playbook 中灵活地定义和使用值。Ansible 提供了多种方式来定义变量,其中一个常用的方式是使用 set_fact 模块。

set_fact 模块允许我们在 playbook 中设置一个事实(fact),以供以后使用。然而,当我们尝试在 playbook 的不同部分使用相同的变量名时,会出现一些意外的行为。具体来说,覆盖一个已经存在的变量时,会出现不同的行为取决于变量的作用域。

在 Ansible 中,变量可以具有全局作用域和主机作用域。

  • 全局作用域变量:这些变量在 Ansible playbook 中的任何地方都是可见的,包括 playbook 的不同任务和主机之间的交互。全局作用域变量可以通过在 playbook 开始时使用 set_fact 模块来定义。
  • 主机作用域变量:这些变量只在特定主机上有效,并且不会被其他主机看到。主机作用域变量可以通过在具体的主机上使用 set_fact 模块来定义。

需要注意的是,当我们在 playbook 的不同部分定义相同名称的变量时,会出现以下情况:

  1. 全局作用域变量的意外行为: 当在 playbook 的不同任务中定义相同名称的全局作用域变量时,后一个任务会覆盖前一个任务中的变量。这可能会导致我们在 playbook 的后续任务中意外地使用了错误的变量值。
  2. 主机作用域变量的意外行为: 当在不同主机上定义相同名称的主机作用域变量时,后一个主机的变量不会覆盖前一个主机的变量。相反,Ansible 会将它们存储为列表,以便我们可以在 playbook 中使用。

在处理这些意外行为时,我们可以采取一些措施来确保正确使用变量:

  1. 使用不同的变量名称: 为了避免全局作用域变量的意外覆盖,我们可以在不同任务中使用不同的变量名称。这样可以确保每个任务使用的变量是唯一的,不会相互干扰。
  2. 使用主机组和条件判断: 在处理主机作用域变量时,我们可以使用主机组和条件判断来确保我们使用了正确的变量。通过将主机分组并在 playbook 中使用条件语句,我们可以根据需要选择正确的变量值。

总结:

在 Ansible 中,变量是一种重要的概念,而 set_fact 模块允许我们在 playbook 中设置变量。然而,当在 playbook 的不同部分定义相同名称的变量时,会出现意外行为。这些行为取决于变量的作用域(全局作用域或主机作用域)。为了避免这些意外行为,我们可以使用不同的变量名称、使用主机组和条件判断来确保正确使用变量。

腾讯云相关产品推荐:

  1. 腾讯云 Ansible 产品:https://cloud.tencent.com/document/product/614 腾讯云提供了 Ansible 相关产品,可以帮助用户更好地管理和自动化部署他们的云资源和应用程序。
  2. 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm 腾讯云云服务器是一种灵活可扩展的计算资源,可用于搭建各种应用和服务。
  3. 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql 腾讯云云数据库 MySQL 版提供了可靠、高性能的 MySQL 数据库服务,适用于各种规模和类型的应用。
  4. 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos 腾讯云对象存储是一种高可靠、高可用的分布式存储服务,用于存储和访问各种非结构化数据。

请注意,以上推荐的产品和链接仅供参考,不代表对其他厂商的产品推广。

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

相关·内容

Ansible自动化运维学习笔记2

上述情况也有例外,当在playbook中为模块参数赋值,可以使用”冒号”,也可以使用”等号”,当使用”等号”为模块参数赋值,则不用考虑引用变量是否使用”引号”问题, file: path...中定义好变量,然后在执行playbook以传入变量覆盖playbook中变量值(前提是命令行中变量与play中变量重名): #cat extravars.yml --- - hosts: local...定义变量 描述:set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,并且与register功能很相似,也是将值赋值给变量。...其实通过set_fact模块创建变量还有一个特殊性,通过set_fact创建变量就像主机上facts信息一样可以在之后play中被引用,而直接在play中采用vars设置变量只能在当前主机 基础示例...,内置变量变量名是被ansible保留,当我们定义变量不能使用这些变量名。

3K51

Ansible自动化运维学习笔记2

上述情况也有例外,当在playbook中为模块参数赋值,可以使用”冒号”,也可以使用”等号”,当使用”等号”为模块参数赋值,则不用考虑引用变量是否使用”引号”问题, file: path...中定义好变量,然后在执行playbook以传入变量覆盖playbook中变量值(前提是命令行中变量与play中变量重名): #cat extravars.yml --- - hosts: local...定义变量 描述:set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,并且与register功能很相似,也是将值赋值给变量。...其实通过set_fact模块创建变量还有一个特殊性,通过set_fact创建变量就像主机上facts信息一样可以在之后play中被引用,而直接在play中采用vars设置变量只能在当前主机 基础示例...,内置变量变量名是被ansible保留,当我们定义变量不能使用这些变量名。

2.3K10
  • Ansible PlayBook中变量优先级分析及清单变量解耦总结

    在 Play、角色或任务中 「在项目定义和管理变量,做好规划以遵循下列原则:」 保持简单:尽管可以通过许多不同⽅式定义 Ansible 变量,但尽量仅使用一两种不同方式并且仅在几个地方定义变量。...在可读小文件中组织变量:如果有一个包含许多主机组和变量大型项目,请将变量拆分成多个文件。 变量优先级 当使用多种方式定义相同变量Ansible 将使用优先级规则为变量选取值。...相对于角色中vars目录下变量,会覆盖defaults变量值。...ansible_user:Ansible 以此用户身份连接受管主机。作为 Ansible 默认行为,它会使用与控制节点上运行 Ansible Playbook 用户相同用户名来连接受管主机。...,这里通过ansible_host清单变量指定了执行时机器,并且定义了一个别名load_balancer,也就是说,在主机清单为lb_servers所在组执行剧本,在连接受管主机时,使用当前定义别名

    5.1K10

    运维必备 | ansible 自动化运维工具之变量定义与调用

    不过上述情况也有例外,当在playbook中为模块参数赋值,可以使用"冒号",也可以使用"等号",当使用"等号"为模块参数赋值,则不用考虑引用变量是否使用"引号"问题, file: path...,果在调用playbook也没有传入变量则会报错,其实我们也可以先在playbook中定义好变量,然后在执行playbook以传入变量覆盖playbook中变量值(前提是命令行中变量与play中变量重名...定义变量」描述:set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,并且与register功能很相似,也是将值赋值给变量。...其实通过set_fact模块创建变量还有一个特殊性,通过set_fact创建变量就像主机上facts信息一样可以在之后play中被引用,而直接在play中采用vars设置变量只能在当前主机 基础示例...中还有一些内置变量可供我们使用,内置变量变量名是被ansible保留,当我们定义变量不能使用这些变量名。

    1.1K10

    基于Ansible和Devops一键测试环境部署实践

    Ansible是基于模块工作,具有丰富内置模块,同时也支持自定义模块开发。以下是对Ansible和其他常见运维工具对比: ? 而ansible在自动化运维过程具有如下优势: 1....1 set_fact set_fact模块主要用来在部署过程中修改和新增变量,设置变量可以在后面的role中使用。...如依赖mysql数据库,可通过set_fact 设置db_driver_class、db_driver_jar、db_url等参数,避免在执行时传入复杂参数,减少执行时参数定义复杂度,如下所示通过...set_fact设置mysql数据库连接信息 - name: set driver version when: db_version|string == '5.7' set_fact:...定义发布流水线既可以通过定时构建触发,定时构建触发使用参数定义默认值;也可以手动发布,手动发布可以动态修改部署参数。这样就可以根据测试需求快速实现不同组合环境部署。 ?

    1.6K20

    云原生之 Ansible 篇(二)

    ansible 之 ignore_errors ansibleset_fact ansible 之 wait_for 任务委托 ansible 之 lineinfile 修改匹配行 在匹配行前或后添加内容...---- ansible 之 tag 你写了一个很长playbook,其中有很多任务,这并没有什么问题,不过在实际使用这个剧本,你可能只是想要执行其中一部分任务而已,或者,你只想要执行其中一类任务而已...---- ansibleset_fact set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,先来看一个小示例,如下 --- - hosts: test70 remote_user...当等对象为端口,状态有started,stoped,即端口已经监听或者端口已经关闭;当等待对象为文件,状态有present或者started,absent,即文件已创建或者删除;当等待对象为一个连接...一般来讲,当task失败ansible会停止执行失败那台主机上任务,但是继续对其他 主机执行。

    1.5K20

    Ansible-playbook 条件判断when、pause

    有一些模块,例如copy这个模块有一些机制能跳过本次模块运行.其实我们也可以使用自己条件语句去配置跳过模块,这样方便你服务能够选择使用不同包管理(apt,yum)和不同文件系统.并且你还可以使用...set_fact这个模块做成更多差异配置 你能够使用when这个关键字去达到跳过本次模块运行效果,when关键字后面跟着是python表达式,在表达式中你能够使用任何变量或者fact,当表达式结果返回是...== "Debian"     - name: Unexpected OS family       debug: msg="OS Family {{ ansible_os_family }} is...not supported" fail=yes       when: not ansible_os_family == "RedHat" or ansible_os_family == "Debian..." 条件语句还有一种用法,它还可以让你当达到一定条件时候暂停下来,等待你输入确认.一般情况下,当ansible遭遇到error,它会直接结束运行.那其实你可以当遭遇到不是预期情况时候给使用pause

    82920

    Ansible 以及 Ansible-playbook介绍

    支持 ( 0-6, Sunday-Saturday, * )写法 job: 表示 计划任务内容. name: 表示 计划任务名称. 相同计划任务名称会覆盖. Demo # day: 表示 天....相同计划任务名称会覆盖. ansible k3s-cluster -m cron -a 'weekday=1-5 job="echodate>> /tmp/1.txt" name=echocron'...使用set_fact设置新变量 set_fact 可以自定义变量通过template或者变量方式在playbook中继承使用。...如:假设你需要获取一个进程使用内存使用率,必须通过set_fact来进行计算之后得出结果,并将其值在playbook中继承使用。...task 文件 handlers main.yml文件为入口, 用于定义此角色中触发条件执行动作 vars main.yml文件为入口,用于定义此角色用到变量 defaults main.yml

    6K31

    ansible超详细使用指南

    另外,还可以通过 set_fact 模块设置变量,比如之前得到了一个命令输出,register到一个变量,然后把我们需要变量提取出来用set_fact存储到另外一个变量中,简化了变量引用。...: login ignore_errors: True - set_fact: loginuser={{ login.stdout }} - name: show login...Holds Jinja2 template files roles/database/handlers/main.yml Handlers roles/database/vars/main.yml Variables...that shouldn’t be overridden roles/database/defaults/main.yml Default variables that can be overridden...7.5 关于异步 ansible1.7版本开始增加了异步参数 async,也就是说执行一个时间很长任务,可以不用等待它结束,而是直接先执行后面的任务,在后续play中定时检查任务执行结果即可。

    2.6K31

    Ansible PlayBook语法

    当发生改动notify这个actions会在playbook每一个tasks结束被触发,而且即使有多个不同tasks通知改动发生,notify actions只会被触发一次.这样可以避免多次有改变发生每次都执行指定操作...标记块开始字符串 dest 目标文件路径 follow 是否遵循目标中文件链接 force 是否强制覆盖,默认为yes group 目标文件或目录所属组 owner 目标文件或目录所属主 mode...模块◆ set_fact模块可以自定义facts,这些自定义facts可以通过template或者变量方式在playbook中使用,如果你想要获取一个进程使用内存百分比,则必须通过set_fact...msg 这会覆盖正常错误消息,使其不符合所需条件 port wait_for模块等待主机端口 path 文件路径,只有当这个文件存在,下一任务才开始执行,即等待该文件创建完成 search_regex...,它还可以让你当达到一定条件时候暂停下来,等待你输入确认.一般情况下,当ansible遭遇到error,它会直接结束运行.那其实你可以当遭遇到不是预期情况时候给使用pause模块,这样可以让用户自己决定是否继续运行任务

    2.3K20

    Ansible模块介绍

    force参数 : 当远程主机目标路径中已经存在同名文件,并且与ansible主机中文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作...与ansible主机中copytest文件内容不同远程主机中copytest文件将被覆盖。...在远程主机/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb #当使用content指定文件内容,dest参数对应值必须是一个文件,而不能是一个路径。...,否则在默认情况下,当再次使用groups参数设置附加组,用户原来附加组会被覆盖。...append参数:如果用户原本就存在多个附加组,那么当使用groups参数设置附加组,当前设置会覆盖原来附加组设置,如果不想覆盖原来附加组设置,需要结合append参数,将append设置为yes

    3K41

    Ansible模块介绍

    force参数 : 当远程主机目标路径中已经存在同名文件,并且与ansible主机中文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作...与ansible主机中copytest文件内容不同远程主机中copytest文件将被覆盖。...在远程主机/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb #当使用content指定文件内容,dest参数对应值必须是一个文件,而不能是一个路径。...,否则在默认情况下,当再次使用groups参数设置附加组,用户原来附加组会被覆盖。...append参数:如果用户原本就存在多个附加组,那么当使用groups参数设置附加组,当前设置会覆盖原来附加组设置,如果不想覆盖原来附加组设置,需要结合append参数,将append设置为yes

    2.8K10

    一文读懂 Ansible 不同上下文提权

    所以Linux系统中,一种良好操作习惯是使用普通账户登录,在执行需要root权限操作,再通过sudo命令完成。...如果相同剧本不同主机需要不同提权,可以通过ansible 连接变量(ansible_*)来控制提权。 以最低特权运行任务以避免意外破坏和由于剧本错误对托管主机损害。...] └─$ 通过命令行提权 在使用命令行选项执行Playbook,也可以覆盖配置文件并指定提权设置。...─$vim roles/become_demo/tasks/main.yml 角色行为为删除刚才创建用户 ┌──[root@vms81.liruilongs.github.io]-[~/ansible.../vms82.liruilongs.github.io.yaml 角色行为为删除用户 ┌──[root@vms81.liruilongs.github.io]-[~/ansible] └─$cat roles

    1.2K40

    深入了解 Ansible:全面掌握自动化 IT 环境利器

    可以使用不同级别的变量,包括全局变量、主机组变量和主机变量,以覆盖或补充默认值。使用 vars 关键字定义变量,或者在主机组或主机 Inventory 中定义。...5.2.9 测试和调试 在编写 Playbooks ,及时进行测试和调试是非常重要。...变量(Variables): 角色可以定义一组变量,用于控制任务行为和配置参数。这些变量可以在角色内部使用,并可以在角色被调用时传递给角色。...模块化设计: 设计角色应该遵循模块化原则,将角色拆分为更小组件,使得每个组件都可以单独使用或组合在一起。...利用角色依赖关系: 在设计角色,可以考虑将一些通用功能抽象为独立角色,并在需要引入这些角色作为依赖。

    70311

    如何通过7个简单步骤构建智能物联网网关

    这些消息将被转发到我们之前开启服务。最后,我们将创建业务规则以在传感器值达到阈值触发所期望动作。...为您网关用户名更新 Ansible playbook BuildGW 文件 [Virtual-IoT-Gateway/Ansible/BuildGW]: set_fact:user='user name...$ ansible-playbook BuildGW 让 Ansible 运行 playbook 中任务。...第5步:创建业务规则 智能物联网网关其中一个重要功能是在传感器数据满足业务规则所定义某些条件触发动作。在本节中,我们将学习如何创建业务规则服务。...这些 MQTT 消息由我们之前启动服务处理。最后,我们创建了业务规则以在传感器值达到阈值触发所期望动作。 在 GitHub 上提供了构建智能物联网网关源代码,并包含演练视频。

    3.7K60
    领券