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
获取指定主机的变量,例如想获取对应
相关推荐
Xyz996_3 小时前
Ansible进行Nginx编译安装的详细步骤
运维·ansible
元气满满-樱1 天前
ansible-hoc 模块使用
运维·ansible
南山nash1 天前
Ansible安装使用详细教程
ansible
ice_bird1 天前
Ansible 一键部署k8s1.28配置完整版
kubernetes·ansible
元气满满-樱2 天前
Ansible-Playbook
ansible
元气满满-樱2 天前
ansible部署nfs
ansible
码界奇点2 天前
基于Django与Ansible的自动化运维管理系统设计与实现
运维·python·django·毕业设计·ansible·源代码管理
嘻哈baby3 天前
Ansible自动化运维入门:从手工到批量部署
运维·自动化·ansible
Warren983 天前
面试和投简历闲聊
网络·学习·docker·面试·职场和发展·eureka·ansible