[toc]
Ansible的变量
变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,
在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还
方便维护,减少维护的成本。
定义变量的方式
- 通过命令行进行变量定义
- 在play文件中进行变量定义
- 通过Inventory主机信息文件中进行变量定义
变量的优先级
变量的读取优先级为:
 命令行 > playbook文件 (vars_file>vars)>host_vars>group_vars> Inventory文件
变量定义
Inventory定义变量
| 12
 3
 
 | [web_group:vars]uid="438"
 user_name="xxx"
 
 | 
playbook中vars定义变量
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | 
 
 
 - hosts: web_group
 vars:
 packages:
 - httpd
 - mariadb-server
 - php
 - php-mysql
 - php-pdo
 tasks:
 - name: Install httpd  mariadb php Server
 yum:
 name: "{{ packages }}"
 
 
 - hosts: web_group
 vars:
 - web_server: httpd
 - db_server: mariadb-server
 - php_server:
 - php
 - php-mysql
 - php-pdo
 tasks:
 - name: Install httpd  mariadb php Server
 yum:
 name:
 - "{{ web_server }}"
 - "{{ db_server }}"
 - "{{ php_server }}"
 
 
 | 
使用vars_file定义变量
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 
 | 
 
 
 
 vim vars1.yml
 web_server: httpd
 vim vars2.yml
 db_server: mariadb-server
 
 - hosts: web_group
 vars_files: ./vars1.yml
 tasks:
 - name: Install httpd  mariadb php Server
 yum:
 name: "{{ web_server }}"
 
 
 
 vim vars1.yml
 web_server: httpd
 vim cat vars2.yml
 db_server: mariadb-server
 
 
 - hosts: web_group
 vars_file:
 - ./vars1.yml
 - ./vars2.yml
 - name: Install httpd  mariadb php Server
 yum:
 name:
 - "{{ web_server }}"
 - "{{ db_server }}"
 
 
 - hosts: web_group
 vars:
 - remote_ip: "{{ ansible_default_ipv4['address'] }}"
 - remote_hostname: "{{ ansible_fqdn }}"
 tasks:
 - name: Touch IP File
 file:
 path: /root/{{ remote_ip }}
 state: touch
 
 - name: Touch Hostname File
 file:
 path: /root/{{ remote_hostname }}
 state: touch
 
 | 
变量注册
为什么要用变量注册?
当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是…默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值’存储’到变量中,这样我们就能通过’调用’对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册
register(注册变量)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 
 | register
 debug
 
 
 msg:
 var:
 verbosity:
 
 
 
 - hosts: web_group
 tasks:
 - name: 查看nginx目录 输出结果注册为变量
 shell: "ls -l /etc/nginx"
 register: xxx
 
 - name: 获取注册变量值 nginx目录的返回值
 debug:
 msg: "{{ xxx }}"
 
 
 - hosts: web_group
 tasks:
 - name: 查看nginx目录 输出结果注册为变量
 shell: "ls -l /etc/nginx"
 register: xxx
 
 - name: 获取注册变量值 nginx目录的返回值
 debug:
 msg: "{{ xxx.stdout_lines }}"
 
 
 - hosts: web_group
 tasks:
 - name: 查看nginx目录 输出结果注册为变量
 shell: "ls -l /etc/nginx"
 register: xxx
 
 - name: 获取注册变量值 nginx目录的返回值
 debug:
 msg: "{{ xxx.rc }}"
 
 
 - hosts: web_group
 tasks:
 - name: 查看nginx目录 输出结果注册为变量
 shell: "ls -l /etc/nginx"
 register: xxx
 
 - name: 获取注册变量值 nginx目录的返回值
 debug:
 msg: "{{ xxx.rc }}"
 - name: 安装nginx和php
 shell: cd /opt && yum localinstall -y *.rpm
 when: xxx.rc != 0
 
 | 
facts缓存
什么是facts缓存
Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。
比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等
facts使用场景
- 通过facts缓存检查CPU,来生成对应的nginx配置文件
- 通过facts缓存检查主机名,生成不同的zabbix配置文件
- 通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件
facts基本用法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | vim facts.yml
 - hosts: web_group
 tasks:
 - name: Get Host Info
 debug:
 msg: >
 Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"
 
 
 vim facts.yml
 - hosts: web_group
 gather_facts: no
 tasks:
 
 | 
facts生成zabbix配置文件
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | - hosts: web_group
 vars:
 - zabbix_server: 172.16.1.71
 tasks:
 - name: copy zabbix agent conf
 template:
 src: ./zabbix_agentd.conf
 dest: /tmp/zabbix_agentd.conf
 
 | 
facts生成mysqld配置文件
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | - hosts: db_group
 tasks:
 - name: Install mysql server
 yum:
 name: mariadb-server
 state: present
 
 - name: copy mysql  conf
 template:
 src: ./my.cnf
 dest: /etc/my.cnf
 
 
 vim /etc/my.cnf
 [mysqld]
 basedir=/usr
 datadir=/var/lib/mysql/
 socket=/var/lib/mysql/mysql.sock
 log_error=/var/log/mariadb/mariadb.log
 innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}
 
 |