Ansible变量定义以及引用

文章目录

ansible中是支持使用变量的,进行存储整个项目中会使用到的一些值

变量定义规则

1、变量的名称必须使用字母开头

2、由字母 数字 下划线组成

3、ansible内置的关键字是不可以作为变量名

变量的调试

引用变量需要知道变量包含哪些信息,对变量做处理,使用debug模块可以进行调试变量输出

bash 复制代码
#常用的参数有
msg:调试输出的信息
var:把某个变量传递给debug debug会直接打印输出,不可以和msg共用

案例
###编写剧本
[root@m01 http]# cat debug.yml
- name: debug
  hosts: nfs
  tasks:
        - name: debug
          debug:
                msg: "This is debug message!"


###验证
[root@m01 http]# ansible-playbook debug.yml

PLAY [debug] ******************************************************************************************************************************************************

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

TASK [debug] ******************************************************************************************************************************************************
ok: [nfs] => {
    "msg": "This is debug message!"
}

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

Inventory中定义变量

此变量的定义就是使用的ansible.cfg配置文件中的选项,在前面添加ansible_就会变成内置的变量,内置变量比ansible.cfg配置文件中更高的优先级,可以针对不同的主机定义不同的值
写在hosts的文件里面的变量每一个playbook都支持引用,单个在playbook里面的的var定义的变量只能在当前剧本使用

bash 复制代码
#配置文件中的值
[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts     #自定义配置的主机文件路径
#library        = /usr/share/my_modules/
#sudo_user      = root      #设置提权用户
#ask_sudo_pass = True       #提权用户密码
#ask_pass      = True       #是否进行使用密码的方式
#transport      = smart
#remote_port    = 22
#module_lang    = C
#module_set_locale = False

#怎么进行定义主机和主机组的变量?
写在主机的配置文件中,/etc/ansible/hosts
[root@m01 http]# tail -5 /etc/ansible/hosts
[test]
nfs
[test:vars]
abc=nginx


#定义的变量怎么进行引用?
在写playbook的时候使用debug进行引用
[root@m01 http]# ansible-playbook debug.yml

PLAY [debug] *******************************************************************

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

TASK [debug] *******************************************************************
ok: [nfs] => {
    "msg": "nginx"
}

PLAY RECAP *********************************************************************
nfs                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Var定义变量

var可以在写playbook的时候直接进行定义变量,将下面play任务中会使用到的变量提前进行定义

语法为

vars:

复制代码
变量

变量
bash 复制代码
设置httpd为变量,使用playbook进行启动
#写剧本
[root@m01 http]# cat var.yml
- name: var
  hosts: nfs
  vars:
        fuwu: httpd
  tasks:
        - name: start httpd
          systemd:
                name: "{{fuwu}}"
                state: started
                enabled: yes


##执行剧本
[root@m01 http]# ansible-playbook var.yml

PLAY [var] *********************************************************************

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

TASK [start httpd] *************************************************************
changed: [nfs]

PLAY RECAP *********************************************************************
nfs                        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
Var_files引入变量文件

当需要使用多个参数做为变量进行使用的时候,可以创建变量文件,使用var_file进行引入

bash 复制代码
#创建变量文件,变量定义的格式均是使用冒号键值对进行出现的,键值对之间可以进行嵌套组成大字典
[root@m01 http]# cat user_vars.yml
users:
        bjones:
                first_name: Bob
                last_name: Jones
                home_dirs: /users/bjones
        acook:
                first_name: Anne
                last_name: Cook
                home_dirs: /users/acook

编写playbook进行引用
1、我要获取到bjones的lastname和acook的first_name
#编写剧本    ###注意使用debug参数的msg进行输出内容,msg只能出现一次,不然也只会执行最后一个msg的内容,可以使用,写多参数
[root@m01 http]# cat var.yml
- name: var
  hosts: nfs
  vars_files:
        - /http/user_vars.yml
  tasks:
        - name: debug
          debug:
                msg: "{{users.bjones.last_name}},{{users.acook.first_name}}"



##验证
[root@m01 http]# ansible-playbook var.yml

PLAY [var] *********************************************************************

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

TASK [debug] *******************************************************************
ok: [nfs] => {
    "msg": "Jones,Anne"
}

PLAY RECAP *********************************************************************
nfs                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
注册变量register

注册变量是 Ansible 中的 <font style="color:rgba(0, 0, 0, 0.85);">register</font>关键字 ,它的核心作用是: 把一个任务的完整执行结果(包括输出内容、返回码、执行状态等)保存到一个自定义的变量中,供后续的任务调用和判断使用

bash 复制代码
#案例,查看磁盘空间并且使用debug模块将数据调用出来
[root@m01 http]# cat register.yml
- name: register
  hosts: nfs
  tasks:
        - name: shell
          shell:
                cmd: df -Th
          register: cipan
        - name: debug
          debug:
                msg: "{{cipan}}"
fact变量

fact是内置变量,不需要定义,直接调用即可,模块setup,可以进行获取远程主机的相关信息,并且可以将信息作为变量进行调用,setup模块依赖的方法就是fact,返回的数据是JSON格式

bash 复制代码
setup模块是怎么进行调用的
1、查看所有的fact信息
[root@m01 http]# ansible nfs -m setup   #显示的所有关键字段都是可以进行直接调用的变量

2、查看网卡信息
ansible nfs -m setup -a 'filter=ansible_ens33' 

3、查看主机内存信息
[root@m01 http]# ansible nfs -m setup -a 'filter=ansible_*_mb'
nfs | SUCCESS => {
    "ansible_facts": {
        "ansible_memfree_mb": 1209,
        "ansible_memory_mb": {
            "nocache": {
                "free": 1660,
                "used": 320
            },
            "real": {
                "free": 1209,
                "total": 1980,
                "used": 771
            },
            "swap": {
                "cached": 0,
                "free": 2047,
                "total": 2047,
                "used": 0
            }
        },
        "ansible_memtotal_mb": 1980,
        "ansible_swapfree_mb": 2047,
        "ansible_swaptotal_mb": 2047,
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}

4、将查到的setup变量保存在test.txt文件方便查询
[root@m01 http]# ansible nfs -m setup > /tmp/test.txt


5、开启或者关闭fact
语法
- hosts:test 
  gather_facts:false  #关闭,默认是开启的
  tasks:
      - name: test
        setup

6、进行自定义fact
除了ansible的内置变量之外还支持进行为某主机定制fact,配置文件写在/etc/ansible/facts.d/目录下
文件是ini或者json格式ansible会自动识别,

ini格式的fact文件。定义的语法如下
[general]
package = httpd
service = httpd
state = started
创建好文件之后需要把这个fact文推送到对应被控端,因为这个是在本地定义的
1、编写剧本,把fact文件使用copy模块复制过去
copy src:fact文件路径   dest:/etc/ansible/facts.d 【没有这个目录就先创建】
2、执行剧本\完成fact推送
3、查看是否设置成功
ansible 主机 -m setup -a 'filter=ansible_local'



general即为变量   在playbook里面进行调用是使用.连接不同的层级,找到对应的变量,例如
ansible_local.custom.general.package

ansible_local是必须要写的,因为定义的是本地变量
custom 是定义的fact的文件名字
general.package  文件里面定义的变量层级  找到自己想要的变量

7、使用set_fact 模块定义新的变量
是直接在编写的playbook中进行定义,可以把不同的变量组合起来
案例:
编写playbook
[root@m01 http]# cat set.yml
- name: set var
  hosts: nfs
  tasks:
      - name: set
        set_fact:
                version: "{{ ansible_distribution }}-{{ansible_distribution_version }}"
      - name: debug
        debug:
                msg: "{{ version }}"


#执行具备
[root@m01 http]# ansible-playbook set.yml

PLAY [set var] *****************************************************************

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

TASK [set] *********************************************************************
ok: [nfs]

TASK [debug] *******************************************************************
ok: [nfs] => {
    "msg": "CentOS-7.7"
}

PLAY RECAP *********************************************************************
nfs                        : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
lookup变量

在需要将文本文件或.csv文件和直接获取某些命令的输出作为变量的时候,就需要使用lookup插件进行读取配置数据,注意lookup获取的变量是来自主控的

bash 复制代码
#使用lookup生成变量的方法
语法:
定义的变量名字:"{{ lookup('使用哪种方式','获取的参数') }}"

1、file
使用file可以从文本文件中进行获取数据,在task或者jinja2的模块里面进行引用
#获取ssh公钥并且生成变量案例
- hosts: nfs
  set_fact:
    key_conntent:"{{lookup('file','/root/.ssh/id_rsa_pub')}}"
- name:
  debug:
    msg: "{{keycontent}}"

2、pipe
使用pipe可以直接调用外部命令,并且将命令执行的结果打印为标准输出
set_fact:
  time: "{{lookup('pipe','date+%Y%M%d%H%M%S')}}"

3、env
获取主机上某个环境变量
#获取被控端的jar环境变量
- name:jar
  debug:
    msg: "{{lookup('env','JAVA_HOME')}}"
魔法变量

ansible默认会进行提供一下内置的变量实现一些特定的功能

bash 复制代码
1、hostvar
获取指定主机的变量,例如想获取对应
相关推荐
cly118 分钟前
Ansible自动化(九):循环语句
windows·自动化·ansible
cly124 分钟前
Ansible自动化(十):配置文件管理模块(lineinfile / blockinfile)
运维·自动化·ansible
tyatyatya1 天前
Ansible自动化配置,从入门到实战
运维·自动化·ansible
lbb 小魔仙2 天前
【Linux】Ansible 自动化运维实战:2000+ 节点配置标准化教程
linux·运维·ansible
扑火的小飞蛾5 天前
【Ansible学习笔记01】 批量执行 shell 命令
笔记·学习·ansible
oMcLin5 天前
如何在 Red Hat Linux 服务器上使用 Ansible 自动化部署并管理多节点 Hadoop 集群?
linux·服务器·ansible
linux修理工8 天前
vagrant ubuntu 22.04 ansible 配置
ubuntu·ansible·vagrant
biubiubiu07069 天前
Ansible自动化
运维·自动化·ansible
秋42710 天前
ansible配置与模块介绍
ansible
秋42710 天前
ansible剧本
linux·服务器·ansible