1.Ansible变量最常见的是以下四种:
1.1.ansible变量可以用命令行(不推荐)
1.2.在剧本中vars定义一个变量
1.3.在配置文件中做变量(推荐多个剧本都可使用)
1.4.ansible内置一个变量facts
2.剧本引用变量是用两个花括号{{变量名}},一般用debug模块:
msg 打印的自定义消息
var 要调试的变量名。与msg选项互斥。
verbosity 一个控制调试运行时间的数字,如果设置为3,则仅在-vvv或更高版本时运行调试
例如:
#定义一个变量file变量内容/etc/hostname
- hosts:web
vars:
file: /etc/hostname
tasks:
- name: print var
debug:
msg: 变量file内容是 {{file}}
3.在配置文件中做变量(推荐多个剧本都可使用)
例如:在ansible目录下建立一个vars-file.yml文件,其它剧本也可调用
vim vars-file.yml #名字随变
file: /etc/hostname #写入变量file
dir: /root #写入变量dir
#保存退出
编写使用变量yml
- hosts: web #主机清单分组可根据自己的实际情况来
vars_files: ./vars-file.yml #调用变量文件,
task:
- name: print var
debug:
msg: '{{dir}}变量file的内容是{{file}}'
常见问题:ansible什么时候加引号?
一般在变量开头的时候加引号。
4.根据主机清单自动识别变量
通过主机清单里面的分组进行变量共享
比如:我想让hosts主机清单组中的web组服务器 的port80 ,date组服务器 的port837口
在ansible目录文件夹下创建
mkdir -p group_vars
#先建立一个group_vars/ 文件夹
#group_vars/ 目录下得文件夹一定要和主机清单中的分组名必须一致
例如:
group_vars/
lb/vars.yml #存放lb组的变量
web/vars.yml #存放web组的变量
data/vars.yml #存放data组的变量
all/vars.yml #所有主机共用的变量
#注意ansible调用变量一般是就近原则,很少两个一块写的,二选一
在web文件中的vars.yml写入:
port:80
在data文件中的vars.yml写入:
port:837
编写剧本:
- hosts: web
tasks:
- name: print var
debug:
msg: '当前的服务的端口号是{{port}}'
- hosts: data
tasks:
- name: print var
debug:
msg: '当前的服务的端口号是{{port}}'
5.定义变量小结:
命令行定义变量:不推荐,临时定义创建
剧本中定义变量:常用,vars好处:易于理解,缺点只限于当前剧本
变量文件:都存放在一个文件中,优点:vars_files方便管理与维护,缺点:无法针对某些主机进行定义
根据分组变量:在group_vars目录下存放,定义剧本中可根据组
6.ansible内置变量facts
facts收集主机信息:一般获取主机名,IP,cpu等
ansible -i hosts test1 -m setup #查看facts变量
#常用的facts变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小总计mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4 #默认网卡IP
ansible_date_time.data #时间
ansible_distribution #系统发行版本
ansible_processor_cores #CPU核心数
下级目录后面直接加点
例如:ansible_date_time.data #时间
ansible_date_time": {
"date": "2022-08-29",
},
例子:
#批量分发motd文件,文件内容根据不同机器变化
#01.创建motd模板文件
#02.分发文件到/etc/motd替换
vim motd.j2
#welcom to linux
#hostname: {{ansible_hostname}}
#eth0.ip: {{ansible_default_ipv4}}
#内存大小:{{ansible_memtotal_mb}}
#发行版本:{{ansible_distribution}}
#CPU数量: {{ansible_processor_vcpus}}
#CPU核心数:{{ansible_processor_cores}}
编写剧本
vi facts.yaml
- host: all
task:
- name: fenfa /etc/motd
template:
src: ./motd.j2
dest: /etc/motd
backup: yes
注意如果用copy模块,机器是无法解析的,出现的是motd.j2编写的内容,所以用template模块,功能跟copy模块一样,但是能解析
7.关闭facts变量增加剧本执行速度
在剧本中增加:gather_facts: false
例子:
vi facts.yaml
- host: all
gather_facts: false
task:
- name: fenfa /etc/motd
template:
src: ./motd.j2
dest: /etc/motd
backup: yes