Ansible中的变量分为三种:
- 用户自定义变量(剧本中,存放在指定的文件中)
- register(寄存器)变量 类似于 $? $()
- facts变量(ansible内置变量)
权威指南:Ansible变量
用户自定义变量
放在剧本中
ansible支持在剧本中直接书写变量
剧本文件
1 2 3 4 5 6 7 8 9 10 11
| - hosts: all vars: - name1: nc - name2: nmap tasks: - name: install soft yum: name: - "{{ name1 }}" - "{{ name2 }}" state: installed
|
放在文件中
ansible支持在剧本中指定一个存放变量的文件
剧本文件
1 2 3 4 5 6 7 8 9
| - hosts: all vars_files: vars.yml tasks: - name: install soft yum: name: - "{{ name1 }}" - "{{ name2 }}" state: installed
|
变量文件可自定义名称:vars.yml
根据主机组创建变量文件
ansible支持根据主机组使用不同变量文件,只需要根据主机组创建不同的变量所在目录,在剧本中会自动根据主机组使用变量。
注意:可以在inventory文件所在目录创建变量目录(在inventory部分已经讲解),也可以在剧本所在目录进行创建,但是不要重复创建。
配置文件(部分)
1 2 3 4 5 6 7 8 9
| tree -F group_vars/
group_vars/ ├── all/ │ └── vars.yml ├── backup/ │ └── vars.yml └── web/ └── vars.yml
|
剧本文件
1 2 3 4 5 6
| - hosts: all tasks: - name: touch file file: path: /tmp/{{ name }} state: touch
|
变量文件
注意:在ansible剧本中使用变量时,如果变量位于表达式开头的位置,则整个表达式都要使用双引号。
注册变量
register关键字可以将某个task任务的执行结果存储至一个变量中,最后使用debug输出变量内容,可以用于后续排障。也可以用于与when
语句一起使用实现判断功能。
register变量的作用范围是整个playbook中的任务,register变量会保存任务执行的结果,在剧本中的任何后续任务中都可以引用这些register变量。
应用案例:显示ip地址并排错
1 2 3 4 5 6 7 8
| - hosts: all tasks: - name: print ip addr shell: hostname -I |awk '{print $NF}' register: ip_addr # 将结果存储在一个名为ip_addr的变量中(通过register关键字) - name: debug debug: msg: this is you ip addr {{ ip_addr }} # 使用debug模块输出一条消息,注册变量默认输出的是json格式的数据
|
结果分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| { 'stderr_lines': [], u'changed': True, u'end': u'2021-08-19 09:56:21.545851', 'failed': False, u'stdout': u'172.16.1.31', u'cmd': u\"hostname -I |awk '{print $NF}'\", u'rc': 0, u'start': u'2021-08-19 09:56:21.514319', u'stderr': u'', u'delta': u'0:00:00.031532', 'stdout_lines': [u'172.16.1.31'] }
ip_addr.stdout_lines ip_addr.rc ip_addr.stdout ip_addr.stderr
|
facts变量
facts变量是在被管理主机上通过ansible自动采集发现的变量。
facts变量中包含每台特定的主机信息。比如:被控端主机的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。
facts使用场景(利用fact获取指标进行配置)
- 通过facts检查CPU,来生成对应的Nginx配置文件 (收集每台机器的cpu核心数)
- 通过facts检查主机名信息,来生成不同的Zabbix配置文件(收集每台机器的主机名)
- 通过fact检索的内存情况来自定义mysql的配置文件 (收集每台机器的内存)
- 通过facts收集内存大小,设置tomcat最多可以用多少内存 (收集每台机器的内存)
ansible backup -m setup
可以显示远程主机所有的facts变量
1 2 3 4 5 6 7 8
| #常用必备的facts
ansible_default_ipv4.address # 默认的网卡ip eth0 ansible_distribution # 系统发行版本名字 CentOS Ubuntu Debian ... ansible_memtotal_mb # 内存大小 ansible_processor_vcpus # cpu数量 ansible_processor_cores # cpu 核心数 ansible_date_time.date # 时间
|
分发nginx配置文件剧本
1 2 3 4 5 6 7 8 9 10 11
| -host: web tasks: -name: send nginx conf template: src: nginx-conf-muban.j2 dest: /etc/nginx/nginx.conf backup: yes -name: restart nginx systemd: name: nginx state: restarted
|
nignx模板文件(部分)
1 2 3 4 5 6 7 8 9
| cat nginx-conf-muban.j2
user www; worker_processes "{{ ansible_processor_cores*2 }}"; # 进程数设置为CPU数量的两倍
error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;
......
|