ansble剧本--day04--变量使用

ansible之变量简述

变量存在的意义

变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。

定义变量的方式

1.通过命令行进行变量定义

2.在playbook文件中进行变量定义

3.通过Inventory主机信息文件中进行变量定义

playbook文件定义变量

#缺陷:
	· 其他的playbook(也就是文中hosts主机)无法使用该变量

## 变量定义:
- hosts: all
  vars:
    zls_anzhuangbao:
      - httpd
      - mariadb

  tasks:
    - name: Install httpd and mariadb
      yum:
## 调用变量
        name: "{{ zls_anzhuangbao }}"
        state: present


- 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_files定义变量

# 注意:
	· 刚才在playbook中使用vars定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采取第二种定义变量的方式,在vars_file中定义变量。 
	
## 1.定义变量
[root@m01 ~]# vim /root/vars_file.yml
create_file: zls_vars_file


## 2.调用变量
[root@m01 ~]# vim var1.yml 
- hosts: web01
  vars_files: /root/vars_file.yml
  tasks:
    - name: Create file
      file:
        path: /root/{{ create_file }}
        state: touch
        
## 3.变量优先级
命令行 > 剧本 > 主机清单

intentory主机信息定义变量

# 注意:
	· 在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。

## 1.定义变量
[root@m01 ~]# vim /etc/ansible/hosts		
[web_group:vars]
create_file=zls_inventory

## 2.调用变量
- hosts: web01
  tasks:
    - name: Create file
      file:
        path: /root/{{ create_file }}
        state: touch

官方推荐定义变量

├── group_vars
│   └── web_group		# 此处定义目录必须为主机清单文件中的主机组名
├── host_vars
│   ├── web01			# 此处定义目录必须为主机清单文件中的主机名
│   └── web02

[root@m01 ansible]# cat host_vars/web01
create_file: qqq
[root@m01 ansible]# cat host_vars/web02
create_file: www
[root@m01 ansible]# cat group_vars/web_group 
create_file: xxx

## 调用阶段
[root@m01 ansible]# vim var3.yml 

- hosts: web_group
  tasks:
    - name: Create f
      file:
        path: /root/{{ create_file }}
        state: touch

注册变量

# 什么是注册变量
· 如在ansible剧本中直接使用shell模块,如查看磁盘信息,返回给ansible的结果其实并不是真正想要的信息,如无法直接显示信息,可调用显示。


# 案例演示
- hosts: web_group
  tasks:
    - name: jieya nginx
      unarchive:
        src: /usr/local/ansible/nginx_php.tgz
        dest: /root

    - name: panduan nginx zhuangmeizhuang
      shell: 'ls -l /etc/nginx'					# 使用shell模块查看web_group组中的主机目录信息
      register: nginx_info				        # 使用register调用结果,命名为nginx_info
      ignore_errors: yes                          

    - name: get nginx info
      debug:			                                # 配套语句
        msg: "{{ nginx_info.rc }}"	                        # 这里为调用结果显示,rc为子集变量,ls结果有为0,没有则为非零

    - name: install nginx
      shell: "cd /root/nginx_php && rpm -Uvh *rpm"
      when: nginx_info.rc != 0					# 可通过变量判断,如不等于0就,进行安装nginx

facts变量

# 关闭的意义
	· 默认为开启,开启后每次都需进行信息采集,导致ansible执行速度特别慢,可采用关闭方式

# fasts缓存
      · Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。

# fasts使用场景
      · 1.通过facts缓存检查CPU,来生成对应的nginx配置文件
      · 2.通过facts缓存检查主机名,生成不同的zabbix配置文件
      · 3.通过facts缓存检索物理机的内存大小来生成不通的mysql配置文件

综上所述的Ansible facts类似于saltstack中的grains对于做自动化的小伙伴是非常有用滴。

## 关闭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生成mysql配置文件
- 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=/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 }}

层级变量

# 编辑变量文件
lamp:
  framework:
    web_package: httpd
    db_package: mariadb-server
    php_package: php

lnmp:
  framework:
    web_package: nginx
    db_package: mysql
    php_package: php

lnmt:
  framework:
    web_package: nginx
    db_package: mysql
    java_package: tomcat

## 官方推荐写法
#官方推荐写法
[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'] }}"
原文地址:https://www.cnblogs.com/tcy1/p/13121621.html