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

我使用注册变量来存储任务的输出值,所以我在ansible角色的when条件中使用相同的值

在Ansible中,注册变量(register)用于捕获任务(如命令或模块执行)的输出,并将其存储在一个变量中,以便后续任务可以使用这个变量。这在自动化部署和配置管理中非常有用,因为它允许你根据之前的任务结果来决定后续任务的执行路径。

基础概念

  • 注册变量:通过register关键字捕获任务输出。
  • when条件:用于控制任务的执行,只有当条件为真时,任务才会执行。

相关优势

  • 动态决策:可以根据任务输出动态决定是否执行某些任务。
  • 代码复用:可以减少重复代码,提高剧本的可读性和可维护性。

类型

  • 简单变量:存储单个值。
  • 字典变量:存储键值对。

应用场景

  • 条件部署:根据环境变量或先前任务的结果部署不同的配置。
  • 错误处理:如果某个任务失败,可以基于其输出决定是否重试或执行其他操作。

示例代码

假设我们有一个Ansible剧本,它首先运行一个命令来检查服务的状态,并根据该状态决定是否重启服务。

代码语言:txt
复制
- name: Check service status
  command: systemctl is-active myservice
  register: service_status
  ignore_errors: true

- name: Restart service if not active
  service:
    name: myservice
    state: restarted
  when: service_status.stdout != 'active'

在这个例子中,service_status变量存储了systemctl is-active myservice命令的输出。然后,在重启服务的任务中,我们使用when条件来检查服务是否处于非活动状态。

可能遇到的问题及解决方法

如果你在使用注册变量时遇到问题,比如when条件不按预期工作,可能的原因包括:

  • 变量未正确注册:确保register关键字正确使用,并且任务确实产生了输出。
  • 变量作用域问题:确保在when条件中引用的变量在当前作用域内是可用的。
  • 输出解析问题:如果命令输出的是复杂的数据结构(如JSON),可能需要使用set_fact模块来解析和存储数据。

解决方法

  • 检查任务是否成功执行并产生了输出。
  • 使用debug模块来打印变量的值,确保它们是你预期的。
  • 如果输出是复杂的数据结构,使用set_fact来解析数据并存储在新的变量中。
代码语言:txt
复制
- name: Parse JSON output
  set_fact:
    parsed_output: "{{ service_status.stdout | from_json }}"

通过这些步骤,你可以确保注册变量和when条件按预期工作,从而使Ansible剧本更加灵活和强大。

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

相关·内容

非常好Ansible入门教程(超简单)

2.3.2 更多任务(More Tasks) Note: 您还可以注册模块操作结果,并使用定义变量根据注册(register)变量值有条件when)地执行操作。...让我们将上述任务移到一本剧本ansible剧本(playbooks)和角色(roles)都使用Yaml文件定义。...Note: 您还可以注册模块操作结果,并使用定义变量根据注册(register)变量值有条件when)地执行操作。例如,注册通过shell模块运行命令结果可以让您访问该命令stdout。...此工具可用于将角色保存到Ansible公共注册表,但是通常只是使用本地创建role基础目录结构。...默认使用编辑器由EDITOR环境变量定义。默认通常是Vim。

3.6K20

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

可以使用不同级别的变量,包括全局变量、主机组变量和主机变量,以覆盖或补充默认使用 vars 关键字定义变量,或者主机组或主机 Inventory 定义。...5.2.3 使用条件判断和循环 利用 Ansible 条件判断和循环功能,根据不同条件执行不同任务,或者对一组主机重复执行相同任务。...可以使用 failed_when 和 ignore_errors 等选项控制任务错误处理行为,以及使用 rescue 和 always 块执行恢复任务。...5.2.7 使用标签和条件执行 Playbooks 中使用标签(tags)标记任务任务集,以便在运行 Playbooks 时选择性地执行或跳过特定任务。...这样可以提高执行效率,并根据需要灵活地选择性执行任务。 5.2.8 使用注册变量 利用 Ansible 注册变量功能,可以一个任务执行命令,并将输出保存到变量,然后在后续任务使用这些变量

70211
  • 玩转企业常见应用与服务系列(十五):Ansible palybook 原理与实践

    组件 AnsiblePlaybook有以下组件: Target 定义playbook远程主机组,即控制下游设备信息 Variable 定义Playbook使用变量。...获取信息 Task常用参数 name #任务名称,Ansible运行过程起到提示作用,会打印屏幕上 action #Ansible控制下游设备命令,通过Ansible各个模块进行控制...register 和when register 用于注册一个变量,保存命令结果(shell或command模块),这个变量可以在后面的task、when语句或模板文件中使用。...date 命令输出存储到 date_output 变量名。...简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独目录,并可以便捷include它们一种机制。角色一般用于基于主机构建服务场景,但也可以是用于构建守护进程等场景

    27311

    Ansible PlayBook语法

    YAML对空格非常敏感,并使用空格将不同信息分组在一起,整个文件应该只使用空格而不使用制表符,并且必须使用一致间距,才能正确读取文件,相同缩进级别的项目被视为同级元素....可以通过template或者变量方式playbook中使用,如果你想要获取一个进程使用内存百分比,则必须通过set_fact进行计算之后得出其,并将其playbook引用....validate: '/usr/sbin/sshd -t -f %s' ◆add_host模块◆ add_host模块使用变量清单创建新主机组,以便在以后相同剧本中使用.获取变量以便我们可以更充分地定义新主机...when: cmdb_status != "to-be-staged" PlayBook条件判断 在有的时候play结果依赖于变量,fact或者是前一个任务执行结果,从而需要使用条件语句....是任务failed则返回true - command: /bin/something_else when: result|success # 如果注册变量任务success则返回

    2.3K20

    2022年 RedHat 最新 RHCE 中级认证考题解析

    -r 指定源,-p指定目的 六、创建和使用角色 0.根据下列要求, /home/student/ansible/roles创建名为 apache 角色: httpd软件包已安装,设为系统启动时启用.../ansible/roles.yml playbook: playbook 包含一个 play,该 play balancers 主机组主机上运行并将使用 balancer 角色。... webservers主机组主机上运行并将使用 phpinfo 角色。...条件不成立时,与其对应模块不会执行 when “’research‘ in ansible_lvm.vgs” 判断目标客户端是否有research这个 卷组,如果有则为真,如果没有则为假 ansible_lvm.vgs...可以使用replace模块 匹配文档关键字,然后替换为ansible 获取设备变量从而完成解题 当没有设备变量时,证明没有其设备,可以使用 “ | ” 正则逻辑或输出 NONE内容 解: [root

    2.8K31

    如何在Ubuntu 14.04上使用Ansible部署多个PHP应用程序

    它们更新方式与我们刚刚完成env任务完全相同。我们还将添加item.name到cron条目的name参数,因为Ansible使用此字段唯一标识每个cron条目。...第4步 - 模板应用循环变量 本节,我们将介绍如何在模板中使用循环变量。 模板循环变量非常简单。它们使用方式与在任务使用方式完全相同,就像所有其他变量一样。...为了支持不同状态并防止任务不必要地运行,您将记住我们克隆git存储任务使用register: cloned方法是将cloned变量注册成为任务状态。...然后,我们以下任务使用when: cloned|changed条件地触发任务。现在我们需要更新这些引用以支持应用程序循环。...我们可以对每个任务进行条件检查,以确定哪个服务器正在运行任务,或者我们可以使用主机变量。主变量就是它们听起来样子:适用于特定主机变量,而不是整个剧本所有主机。

    8.6K00

    Ansible 详细用法说明(二)

    1.核心元素: Tasks:任务,由模块定义操作列表; Variables:变量 Templates:模板,即使用了模板语法文本文件; Handlers:由特定条件触发Tasks; Roles:...我们打算使用基于文本模板语言时,jinja2是很好解决方案。yeml是写playbook,jinja2是写配置文件模板 功用 将模板文件变量值转换成对应本地主机的确定。...: when语句:tasks中使用,Jinja2语法格式; - hosts: all remote_user: root tasks: - name: install...ansible_distribution_major_version == "7" 3、循环:迭代,需要重复执行任务; 对迭代项引用,固定变量名为"item”,使用with_item属性给定要迭代元素...; 这个是以任务为中心,围绕每个任务跑主机,如果中间某个任务中断,那么所有主机以后任务就无法安装。

    2.6K50

    ansible超详细讲解,值得收藏

    ,那么如果在多个地方定义了相同变量,优先会使用哪个呢?...通过执行命令传递变量 playbook引入vars_files变量 playbook定义vars变量 host_vars定义变量 group_vars组名文件定义变量 group_vars...all文件定义变量 ansible resister注册变量 我们使用ansible-playbook时候,它输出是固定格式,假如我们启动了httpd服务以后,想要看一下这个服务状态,...tags标签 对任务指定标签后,我们使用ansible-playbook执行时候就可以指定标签执行任务,不需要执行所有的任务,标签设置有三种情况:1....playbook定义变量,我们配置MySQL主从复制集群时候,对于my.cnf文件,master主机和slave主机配置是不同,这样就可以根据主机名,使用Jinjaif语法进行条件渲染

    2.7K20

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

    ,需要设置log_path指定一个存储Ansible日志文件 9. private_key_file # 使用ssh公钥私钥登录系统时使用秘钥路径 # private_key_file=/path...也许这是常识,但也值得分享:任何管理系统受益于被管理机器主控机附近运行.如果在云中运行,可以考虑使用云中一台机器运行Ansible....> remote_user:指定远端主机哪个用户登录远端系统, # 远端系统执行task用户,可以任意指定,也可以使用sudo, # 但是用户必须要有执行相应task权限。...文件定义变量 > 4....注册变量 # register关键字可以存储指定命令输出结果到一个自定义变量. --- - hosts: database remote_user: root vars: touch_file

    3.5K52

    现代 IT 人一定要知道 Ansible系列教程:Roles详解

    当一个任务在所有目标计算机上执行完毕后,Ansible 会继续执行下一个任务。 您可以使用策略更改此默认行为。每次任务Ansible 都会将相同任务指令应用于所有主机。...Roles ansible 角色允许我们根据已知文件结构自动加载相关变量、文件、任务、处理程序和其他 Ansible 工件。...存储和查找角色 默认情况下,Ansible 以下位置查找角色: 如果我们使用了集合,可以集合查找 名为 roles/ 目录,相对于 playbook 文件 配置roles_path。... playbook roles: 部分中使用 vars: 时,变量将添加到剧本变量,使它们可用于角色之前和之后剧本所有任务。...可以使用相同机制角色嵌入和分发插件,使用相同架构。

    31110

    Ansible自动化运维学习笔记4

    [TOC] 条件判断 描述:高级语言中条件判断是不可或缺,同样我们也可以ansible条件判断用户; 注意:绝大多数语言中都使用”if”作为条件判断关键字,而在ansible条件判断关键字是..."when" then 关键字 描述:ansible采用使用when关键字指明条件;我们可以使用如下运算符。...jinja2运算符,ansible也可以直接使用jinja2这些运算符。...: 比如:下面shell模块远程主机test70执行命令 “ls /testabc”,我们将shell模块返回注册到了变量returnmsg,然后通过returnmsg获取到了命令执行返回码,...ansible,可以使用\”block\”关键字将多个任务整合成一个"块"将被当做一个整体,我们可以对这个”块”添加判断条件,当条件成立时则执行这个块所有任务; 其实block除了能够与when

    2.5K10

    Ansible自动化运维学习笔记4

    [TOC] 条件判断 描述:高级语言中条件判断是不可或缺,同样我们也可以ansible条件判断用户; 注意:绝大多数语言中都使用”if”作为条件判断关键字,而在ansible条件判断关键字是..."when" then 关键字 描述:ansible采用使用when关键字指明条件;我们可以使用如下运算符。...jinja2运算符,ansible也可以直接使用jinja2这些运算符。...: 比如:下面shell模块远程主机test70执行命令 “ls /testabc”,我们将shell模块返回注册到了变量returnmsg,然后通过returnmsg获取到了命令执行返回码,...ansible,可以使用\”block\”关键字将多个任务整合成一个"块"将被当做一个整体,我们可以对这个”块”添加判断条件,当条件成立时则执行这个块所有任务; 其实block除了能够与when

    1.5K20

    Ansible自动化运维工具

    只要用loop循环执行变量就必须使用item 点后面使用loop定义内容 循环开始都要用 – 表示Block块Ansbleplaybook可以把多个和任务组成一个块,然后根据不同条件执行这个块还能执行失败时执行其他命令...: 此目录main.yml文件定义新角色变量默认,该目录定义优先级较低,使用角色时可以覆盖这些变量Files: 存放角色任务引用静态文件Handlers: 此目录main.yml 文件定义处理程序...Meta: 此目录main.yml 文件定义角色相关信息 如:作者,平台,依赖等等Tasks: 此目录main.yml 文件定义角色任务Templates: 存放jinja2模板文件Tests...: 此目录可以包含清单和test.yml(playbook)用于测试角色Vars: 此目录main.yml文件定义角色使用变量值,优先级高于default目录GalaxyGalax是ansible...构成Jinja2模板构成:数据 变量 表达式使用jinja2模板时变量和表达式会被替代成对应,变量可以plasybook定义也可以直接调用facts事实,当然调用facts需要你编写playbook

    2.5K30

    Ansible条件判断介绍和使用

    条件语句Ansible使用场景: 目标主机上定义了一个硬限制,比如:目标主机发行版本必须是RedHat,才能执行该task; 捕获一个命令输出,根据命令输出结果不同以触发不同task;...下面就介绍一些常用条件判断 when 关键字 1. when 关键字使用 ansiblewhen条件判断最常用关键字。...when关键字后面跟着是python表达式,表达式你能够使用任何变量或者fact,当表达式结果返回是false,便会跳过本次任务。...Ansible提供了一种更好方式解决这个问题,即block。 ansible使用block将多个任务进行组合,当作一个整体。...我们可以对这一个整体做条件判断,当条件成立时,则执行块所有任务使用block注意事项: 可以为block定义name 可以直接对block使用when,但不能直接对block使用loop - hosts

    1.4K10

    Ansible 极简教程

    要获取指定远程主机支持所有facts,可使用如下命令进行: #ansible hostname -m setup 5.1.3 register 把任务输出定义为变量,然后用于其他任务,实例如下:...可以将同一个主机同时归并到多个不同;此外,当如若目标主机使用非默认SSH端口,还可以主机名称之后使用冒号加端口号表明。...ansible_python_interpreter 5.3 条件测试 如果需要根据变量、facts或此前任务执行结果做为某task执行与否前提时要用到条件测试。...5.3.1 when语句 task后添加when字句即可使用条件测试;when语句支持jinja2表达式语句,例如: tasks: - name: 'shutdown debian flavored...在运行自上而下某playbook时,如果中途发生错误,所有已执行任务都可能回滚,更正playbook后重新执行一次即可。 taks目的是使用指定参数执行模块,而在模块参数可以使用变量

    3K20

    大神带你 20 分钟学会 Ansible

    要获取指定远程主机支持所有facts,可使用如下命令进行: #ansible hostname -m setup 5.1.3 register 把任务输出定义为变量,然后用于其他任务,实例如下:...可以将同一个主机同时归并到多个不同;此外,当如若目标主机使用非默认SSH端口,还可以主机名称之后使用冒号加端口号表明。...ansible_python_interpreter 5.3 条件测试 如果需要根据变量、facts或此前任务执行结果做为某task执行与否前提时要用到条件测试。...5.3.1 when语句 task后添加when字句即可使用条件测试;when语句支持jinja2表达式语句,例如: tasks: - name: 'shutdown debian flavored...在运行自上而下某playbook时,如果中途发生错误,所有已执行任务都可能回滚,更正playbook后重新执行一次即可。 taks目的是使用指定参数执行模块,而在模块参数可以使用变量

    3.5K20

    Ansible极简教程

    要获取指定远程主机支持所有facts,可使用如下命令进行: 1 #ansible hostname -m setup 5.1.3 register 把任务输出定义为变量,然后用于其他任务,实例如下...可以将同一个主机同时归并到多个不同;此外,当如若目标主机使用非默认SSH端口,还可以主机名称之后使用冒号加端口号表明。...5.3 条件测试 如果需要根据变量、facts或此前任务执行结果做为某task执行与否前提时要用到条件测试。...5.3.1 when语句 task后添加when字句即可使用条件测试;when语句支持jinja2表达式语句,例如: 1234 tasks: - name: 'shutdown debian flavored...在运行自上而下某playbook时,如果中途发生错误,所有已执行任务都可能回滚,更正playbook后重新执行一次即可。 taks目的是使用指定参数执行模块,而在模块参数可以使用变量

    4.1K30

    使用Ansible构建虚拟机模板二

    “第5章,使用Ansible构建用于部署虚拟机模板,通过构建虚拟机模板探索部署Linux最佳实践,虚拟机模板将以实际操作方式大规模部署虚拟机管理程序上。”...,只是我们现在在文件第一行有一个Ansible变量代替静态主机名。...Ansible,有许多方法都可以执行此任务,我们举一个简单例子。假设你有一个存档脚本,它使用bzip2压缩实用程序压缩文件。...我们一个名为bzip2result变量register(注册)stat模块运行结果,然后在任务上定义一个自定义故障条件,如果文件不存在,该条件将导致任务失败(从而使整个剧本运行失败)。...如果需要的话,我们可以通过对该任务使用changed_when子句更改此行为。 通过这种方式,多个Ansible 剧本可以放在一起,不仅可以自定义构建,还可以验证最终结果。

    22420

    2022年rhce最新认证—(满分通过)

    ]$ ansible dev -a "yum update" 第四题:使用 RHEL 系统角色(NEW) 使用 RHEL 系统角色 安装 RHEL 系统角色软件包,并创建符合以下条件 playbook...第四题:使用 RHEL 系统角色(OLD) 使用 RHEL 系统角色 安装 RHEL 系统角色软件包,并创建符合以下条件 playbook /home/greg/ansible/timesync.yml...) - phpinfo, (unknown version) 第六题:创建和使用角色 创建和使用角色 根据下列要求, /home/greg/ansible/roles 创建名为 apache 角色..., 该 play balancers 主机组主机上运行并将使用 balancer 角色。...第十三题:创建密码库 创建密码库 按照下方所述,创建一个 Ansible存储用户密码: 库名称为 /home/greg/ansible/locker.yml 库中含有两个变量,名称如下

    4.1K10
    领券