文章目录
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
获取指定主机的变量,例如想获取对应