变量名:仅能由字母、数字和下划线组成,且只能以字母开头

变量来源:

1.ansible all -m setup 远程主机的所有变量都可直接调用

#显示所有变量
ansible all -m setup
#显示特定的变量
ansible all -m setup -a 'filter=ansible_fqdn'
ansible all -m setup -a 'filter=ansible_hostname'
ansible all -m setup -a 'filter=*address*'

2.在/etc/ansible/hosts中定义

  • 普通变量:主机组中主机单独定义,优先级高于公共变量

  • 公共(组)变量:针对主机组中所有主机定义统一变量

3.通过命令行指定变量,优先级最高

ansible-playbook –e varname=value

4.在playbook中定义

vars:
– var1: value1
– var2: value2

5.在role中定义

变量定义:key=value

示例:http_port=80

变量调用方式:

  • 通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用”{{ variable_name }}”才生效
  • ansible-playbook –e 选项指定
ansible-playbook test.yml -e "hosts=www user=sogou"

变量调用优先级:

命令行(-e) > playbook定义 > hosts普通变量 > hosts分组变量

示例1:命令行变量赋值

vim app.yml
---
- hosts: appsrvs
remote_user: root tasks:
– name: install package
yum: name={{ pkname }}
– name: start service
service: name={{ pkname }} state=started enabled=yes # 变量赋值并执行:
ansible-playbook -e 'pkname=vsftpd' app.yml

示例2:playbook中赋值变量

vim app.yml
---
- hosts: appsrvs
remote_user: root
vars:
– pkname1: httpd
– pkname2: vsftpd tasks:
– name: install package
yum: name={{ pkname1 }}
– name: install package
yum: name={{ pkname2 }} #执行play-book
ansible-playbook app.yml
#验证
ansible appsrvs -m shell -a 'rpm -q httpd vsftpd'
#卸载
ansible appsrvs -m shell -a 'yum -y remove httpd vsftpd'

示例3:在ansible的清单文件(/etc/ansible/hosts)中定义普通变量

vim /etc/ansible/hosts
[websrvs]
192.168.30.101 httpd_port=81
192.168.30.102 httpd_port=82 vim hostname.yml
---
- hosts: websrvs
remote_user: root tasks:
– name: set hostname
hostname: name=www{{httpd_port}}.sogou.com #语法检查
ansible-playbook -C hostname.yml
#执行Playbook
ansible-playbook hostname.yml
#检查
ansible websrvs -a 'hostname'

示例4:在ansible的清单文件(/etc/ansible/hosts)中定义分组变量

vim /etc/ansible/hosts
[websrvs]
192.168.30.101 httpd_port=81
192.168.30.102 httpd_port=82 [websrvs:vars]
nodename=www
domainname=sogou.com vim hostname.yml
---
– hosts: websrvs
remote_user: root tasks:
– name: set hostname
hostname: name={{nodename}}{{http_port}}.{{domainname}} #语法检查
ansible-playbook -C hostname.yml
#执行Playbook
ansible-playbook hostname.yml
#检查
ansible websrvs -a 'hostname'

示例5:引用系统自带(setup)变量

ansible all -m setup |grep ansible_fqdn     #查看系统自带变量
vim var.yml
---
- hosts: websrvs
remote_user: root tasks:
– name: create log file
file: name=/search/{{ ansible_fqdn }}.log state=touch mode=600 owner=op_biz #语法检查
ansible-playbook -C var.yml
#执行Playbook
ansible-playbook var.yml
#检查
ansible websrvs -a 'ls -l /search'

示例6:定义变量到一个文件中

vim vars.yml
var1: httpd
var2: vsftpd vim testvar.yml
---
- hosts: websrvs
remote_user: root
vars_files:
- vars.yml tasks:
– name: install package
yum: name={{ var1 }}
– name: create file
file: name=/search/{{ var2 }}.log state=touch mode=600 owner=op_biz #语法检查
ansible-playbook -C testvar.yml
#执行Playbook
ansible-playbook testvar.yml
#检查
ansible websrvs -m shell -a 'rpm -q httpd'
ansible websrvs -m shell -a 'ls -l /search'

6.注册变量

注册变量,其实就是将操作结果,包括标准输出和标准错误输出,保存到变量中,然后再根据这个变量的内容来决定下一步的操作,在这个过程中用来保存操作结果的变量就叫注册变量。

[root@test2 playbook]# cat test.yml
--- #标记文件的开始
- hosts: all
remote_user: root
gather_facts: no #不收集对应主机的信息,这样运行会快点。
tasks:
- name: test the register variables
shell: uptime
register: results #使用关键字register声明注册变量,上面uptime命令产生的结果,存入到results中。结果是字典形式。 - name: print the register result
debug: msg="{{ results.stdout }}" #使用debug模块,打印出上面命令的输出结果。

上面的playbook执行结果如下:

[root@test2 playbook]# ansible-playbook test.yml 

PLAY [all] ******************************************************************** 

TASK: [test the register variables] *******************************************
changed: [10.0.102.212]
changed: [10.0.102.200]
changed: [10.0.102.162] TASK: [print the register result] *********************************************
ok: [10.0.102.212] => {
"msg": " 00:18:01 up 3 days, 2:56, 3 users, load average: 0.02, 0.03, 0.05" # msg的结果就是注册变量的标准输出
}
ok: [10.0.102.200] => {
"msg": " 00:18:04 up 4 days, 7:45, 3 users, load average: 0.03, 0.06, 0.05"
}
ok: [10.0.102.162] => {
"msg": " 00:18:04 up 4 days, 7:45, 3 users, load average: 0.01, 0.02, 0.05"
} PLAY RECAP ********************************************************************
10.0.102.162 : ok=2 changed=1 unreachable=0 failed=0
10.0.102.200 : ok=2 changed=1 unreachable=0 failed=0
10.0.102.212 : ok=2 changed=1 unreachable=0 failed=0 [root@test2 playbook]#

一个注册变量通常会有以下属性:

  • changed:任务是否对远程主机造成的变更。
  • delta:任务运行所用的时间。
  • stdout:正常的输出信息。
  • stderr:错误信息。
  • rc:返回值

显示全部全量

[@bjyf_50_20 ansible]# cat test1.yml
---
- hosts: songwanbo
remote_user: root
gather_facts: no
tasks:
- name: test the register variables
shell: uptime
register: results - name: print the register result
debug: msg="{{ results }}"
[@bjyf_50_20 ansible]#

结果

TASK [print the register result] *********************************************************
ok: [10.160.13.139] => {
"msg": {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"cmd": "uptime",
"delta": "0:00:00.012288",
"end": "2020-12-23 10:56:50.202287",
"failed": false,
"rc": 0,
"start": "2020-12-23 10:56:50.189999",
"stderr": "",
"stderr_lines": [],
"stdout": " 10:56:50 up 376 days, 17:56, 2 users, load average: 0.26, 0.18, 0.10",
"stdout_lines": [
" 10:56:50 up 376 days, 17:56, 2 users, load average: 0.26, 0.18, 0.10"
]
}
}

7.高阶变量

对于普通变量,在ansible命令行设定的,在hosts文件中定义的,或者在playbook中定义的等,这些都是普通变量,在引用时,可以使用使用{{ variable }}的形式。

ansible是用python语言写的,因此也支持一种叫做列表的变量,形式如下:


[root@test2 playbook]# cat test.yml
---
- hosts: all
remote_user: root
gather_facts: no
vars:
var_list: #注意形式,定义了var_list列表,取值方法和列表取值一样,不推荐使用jinja2的方法取值。
- one
- two
- three
tasks:
- name: test the list variables
shell: echo {{ var_list[0] }} #取列表中的第一个字,也就是one
register: results - name: print the register result
debug: msg="{{ results.stdout }}"

Ansible-Playbook中的变量使用的更多相关文章

  1. ansible playbook 变量

    变量优先级 在命令中定义的变量(-e参数指定的) 在inventory中定义的变量(ansible_ssh_user等) 其他变量(role中.play中) 系统通过father_facts定义的变量 ...

  2. Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件

    一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...

  3. Ansible Playbook 变量与 register 详解

    ansible 定义变量方式与[多层]变量引用,以及 register 详解 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录 ...

  4. ansible官方文档翻译之变量

    Ansible变量 在使用ansible变量的时候,主要是因为各个系统的不同,从而需要使用不同的变量来进行设置,例如在设置一些配置文件的时候,有大部分内容是相同的,但是一部分内容是和主机的ip地址或者 ...

  5. Ansible Playbook Variables

    虽然自动化存在使得更容易使事情重复,但所有的系统可能不完全一样. 在某些系统上,您可能需要设置一些与其他操作略有不同的行为或配置. 此外,一些观察到的远程系统的行为或状态可能需要影响如何配置这些系统. ...

  6. Ansible playbook基础组件介绍

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

  7. ansible入门四(Ansible playbook基础组件介绍)

    本节内容: ansible playbook介绍 ansible playbook基础组件 playbook中使用变量 一.ansible playbook介绍 playbook是由一个或多个“pla ...

  8. ansible playbook详解

    ansible playbook是由yml语法书写,结构清晰,可读性强,所以必须掌握yml基础语法 语法 描述 缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tabs键 ...

  9. (三)ansible playbook

    一,YAML语法 YAML的语法和其他高阶语言类似并且可以简单表达清单.散列表.标量等数据结构.(列表用横杆表示,键值对用冒号分割,键值对里又可以嵌套另外的键值对) YAML文件扩展名通常为.yaml ...

随机推荐

  1. Flutter App 真机调试

    Flutter App 真机调试 Deploy to iOS devices https://flutter.dev/docs/get-started/install/macos#deploy-to- ...

  2. vue2.0用法以及环境配置

    一.配置环境搭建 1.安装node.js (可以去官网看) 2.安装git (推荐看廖雪峰文章,点击查看) 3.安装vue: cmd:npm install vue //最新稳定版本 npm inst ...

  3. Redis-第九章节-动态字符串

    目录 概述 SDS(动态字符串) SDS(动态字符串)与c语言字符串的区别 1.概述 String类型底层实现的简单动态字符串sds,是可以修改的字符串.它采用预分配冗余空间的方式来减少内存的频繁分配 ...

  4. banner自用图床2

  5. AI数学基础之:奇异值和奇异值分解

    目录 简介 相似矩阵 对角矩阵 可对角化矩阵 特征值 特征分解 特征值的几何意义 奇异值 Singular value 奇异值分解SVD 简介 奇异值是矩阵中的一个非常重要的概念,一般是通过奇异值分解 ...

  6. SpringBoot读取配置文件的内容

    1.@Value读取 在springboot项目中,如果要读取配置文件application.properties或application.yml文件的内容,可以使用自带的注解@Value.以prop ...

  7. Go语言学习:01-基本语法

    目录 基本语法 源文件构成 数据类型 基本类型变量 数组 切片 创建切片 调整容量 字符串与切片 常量 String Map 控制 条件语句 if switch 循环语句 函数 函数定义 函数变量 闭 ...

  8. Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker

    前面写了篇文章,mapboxgl实现带箭头轨迹线,介绍了如何基于mapboxgl实现类似高德地图导航轨迹效果. 下图是我基于leaflet实现的效果. 接下来分享一下在我基于leaflet实现该效果时 ...

  9. 解决 DatePickerDialog 在 Android7.0 API24 上使用 AlertDialog.THEME_TRADITIONAL、AlertDialog.THEME_HOLO_DARK、AlertDialog.THEME_HOLO_LIGHT等样式时无法显示为 Spinner 样式的问题

    DatePickerDemoForAndroid24 解决 DatePickerDialog 在 Android7.0 API24 上使用AlertDialog.THEME_TRADITIONAL.A ...

  10. nignx的location正则匹配

    原文链接:http://nginx.org/en/docs/http/ngx_http_core_module.html Syntax: location [ = | ~ | ~* | ^~ ] ur ...