hualinux 进阶 2-1.11:ansible 剧本Playbooks(八) 剧本playbooks变量

目录

一、playbooks变量介绍

二、使用例子及说明

2.1 命令行变量

2.2 主机清单Inventory中定义变量

2.3 在Playbook中定义

2.4 Role中定义变量

2.5 系统信息变量(facts)

2.6 注册变量(register)

2.6.1 register 说明

2.6.2 例子


在下面学角色roles模板之前,还得重新回顾一下Playbooks变量。使用好变量对后面的使用模板template很重要。

一、playbooks变量介绍

在使用模板之前,先回顾一下ansbile有如下变量,也可以看ansible官方文档的playbook变量

  • 命令行
  • 在Inventory中定义
  • 在Playbook中定义
  • 在Role中定义
  • 注册变量(register)
  • 系统信息变量(facts)

二、使用例子及说明

2.1 命令行变量

命令行变量,就可以把变量写在playbooks中,然后使用ansible-playbook命令加 -e参数, -e为 EXTRA_VARS的意思,就可以使用了

例子:

#编写一个playbook,获取指定网卡接口的IP v4地址
# 取 interface 变量值,这个变量我在下面命令行中定义
[root@vm82 ansible]# cat yaml-conf/t1.yml 
---
- hosts: 
  - hua 
  remote_user: root
  tasks: 
    - name: find {{ interface }} ip address
      shell: ip addr show {{ interface }} |grep 'inet\>'|awk {'print $2'}


#在命令行中,定义一个 变量 interface并赋值为ens33
[root@vm82 ansible]# ansible-playbook yaml-conf/t1.yml -e interface=ens33 -v
Using /etc/ansible/ansible.cfg as config file

PLAY [hua] *********************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.3.21]

TASK [find ens33 ip address] ***************************************************************************************
changed: [192.168.3.21] => {"changed": true, "cmd": "ip addr show ens33 |grep 'inet\\>'|awk {'print $2'}", "delta": "0:00:00.154328", "end": "2020-09-14 15:35:01.708922", "rc": 0, "start": "2020-09-14 15:35:01.554594", "stderr": "", "stderr_lines": [], "stdout": "192.168.128.21/24", "stdout_lines": ["192.168.128.21/24"]}

PLAY RECAP *********************************************************************************************************
192.168.3.21               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

上面的  -e interface=ens33 就是定义一个变量interface并赋值为ens33

2.2 主机清单Inventory中定义变量

我在《ansible 剧本Playbooks(一) 介绍、组件及使用》的“清单Inventory”已经讲过了。

我这里还是写了下吧,我在hosts主机列表中定义一个http_port变量

#/etc/ansible/hosts的hua主机组中定义一个http_port变量,值为80
[hua]
192.168.3.21  http_port=80

#在t2.yml中取ansible hosts配置中变量http_port的值
[root@vm82 ansible]# cat yaml-conf/t2.yml 
---
- hosts: 
  - hua 
  remote_user: root
  tasks: 
    - name: print http_port
      debug: msg="the {{ inventory_hostname }} http port is {{ http_port }} "

#执行效果
[root@vm82 ansible]# ansible-playbook yaml-conf/t2.yml 

PLAY [hua] ********************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [192.168.3.21]

TASK [print http_port] ********************************************************************************************************
ok: [192.168.3.21] => {
    "msg": "the http port is 80 "
}

PLAY RECAP ********************************************************************************************************************
192.168.3.21               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@vm82 ansible]# 
[root@vm82 ansible]# 
[root@vm82 ansible]# ansible-playbook yaml-conf/t2.yml 

PLAY [hua] ********************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************
ok: [192.168.3.21]

TASK [print http_port] ********************************************************************************************************
ok: [192.168.3.21] => {
    "msg": "the 192.168.3.21 http port is 80 "
}

PLAY RECAP ********************************************************************************************************************
192.168.3.21               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

PS:ansible特殊变量中的魔法变量,所谓的魔法变量,它的值是变化的,不需要你赋值,它会自动按特定规则取。看一下它的解释就知道怎用了。

2.3 在Playbook中定义

这个就不用说了吧,前面都讲很多了,比如

#下面vars表示定义变量
[root@vm82 ansible]# cat yaml-conf/config_nginx.yml 
---
- hosts: hua
  remote_user: root
  vars:
  - indexhtml: /disk1/www/hualinux.com/index.html
  - service: nginx

2.4 Role中定义变量

这个前面也讲了,直接在vars目录中建立即可,如nginx角色的

#定义一个 install_dir 变量,赋值为 /disk1/tools
[root@vm82 ansible]# cat roles/nginx/vars/main.yml 
install_dir: /disk1/tools

2.5 系统信息变量(facts)

这个也更简单,使用

ansible <主机名/主机组> -m setup 

里面列出的变量,直接使用即可,比如查看操作系统版本

#编写剧本
[root@vm82 ansible]# cat yaml-conf/t3.yml 
---
- hosts: 
  - hua 
  remote_user: root
  tasks: 
    - name: print system and version
      debug: msg=" {{ ansible_distribution }} {{ ansible_distribution_major_version }}"


#查看执行效果
[root@vm82 ansible]# ansible-playbook yaml-conf/t3.yml 

PLAY [hua] **********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.3.21]

TASK [print system and version] *************************************************************************************
ok: [192.168.3.21] => {
    "msg": " CentOS 8"
}

PLAY RECAP **********************************************************************************************************
192.168.3.21               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

2.6 注册变量(register)

2.6.1 register 说明

这个重要得好好学一下,注册变量简单来说就是

把模块执行的结果保存在一个变量中,只不过这个变量名固定放在key为register的对象中。

形式为: register: 变量名

我们把放在register中的变量叫注册变量。

变量的另一个主要用途是在运行命令时,把命令结果存储到一个变量中.不同模块的执行结果是不同的.运行playbook时使用-v选项可以看到可能的结果值. 在ansible执行任务的结果值可以保存在变量中

如果能把模块的执行结果放在一个变量中,那就有无限种玩法了,我可以使用shell脚本、命令、python等等

得到的结果也可以是各种类型,再结合后面的jinja2强大的语法,那模板可以玩出各种花样了。

2.6.2 例子

比如判断某个网站目录是否存在,写法如下:

[root@vm82 ansible]# cat yaml-conf/register.yml 
---
- hosts: hua
  remote_user: root  
  vars:
    site_dir: /disk1/www/hualinux.com
  tasks:  
  - name: "判断网站 /disk1/www/hualinux.com 目录是否为空"
    shell: if [ -d {{ site_dir }} ];then echo true;else echo false;fi
    register: IsStieDirEmpty  

#执行效果
[root@vm82 ansible]# ansible-playbook yaml-conf/register.yml  -v
Using /etc/ansible/ansible.cfg as config file

PLAY [hua] **********************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.3.21]

TASK [判断网站 /disk1/www/hualinux.com 目录是否为空] **************************************************************************
changed: [192.168.3.21] => {"changed": true, "cmd": "if [ -d /disk1/www/hualinux.com ];then echo true;else echo false;fi", "delta": "0:00:00.011901", "end": "2020-09-14 18:43:23.083345", "rc": 0, "start": "2020-09-14 18:43:23.071444", "stderr": "", "stderr_lines": [], "stdout": "true", "stdout_lines": ["true"]}

PLAY RECAP **********************************************************************************************************
192.168.3.21               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值