首页 > 系统相关 >Linux架构27 Ansible变量, 定义变量的方式, 变量注册, facts缓存

Linux架构27 Ansible变量, 定义变量的方式, 变量注册, facts缓存

时间:2024-03-29 18:11:36浏览次数:13  
标签:27 变量 vars ansible Ansible m01 root name

Ansible变量

一、变量概述

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

二、定义变量的方式

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

如果在定义变量时,变量冲突了
在上述的三个地方分别设置了:
    1.命令行中:age=11
    2.play文件中:age=12
    3.Inventory中:age=13
    那么,最终的age结果一定是11
    变量的读取优先级为:命令行 > playbook文件 > Inventory文件
    
#注意:变量命名,应该由字母、数字、下划线组成,必须以字母开头

 

1.在playbook文件中进行变量定义

1)方式一:在模块下定义变量

- name: Install LNMP
  yum:
      name: "{{ packages }}"
  vars:
      packages:
        - nginx
        - php
        - mariadb-server

2)方式二:在hosts下面直接定义变量

[root@m01 base]# vim install.yml
- hosts: web_group
  vars:
    package:
      - httpd
      - mariadb-server
      - MySQL-python
      - php
      - nginx
  tasks:
    - name: Install Server
      yum:
        name: "{{ package }}"

3)方式三:在hosts下面直接定义多个变量

[root@m01 base]# vim install.yml
- hosts: web_group
  vars:
    web:
      - httpd
      - nginx
    db:
      - mariadb-server
      - MySQL-python
      
  tasks:
    - name: Install Server
      yum:
        name: "{{ web }}"
        
    - name: Install DB Server
      yum:
        name: "{{ db }}"

 

2.通过vars_files定义变量

刚才我们学到在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。

所以我们可以采取第二种定义变量的方式,在vars_file中定义变量。

#1.配置变量文件
[root@m01 base]# vim vars.yml
web_server: nginx
db_server: mariadb-server

#2.调用变量文件再使用变量
[root@m01 base]# vim host.yml
- hosts: db_group
  vars_files: /project/base/vars.yml
  tasks:
    - name: Install Mariadb Server
      yum:
        name: "{{ db_server }}"

#3.定义多个变量文件
[root@m01 base]# vim host.yml
- hosts: db_group
  vars_files: 
      - /project/base/vars.yml
      - /project/base/vars2.yml
  tasks:
    - name: Install Mariadb Server
      yum:
        name: "{{ nginx }}"

 

3.直接使用内置变量

[root@m01 ~]# ansible "web01" -m setup    #setup模块,获取主机信息(看内置变量)
web01 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.0.0.7", 
            "172.16.1.7"
        ], 
    ...

# ansible_all_ipv4_addresses就是内置变量,查看内置变量
[root@m01 ~]# ansible "web01" -m setup -a 'filter=ansible_all_ipv4_addresses'
[root@m01 ~]# ansible "web01" -m setup -a 'filter=ansible_default_ipv4'

#直接使用内置变量
[root@m01 ~]# vim mkdir.yml
- hosts: web03
  tasks:
    - name: Create DIR
      file:
        path: /tmp/{{ ansible_default_ipv4['address'] }}#路径下变量可以不加引号,里面也可以.address
        state: directory

[root@m01 ~]# ansible-playbook mkdir.yml
[root@web03 tmp]# ls
10.0.0.9

#可以把内置参数写在vars_file中,也可以定义变量再使用
[root@m01 ~]# vim mkdir.yml
- hosts: web03
  vars:
    - remote_ip: "{{ ansible_default_ipv4['address'] }}"
  tasks:
    - name: Create IP DIR
      file:
        path: /tmp/{{ remote_ip }}
        state: directory
        
#实例
[root@m01 ~]# vim mkdir.yml
- hosts: web_group
  tasks:
    - name: Create Backup DIR
      file:
        path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time.date }}    #ansible_fqdn:主机名
        state: directory

[root@m01 ~]# ansible-playbook mkdir.yml
[root@web01 backup]# ls
web01_10.0.0.7_2024-03-27
[root@web02 backup]# ls
web02_10.0.0.8_2024-03-27

 

4.在Inventory主机清单中进行变量定义

#1.配置主机清单
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='admin123'
web02 ansible_ssh_pass='admin123'

[db_group]
db01 ansible_ssh_pass='admin123'
db02 ansible_ssh_pass='admin123'
db03 ansible_ssh_pass='admin123'

[web_group:vars]    #对web_group组定义变量
web_server=nginx
------------------------------------------
#2.调用变量
[root@m01 base]# vim install.yml
- hosts: web_group
  tasks:
    - name: Create WEB Dir
      file:
        path: /tmp/{{ web_server }}
        state: directory
#检查结果
[root@m01 base]# ansible-playbook install.yml
[root@web01 tmp]# ls
nginx
------------------------------------------

#3.对整合组定义变量
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_pass='admin123'
web02 ansible_ssh_pass='admin123'

[db_group]
db01 ansible_ssh_pass='admin123'
db02 ansible_ssh_pass='admin123'
db03 ansible_ssh_pass='admin123'

[web_group:vars]
web_server=nginx    #优先级高于整合组的优先级

[nfs_client:children]    #设置整合组
db_group
web_group

[nfs_client:vars]    #对整合组定义变量
web_server=http
------------------------------------------
#4.调用变量
[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ web_server }}
        state: directory
------------------------------------------
#查看创建目录
[root@m01 base]# ansible 'all' -m shell -a 'ls /tmp'

#注意:
    主机组定义的变量优先级比整合组调用的变量优先级高
    先读取整合组的变量,后读取组的变量,则组的变量将覆盖整合组的变量

 

5.通过host_vars和group_vars定义变量

之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
host_vars
group_vars
切记,目录名字一定要一致,不能做任何修改(ansible会到yml同级目录下去找这个名字,不需要调用)

1)主机组定义变量

#创建组变量的目录,不能改名字
[root@m01 base]# mkdir group_vars

#目录下的名字要与主机清单里面组名相同
[root@m01 base]# vim group_vars/web_group
web_server: http

#调用变量
[root@m01 base]# vi mkdir.yml
- hosts: web_group    # 会去yml同级目录下group_vars里找web_group
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ web_server }}
        state: directory

2)主机定义变量

#创建主机变量的目录,不能改名字
[root@m01 base]# mkdir host_vars

#目录下的名字要与主机清单里面主机名相同
[root@m01 base]# vim host_vars/db01
web_server: host_vars

#调用变量
[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ web_server }}
        state: directory
#注意:
    主机组定义的变量优先级比整合组调用的变量优先级高,主机定义的变量优先级比主机组定义的变量优先级高

 

6.通过命令行进行变量定义(使用--extra-vars或者-e设置变量)

[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ web_server }}
        state: directory
        
#命令行指定变量的值
[root@m01 base]# ansible-playbook mkdir.yml -e "web_server=commond"

#远端查看文件
[root@m01 base]# ansible 'all' -m shell -a 'ls /tmp'

#指定多个变量
[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ web_server }}
        state: directory
        
    - name: Create db DIR
      file:
        path: /tmp/{{ db_server }}
        state: directory
        
[root@m01 base]# ansible-playbook mkdir.yml -e "web_server=commond" -e "db_server=mysql"

 

7.变量引用优先级测试

#配置playbook变量
[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  vars:
    web_server: playbook_vars
  vars_files:
    - ./vars_file.yml
  tasks:
    - name: Create Backup DIR
      file:
        path: /opt/{{ web_server }}
        state: directory
        
#配置var_file变量
[root@m01 base]# vim var_file.yml
web_server: vars_files

#主机清单定义变量
[root@m01 base]# vim /etc/ansible/hosts
[web_group:vars]
web_server=inventory_vars

#host_vars定义变量
[root@m01 base]# vim host_vars/web01
web_server: host_vars

#group_vars定义变量
[root@m01 base]# vim group_var/web_group
web_server: group_vars

#命令行变量
[root@m01 base]# ansible-playbook mkdir.yml -e "web_server=command"

#测试后优先级结果:
命令行 > var_files > playbook_vars > host_vars > group_vars配置组变量 > group_vars配置整合组变量 > 主机清单定义组变量 > 主机清单定义整合组变量

 

8.层级定义变量 (很少这么用)

[root@m01 ~]# vim vars_file.yml
lamp:
  framework:
    web_package: httpd
    db_package: mariadb-server
    php_package: php
    
lnmp:
  framework:
    web_package: nginx
    db_package: mysql
    php_package: php
    
lnmt:
  framework:
    web_package: nginx
    db_package: mysql
    php_package: tomcat
    
#编辑playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp.framework.web_package }}"    #不能写lamp.framework,不认

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp.framework.db_package }}"
        
    - name: Install LAMP php
      yum:
        name: "{{ lamp.framework.php_package }}"
        
#官方推荐写法
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp['framework']['web_package'] }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp['framework']['db_package'] }}"
        
    - name: Install LAMP php
      yum:
        name: "{{ lamp['framework']['php_package'] }}"

 

三、变量注册

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

1.变量注册配置

#创建目录获取过程
[root@m01 ~]# vim test.yml
- hosts: web01
  tasks:
    - name: Create Dir
      file:
        path: /tmp/{{ ansible_fqdn }}
        state: directory
      register: get_mkdir_status    #register获取上面创建的过程放到自己定义的变量中

    - name: Get register
      debug:    #用于输出内容
        msg: "{{ get_mkdir_status }}"
        
[root@m01 ~]# ansible-playbook test.yml

#查看目录,执行得不到想要的结果
[root@m01 ~]# vim test.yml
- hosts: web01
  tasks:
    - name: List Dir /tmp
      shell: "ls -l /tmp"

#使用变量注册获取想要的结果
[root@m01 ~]# vim test.yml
- hosts: web01
  tasks:
    - name: List Dir /tmp
      shell: "ls -l /tmp"
      register: list_dir

    - name: Get list_dir
      debug:
        msg: "{{ list_dir }}"
        
#只输出我们想要的内容
- hosts: web01
  tasks:
    - name: List Dir /tmp
      shell: "ls -l /tmp"
      register: list_dir

    - name: Get list_dir
      debug:
        msg: "{{ list_dir.stdout_lines }}"
        #msg: "{{ list_dir['stdout_lines'] }}"    #官方写法也可以

2.变量注册一般使用场景(判断)

[root@m01 ~]# vim status.yml
- hosts: web01
  tasks:
    - name: Install Httpd Server
      yum:
        name: httpd

    - name: Check httpd Status
      shell: systemctl is-active httpd
      ignore_errors: yes    #忽略报错(如果不写,返回错误就结束了,不会往下走)
      register: check_httpd

    - name: Http Restart    #返回启动,就重启
      systemd:
        name: httpd
        state: restarted
      when: check_httpd.rc == 0

    - name: Http Start        #返回异常,就启动
      systemc:
        name: httpd
        state: started
      when: check_httpd.rc != 0

 

四、facts缓存

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

1.facts使用场景

1.通过facts缓存检查CPU,来生成对应的nginx配置文件
2.通过facts缓存检查主机名,生成不同的zabbix配置文件
3.通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件

综上所述的Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用的。

2.关闭facts

#如果使用ansible内置变量的话,不能关闭facts缓存
[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  gather_facts: false    #跳过gather_facts步骤,速度变快,但是无法获取内置变量
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ ansible_fqdn }}
        state: directory
[root@m01 base]# ansible-playbook mkdir.yml #报错,无法获取ansible_fqdn变量

#如果不使用ansible内置变量的话,关闭facts会提高ansible管理其他机器的速度
[root@m01 base]# vim mkdir.yml
- hosts: nfs_client
  gather_facts: false    #跳过gather_facts步骤,速度变快,但是无法获取内置变量
  tasks:
    - name: Create Backup DIR
      file:
        path: /tmp/{{ web_server }}
        state: directory

3.一般配置

[root@m01 base]# vim redis.yml
bind {{ ansible_default_ipv4['address'] }}

[root@m01 base]# vim conf.yml
- hosts: all
  tasks:
    - name: Config Redis Conf
      template:    #识别内置变量要用template模块,copy模块无法识别
        src: ./redis.conf
        dest: /tmp/

#远端查看
[root@web01 tmp]# cat redis.conf
bind 10.0.0.7

 

标签:27,变量,vars,ansible,Ansible,m01,root,name
From: https://www.cnblogs.com/ludingchao/p/18104376

相关文章

  • nuxt3_配置环境变量
    配置.env文件在根目录下添加不同的环境文件.env.devNUXT_PUBLIC_API_BASE=http://192.168.110.209:8000NUXT_API_KEY=my-api-key-devNUXT_TEST_VARIABLE=devNUXT_TEST_TEST_VARIABLE=ZZYYNUXT_ENVIRONMENT=development.env.localNUXT_PUBLIC_API_BASE=http:......
  • LeetCodeHot100 动态规划 70. 爬楼梯 118. 杨辉三角 198. 打家劫舍 279. 完全平方
    70.爬楼梯https://leetcode.cn/problems/climbing-stairs/description/?envType=study-plan-v2&envId=top-100-likedpublicintclimbStairs(intn){if(n<=1)returnn;int[]dp=newint[n+1];dp[1]=1;dp[2]=2;......
  • 【概率论与数理统计】Chapter2 随机变量及其分布
    随机变量与分布函数随机变量随机变量:一个随机变量是对随机现象可能的结果的一种数学抽象分布函数分布函数:X为随机变量,F(x)......
  • ansible维护
     参考:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/unarchive_module.html1,检测网络-hosts:allgather_facts:nobecome:yestasks:-name:Installtraceroutepackage:name:"{{item}}"state:present......
  • 变量以及八大数据类型介绍
    ​变量以及八大数据类型介绍1变量1.1学习变量的目的#学习变量有助于我们在程序中存储和操作数据,提高代码质量,更方便我们操作和修改数据。1.2学习基本数据类型的目的#是在不同的场景下使用对应的数据类型来操作数据2八大数据类......
  • 学习变量的目的及基本数据类型介绍
    今日练习1.如何书写python的注释语法【1】单行注释单行注释是指只对一行进行注释,一旦换了一行就不生效了注释方法:#注释内容快速注释单行代码【2】多行注释多行注释适用于代码块注释方法:英文状态下的三个单引号或者双引号,头尾皆需要"""内容"""'''内......
  • ansible脚本
    -hosts:allgather_facts:nobecome:yestasks:-name:Installtraceroutepackage:name:"{{item}}"state:presentwith_items:-traceroute-name:checkipshell:"{{item}}"register:......
  • 2.虚拟环境 常量 变量
    【一】PIP换源1)作用提高使用pip安装第三方包的速度2)永久换源打开控制台或终端,并输入以下命令:pipconfigsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/更改pip源后,可以通过以下命令验证:pipconfiggetglobal.index-url如果返回值为https://mir......
  • HCIP-Datacom(H12-821)题库补充(3/27)
                  最新HCIP-Datacom(H12-821)完整题库请扫描上方二维码访问,持续更新中。运行OSPF协议的路由器,所有接口必须属于同一个区域。A:正确B:错误答案:B解析:OSPF的邻居关系是基于接口的,可以不同的接口属于不同的区域。ACL本质上是一种报文......
  • SAP Fiori开发中的JavaScript基础知识2 - 变量,操作符,值,类型
    1.JavaScript代码示例在介绍JavaScript具体语法前,让我们先看一段在Web应用程序过程中的JS代码片。<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title>FirstJavaScriptApplication!</title> <scriptsrc="js/myExternal.js&q......