4.自动化运维工具Ansible之变量

2022-03-08 分类:ansible 阅读(301) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.变量概述

变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如 nginx‐1.20 这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。

1.定义变量的方式

1.通过命令行进行变量定义
2.在play文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义

2.变量的优先级

如果在定义变量时,变量冲突了
在上述的三个地方分别设置了:
1.命令行中:age=11
2.play文件中:age=12
3.Inventory中:age=13
那么,最终的age结果一定是11
变量的读取优先级为:命令行 > playbook文件 > Inventory文件

2.变量定义

1.playbook中vars定义变量

方法一:
[root@mb01 ~]# cat /server/playbook/yum.yml 
---
- name: 安装卸载软件
  vars:
  - soft: tree
  - soft1: cowsay
  hosts: 172.16.1.7
  tasks:
  - name: 安装软件 "{{ soft }}" "{{ soft1 }}"
    yum:
      name:
      - "{{ soft }}"
      - "{{ soft1 }}"
      state: installed
方法二:
[root@mb01 ~]# cat /server/playbook/yum.yml 
---
- name: 安装卸载软件
  vars:
    soft:
    - nfs-utils
    - rpcbind
  hosts: 172.16.1.7
  tasks:
  - name: 安装{{ soft }}
    yum:
      name: "{{ soft }}"
      state: installed

2.使用Ansible内置变量

[root@mb01 ~]# cat /server/playbook/touch.yml 
---
- name: 创建文件
  hosts: webs
  tasks:
  - name: 开始创建文件
    file:
      path: /opt/{{ ansible_default_ipv4['address'] }}[1-10].txt
      state: touch

3.使用vars_file定义变量(也算是在playbook定义)

刚才我们学到在playbook中使用 vars 定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采 取第二种定义变量的方式,在 vars_file 中定义变量。

#定义阶段
[root@mb01 ~]# cat /server/playbook/vars/01_vars.yml 
soft:
- cowsay
- tree 
- vim
#调用阶段
[root@mb01 ~]# cat /server/playbook/yum.yml 
---
- name: 安装卸载软件
  vars_files:
  - /server/playbook/vars/01_vars.yml
  hosts: 172.16.1.7
  tasks:
  - name: 安装"{{ soft }}"
    yum:
      name: "{{ soft }}"
      state: installed

注意: 什么时候变量加上双引号 {{ ansible_facts }} 如果变量是开头的时候 加上双引号 "{{ sfy }}/a/b/c/cd/"

4.在Inventory中定义变量

注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。

#定义阶段
[root@mb01 ~]# cat /etc/ansible/hosts 
[webs]
172.16.1.7
172.16.1.8
[nfs]
172.16.1.51
[backup]
172.16.1.41
[webs:vars]
filename=nginx
#调用阶段
[root@mb01 ~]# cat /server/playbook/touch.yml 
---
- name: 创建文件
  hosts: webs
  tasks:
  - name: 开始创建文件
    file:
      path: /opt/{{ filename }}.txt
      state: touch

5.通过命令行覆盖变量

inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖。使用--extra-vars或-e 设定变量
[root@mb01 ~]# ansible-playbook ceshi.yml -e "file_name=sfy"

3.官方推荐变量定义

1.主机组定义变量

#定义阶段#group_vars目录下必须存放和inventory清单文件中定义的组名一致
[root@mb01 ~]#cat /server/playbook/group_vars/webs##文件名与hosts文件主机组名一致
filennn: 123
filenames: sss
#调用阶段
[root@mb01 ~]# cat  /server/playbook/touch.yml 
---
- name: 创建文件
  hosts: webs
  tasks:
  - name: 开始创建文件
    file:
      path: /opt/"{{ filenames }}".txt
      state: touch

#注意:系统提供了特殊的all组,也就说在group_vars目录下创建一个all文件,定义变量对所有的主机都生效

2.主机定义变量

#定义阶段
[root@mb01 ~]# cat /server/playbook/group_vars/webs 
filennn: 123
filenames: sss
web_server: httpd
[root@mb01 ~]# cat /server/playbook/host_vars/172.16.1.7 
web_server: nginx
#调用阶段
[root@mb01 ~]# cat /server/playbook/touch.yml
---
- name: 安装软件
  hosts: webs
  tasks:
  - name: 开始安装{{ web_server }}
    yum:
      name: "{{ web_server }}"
      state: installed
####注意执行后发下调用的变量是nginx,即主机变量优先于主机组
#命令行变量--->play中的vars_files--->play中的vars变量-->host_vars中定义的变量--->group_vars/组--->group_vars/all
-> 低

3.变量支持层级定义,使用"."会有问题,建议使用"[]"代替

#定义阶段
[root@m01 ~]# cat vars_file.yml
lamp:
  web:
web_package: httpd
db_package: mariadb-server
php_package: php
#调用阶段
[root@mb01 ~]# cat test.yml 
---
- hosts: all
  vars_files:
  - vars_file.yml
  tasks:
  - name: Installed httpd
    yum: name={{ lamp['web']['web_package'] }}
  - name: Install Mariadb
    yum: name={{ lamp.web.db_package }}

4.变量注册

当 absible 的模块在运行之后,其实都会返回一些 result 结果,就像是执行脚本,我们有的时候需要脚本给我们一些 return 返回值,我们才知道,上一步是否可以执行成功,但是…默认情况下, ansible 的 result 并不会显示出来,所 以,我们可以把这些返回值’存储’到变量中,这样我们就能通过’调用’对应的变量名,从而获取到这些 result ,这种将模块的返回值,写入到变量中的方法被称为变量注册

[root@mb01 ~]# cat /server/playbook/zhuce.yml
---
- name: ceshi register
  hosts: 172.16.1.7
  tasks:
  - name: 拷贝配置文件
    copy:
      src: /server/playbook/exports
      dest: /opt
    notify: 重载nginx
  - name: 查看nginx的状态
    shell: systemctl status nginx
    register: nx####################将上一个命令执行的结果赋值给nx
    ignore_errors: yes
  - name: 查看status状态
    debug:
      msg: "{{ nx }}"##############调用nx的值

5.facts变量

Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。 facts 包含每台特定的主机信息。比如:被控端的主 机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。

1.facts使用场景

1.通过 facts 缓存检查CPU,来生成对应的nginx配置文件
2.通过 facts 缓存检查主机名,生成不同的zabbix配置文件
3.通过 facts 缓存检索物理机的内存大小来生成不通的mysql配置文件
综上所述的Ansible facts类似于 saltstack 中的 grains 对于做自动化的小伙伴是非常有用滴。

2.facts基本用法

1显示所有 ansible facts
[root@mb01 ~]# ansible localhost -i hosts -m setup
Facts获取被控端主机名与ip地址,然后通过debug输出。
2.直接调用
[root@mb01 ~]# cat /server/playbook/get.ip.host.yml
---
- name: 获取ip和host名
  hosts: webs
  tasks:
  - name: 获取ip
    debug:
      msg:
      - this is "{{ ansible_all_ipv4_addresses }}"
      - this id "{{ ansible_fqdn }}" 
      - hoh "{{ ansible_python.version_info.0 }}"
3.facts开启后会影响Ansible主机的性能,如果没有采集被控端主机需求可选择关闭
[root@mb01 ~]# cat /server/playbook/get.ip.host.yml
---
- name: 获取ip和host名
  gather_facts: no####注意,此参数加上后将不获取fast变量,下面调用的将失效
  hosts: webs
  tasks:
  - name: 获取ip
    debug:
      msg:
      - this is "{{ ansible_all_ipv4_addresses }}"#####失效
      - this id "{{ ansible_fqdn }}" ########失效
      - hoh "{{ ansible_python.version_info.0 }}"#失效
##########注意,变量可以加减乘除
[root@mb01 ~]# vim /server/playbook/get.ip.host.yml 
---
- name: 获取ip和host名
#  gather_facts: no
  hosts: webs
  tasks:
  - name: 获取ip
    debug:
      msg:
      - this is "{{ ansible_all_ipv4_addresses }}"
      - this id "{{ ansible_fqdn }}"
      - hoh "{{ ansible_python.version_info.0 +1 }}"#####此处+1#注意,/会显示小数点,去掉小数点用//来除

3.fasts变量优化(缓存)

[root@mb01 ~]# cat ansible.cfg 
[defaults]
gathering = smart
fact_caching_timeout = 86400
fact_caching = redis
fact_caching_connection = 127.0.0.1:6379
# smart 表示默认收集facts,但facts已有的情况下不会收集,即使用缓存facts
# implicit表示默认收集facts,要禁止收集,必须使用gather_facts: False;
# explicit 则表示默认不收集,要显示收集,必须使用gather_facts: Ture.
#若Redis设置了密码
#fact_caching_connection = localhost:6379:0:admin

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1