Ansible 变量
变量概述
变量提供了便捷的方式来管理Ansible playbook 的每一个项目中的动态值,比如nginx -1.6.3 这个软件包的版本,在其他地方或许会反复使用,那么如果将此值设置为变量,然后在其他的playbook 中调用,会方便很多,方便维护,减少维护的成本。
定义变量的方式
- 通过命令行进行变量定义
- playbook,在play文件中进行变量定义
- 主机清单,通过主机信息文件中进行变量定义
如何定义变量
1.在playbook中定义变量
#方法一:- hosts: db02 vars: pkg: - MySQL-python - mariadb-server tasks: - name: yum: name: "{{ pkg }}" state: present #方法二:- hosts: db01 vars: web_pkg: httpd db_pkg: - unzip - vsftpd php_pkg: - php-fpm - php - php-mysql
2.使用vars_file定义变量
#定义阶段[root@m01 project]# vim vars_file.ymlweb_pkg: httpddb_pkg: mariadb-serverphp_pkg: php#调用阶段[root@m01 project]# vim httpd.yml - hosts: web_group vars_files: ./vars_file.yml tasks: - name: Install httpd yum: name: "{{ db_pkg }}" state: present
3.使用Ansible内置变量
vim mkdri.yml- hosts: web_group tasks: - name: MKDIR file: path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }} state: directory recurse: yes
4.使用主机清单定义变量 ,
注意: 主机的变量高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱
#定义阶段[web_group]zls_web01 ansible_ssh_host=172.16.1.7zls_web02 ansible_ssh_host=172.16.1.8[web_group:vars]web_pkg=nginx[backup_group]backup ansible_ssh_host=172.16.1.41[db_group]db01 ansible_ssh_host=172.16.1.51db02 ansible_ssh_host=172.16.1.52[nfs_group]nfs ansible_ssh_host=172.16.1.31[rsync_server:children]web_groupbackup_group[rsync_server:vars]web_pkg=httpd[nfs_server:children]web_groupnfs_group#调用阶段- hosts: zls_web01 tasks: - name: Install web server yum: name: "{{ web_pkg }}" state: present
5.官方推荐变量定义方式
值钱的几种变量定义都不是很好用,比较好用的是在Ansible 项目目录下创建两个变量目录:
host_vars
group_hosts
切记,目录名字一定要一致,不能做任何修改。
1.主机组定义变量
#定义阶段#创建主机组变量定义目录mkdir group_vars[root@m01 ~]# vim group_vars/websweb_pkg: httpd#定义阶段[root@m01 ~]# cat group_vars/webs web_pkg: httpd#定义阶段[root@m01 ~]# cat host_vars/zls_web01 web_pkg: nginx[root@m01 ~]# vim web.yml - hosts: webs tasks: - name: Install web server yum: name: "{{ web_pkg }}" state: present
6.命令行定义变量
通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆盖,使用 --extra-vars 或者-e 设置变量
#调用阶段[root@m01 ~]# !vimvim web.yml - hosts: webs tasks: - name: Install httpd Server yum: name: - "{{ web_pkg }}" - name: Install mariadb Server yum: name: - "{{ db_pkg }}"#定义阶段[root@m01 ~]# ansible-playbook web.yml -e "web_pkg=vsftpd" -e "db_pkg=unzip"
Ansible变量优先级测试
定义阶段:
#定义playbook[root@m01 ~]# vim test.yml- hosts: webs vars: dir: playbook_vars vars_files: ./vars_file.yml tasks: - name: Create Dir file: path: /opt/{{ dir }} state: directory
#定义vars_files[root@m01 ~]# vim vars_file.ymldir: vars_file
#定义host_vars中的web01[root@m01 ~]# vim host_vars/zls_web01dir: host_vars
#定义group_vars[root@m01 ~]# vim group_vars/websdir: group_vars
测试阶段:
#1.命令行测试[root@m01 ~]# ansible-playbook test.yml -e "dir=command_vars"#查看到命令行定义的文件[root@web01 ~]# ll /opt/total 0drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars#2.正常执行playbook[root@m01 ~]# ansible-playbook test.yml#再次出现的是vars_files 定义的内容[root@web01 ~]# ll /opt/total 0drwxr-xr-x 2 root root 6 Sep 19 16:48 command_varsdrwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file#3.取消调用vars_files[root@m01 ~]# vim test.yml - hosts: webs vars: dir: playbook_vars tasks: - name: Create Dir file: path: /opt/{{ dir }} state: directory[root@m01 ~]# ansible-playbook test.yml#再次出现的是playbook调用的[root@web01 ~]# ll /opt/total 0drwxr-xr-x 2 root root 6 Sep 19 16:48 command_varsdrwxr-xr-x 2 root root 6 Sep 19 16:52 playbook_varsdrwxr-xr-x 2 root root 6 Sep 19 16:50 vars_file#4.取消playbook调用的- hosts: webs tasks: - name: Create Dir file: path: /opt/{{ dir }} state: directory[root@m01 ~]# ansible-playbook test.yml
**结论: **
命令行 > vars_file > playbook vars > host_vars > group_vars
变量注册
当ansible 的模块在运行之后,其实都会返回一些result 结果,就像是执行脚本,我们有的时候需要脚本给我们一些return 返回值,我们才知道,上一步是否可以执行成功,但是,在默认情况下, ansible的 result并不会显示出来,所以,我们可以把这些返回值存储到变量中,这样就可以调用对应的变量名,从而得到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册。
debug模块常用参数:msg : 调试输出的消息var : 将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
verbosity: debug的级别(默认是0级,全部显示)
示例:
变量注册"{{ list_dir }}"
#编写剧本[root@m01 vars]# cat register.yml - hosts: gjy_web01 tasks: - name: test vars shell: "ls -l /root" register: list_dir - name: return result debug: msg: "{{ list_dir }}" #查看执行结果 [root@m01 vars]# ansible-playbook register.yml PLAY [gjy_web01] ********************************************************************************************************************************************TASK [Gathering Facts] **************************************************************************************************************************************ok: [gjy_web01]TASK [test vars] ********************************************************************************************************************************************changed: [gjy_web01]TASK [return result] ****************************************************************************************************************************************ok: [gjy_web01] => { "msg": { "changed": true, "cmd": "ls -l /root", "delta": "0:00:00.008826", "end": "2019-09-20 03:36:38.313543", "failed": false, "rc": 0, "start": "2019-09-20 03:36:38.304717", "stderr": "", "stderr_lines": [], "stdout": "total 8-rw-------. 1 root root 1430 Aug 2 04:57 anaconda-ks.cfg-rwxr-xr-x. 1 root root 473 Aug 1 20:44 host_ip.shdrwxr-xr-x 9 1001 1001 186 Sep 19 18:40 nginx-1.16.0", "stdout_lines": [ "total 8", "-rw-------. 1 root root 1430 Aug 2 04:57 anaconda-ks.cfg", "-rwxr-xr-x. 1 root root 473 Aug 1 20:44 host_ip.sh", "drwxr-xr-x 9 1001 1001 186 Sep 19 18:40 nginx-1.16.0" ] }}PLAY RECAP **************************************************************************************************************************************************gjy_web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ###############################################################################################注意:rc就想当于命令行执行完命令,echo $? 的返回值,返回值为0 的时候证明执行成功##############################################################################################
优化版,只输出自己想要的内容 "{{ list_dir['stdout_lines'] }}"
#调用stdout_lines ,只显示想要的内容[root@m01 vars]# cat register.yml - hosts: gjy_web01 tasks: - name: test vars shell: "ls -l /root" register: list_dir - name: return result debug: msg: "{{ list_dir['stdout_lines'] }}"#查看结果[root@m01 vars]# ansible-playbook register.yml PLAY [gjy_web01] ********************************************************************************************************************************************TASK [Gathering Facts] **************************************************************************************************************************************ok: [gjy_web01]TASK [test vars] ********************************************************************************************************************************************changed: [gjy_web01]TASK [return result] ****************************************************************************************************************************************ok: [gjy_web01] => { "msg": [ "total 8", "-rw-------. 1 root root 1430 Aug 2 04:57 anaconda-ks.cfg", "-rwxr-xr-x. 1 root root 473 Aug 1 20:44 host_ip.sh", "drwxr-xr-x 9 1001 1001 186 Sep 19 18:40 nginx-1.16.0" ]}PLAY RECAP **************************************************************************************************************************************************gjy_web01 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansibl e层级定义变量
#编辑变量文件[root@m01 ~]# vim vars_file.ymllamp: framework: web_package: httpd db_package: mariadb-server php_package: phplnmp: framework: web_package: nginx db_package: mysql php_package: phplnmt: framework: web_package: nginx db_package: mysql java_package: tomcat#编辑playbook文件[root@m01 ~]# vim test.yml- hosts: web_group vars_files: ./vars_file.yml tasks: - name: Install LAMP httpd yum: name: "{{ lamp.framework.web_package }}" - name: Install LAMP mariadb-server yum: name: "{{ lamp.framework.db_package }}" - name: Install LAMP php yum: name: "{{ lamp.framework.php_package }}" #官方推荐写法[root@m01 ~]# vim test.yml- hosts: web_group vars_files: ./vars_file.yml tasks: - name: Install LAMP httpd yum: name: "{{ lamp['framework']['web_package'] }}" - name: Install LAMP mariadb-server yum: name: "{{ lamp['framework']['db_package'] }}" - name: Install LAMP php yum: name: "{{ lamp['framework']['php_package'] }}"#执行playbook[root@m01 ~]# ansible-playbook test.ymlPLAY [web_group] *****************************************************************************************************************************************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************ok: [web01]ok: [web02]TASK [Install LAMP httpd] ********************************************************************************************************************************************************************************************************************ok: [web02]ok: [web01]TASK [Install LAMP mariadb-server] ***********************************************************************************************************************************************************************************************************ok: [web02]ok: [web01]TASK [Install LAMP php] **********************************************************************************************************************************************************************************************************************ok: [web02]ok: [web01]PLAY RECAP ***********************************************************************************************************************************************************************************************************************************web01 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0web02 : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- hosts: webs tasks: - name: mem file: path: /opt/{{ ansible_facts['fqdn'] }} #path: /root/{{ ansible_fqdn }} state: directory
facts缓存
Ansible facts是在被管理追击上通过Ansible 自动采集发现的变量, facts 包含每台特定的主机信息。
比如:被控端的主机名,IP 地址,系统版本,CPU数量,内存状态,次盘状态等等。
facts使用场景 :
1.通过 facts 缓存检查CPU,来省城对应的nginx配置文件
2.通过 facts 缓存主机名,生成不同的zabbix 配置文件
3. 通过 facts 缓存检查物理机的内存大小来生成不同的mysql配置文件
综上所述的Ansible facts 类似于saltstack 中的 grains 对于做自动化非常有用的
facts 基本用法
#编辑[root@m01 ~]# vim facts.yml- hosts: web_group tasks: - name: Get Host Info debug: msg: > Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"#执行[root@m01 ~]# ansible-playbook facts.yml[root@m01 ~]# ansible-playbook facts.ymlPLAY [web_group] *****************************************************************************************************************************************************************************************************************************TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************ok: [web02]ok: [web01]TASK [Get Host Info] *************************************************************************************************************************************************************************************************************************ok: [web01] => { "msg": "Hostname "web01" and IP "10.0.0.7""}ok: [web02] => { "msg": "Hostname "web02" and IP "10.0.0.8""}PLAY RECAP ***********************************************************************************************************************************************************************************************************************************web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0web02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
关闭facts
[root@m01 ~]# vim facts.yml- hosts: web_group gather_facts: no #关闭信息采集 tasks:
facts 生成zabbix配置文件
- 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 配置文件
- 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[root@m01 ~]# vim /etc/my.cnf[mysqld]basedir=/usrdatadir=/var/lib/mysql/socket=/var/lib/mysql/mysql.socklog_error=/var/log/mariadb/mariadb.loginnodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}