Ansible之Varialbes—3


变量的基本概述
变量的使用
变量冲突
变量注册
facts变量


一、变量的基本概述


变量的含义

以一个固定的字符串表示一个不固定的值


二、变量的使用


  • 定义变量
    1.在playbook中定义变量
    vars:表示关键字
root@manager~/project1]# cat f2.yml 
- hosts: webservers
  vars: 
    - file_name: playbook_vars
  #调用共享var_file文件
  vars_files: ./vars_file.yml
  tasks:
    - name: Create New File
      file: 
        path: /tmp/{{ file_name }}
        state: touch

传输完成后,会在web端生成一个playbook_vars
[root@web~]# ls /tmp/
playbook_vars

2.vars_file 属于一种共享的方式

[root@manager~/project1]# cat vars_file.yml 
web_packages: httpd
ftp_packages: vsftpd

[root@manager~/project1]# cat f2.yml 
- hosts: webservers
  vars: 
    - file_name: playbook_vars
  #调用共享var_file文件
  vars_files: ./vars_file.yml
  tasks:
    - name: Create New File
      file: 
        path: /tmp/{{ file_name }}
        state: touch
    - name: Installed Packages {{ web_packages }}
      yum:
        name: "{{ web_packages }}"
        state: present
  • 在inventory主机清单中定义变量
    1.清单文件中直接定义 hosts文件定义
[root@manager~/project1]# cat hosts
[webservers]
172.16.1.7 
172.16.1.8 
[webservers:vars]
file_name=hostsfile_group_vars

[root@manager~/project1]# cat f3.yml 
- hosts: webservers
  tasks:
    - name: Create New File
      file: 
        path: /tmp/{{ file_name }}
        state: touch
[root@web~]# ls /tmp/
hostsfile_group_vars

2.创建hosts_vars group_vars 目录

[root@manager~/project1]# mkdir host_vars
[root@manager~/project1]# mkdir group_vars

#1.单个主机定义和使用方式 (host_vars能分别对不同的主机定义变量)
[root@manager project1]# cat host_vars/172.16.1.7 
host_vars_name: 172.16.1.7
[root@manager project1]# cat host_vars/172.16.1.8 
host_vars_name: 172.16.1.8

 [root@manager project1]# cat f4.yml 
- hosts: webservers
  tasks:
    - name: Create New File
      file:
        path: /opt/{{ host_vars_name }}
        state: touch

#2.针对主机组定义的方式 
#给指定的webserver组设定变量.其他组主机无法使用该变量
[root@manager project1]# cat group_vars/webservers 
group_host_vars: webservers

[root@manager project1]# cat f5.yml 
- hosts: webservers
  tasks:
    - name: Create New File {{ group_host_vars }}
      file:
        path:  /opt/{{ group_host_vars }}
        state: touch

#3.针对主机组定义的方式  (给所有的主机和主机组设定变量)
[root@manager project1]# cat group_vars/all 
group_host_vars: all
①单个主机定义和使用方式 (host_vars能分别对不同的主机定义变量)
[root@manager project1]# cat host_vars/172.16.1.7 
host_vars_name: 172.16.1.7
[root@manager project1]# cat host_vars/172.16.1.8 
host_vars_name: 172.16.1.8
[root@manager project1]# cat f4.yml 
- hosts: webservers
  tasks:
    - name: Create New File
      file:
        path: /opt/{{ host_vars_name }}
        state: touch
② 针对主机组定义的方式(给指定的webserver组设定变量,其他组无法使用该变量)
[root@manager~/project1]#  cat group_vars/webservers 
group_host_vars: webservers

[root@manager~/project1]# cat f5.yml 
- hosts: web
  tasks:
    - name: Create New File {{ group_host_vars}}
      file:
        path: /opt/{{ group_host_vars }}
        state: touch
③ 针对主机组定义的方式 (给所有的主机和主机组设定变量)
[root@manager~/project1]#  cat group_vars/all
group_host_vars: all

[root@manager~/project1]# cat f5.yml 
- hosts: web
  tasks:
    - name: Create New File {{ group_host_vars}}
      file:
        path: /opt/{{ group_host_vars }}
        state: touch
  • 通过外置传参定义变量 -e
[root@manager~/project1]# cat f6.yml 
- hosts: web
  tasks:
    - name: Create New File {{ web_vars}}
      file:
        path: /opt/{{ web_vars }}
        state: touch
[root@manager~/project1]#  ansibe-palybook -i hosts f6.yml -e "web_vars=123"
[root@backup~]# ls /opt/   #(172.16.1.41)
123  webservers

三、变量冲突


定义相同的变量不同的值,来测试变量的优先级,操作步骤:
① 在playbook中定义vars变量
② 在playbook中定义vars_files变量
③ 在inventory主机定义变量
④ 在inventory主机组定义变量
⑤ 在host_vars中定义变量
⑥ 在group_vars中定义变量组
⑦ 通过执行命令传递变量

优先级测试:
外置传入参数优先级最高 ---> playbook ( vars_files(共享)--->vars(私有) )  
---> host_vars  --> group_vars/group_name ---> group_vars/all

四、变量注册


[root@manager project1]# cat f8.yml 
- hosts: webservers
  tasks:
        # System_Status=$(netstat -lntp)
    - name: Get Network Status
      shell: netstat -lntp | grep "nginx"
      register: System_Status
        # echo "$System_Status"
    - name: Debug output Variables
      debug:
        msg: "{{ System_Status.stdout_lines }}"

五、facts变量


Ansible facts是在被管理主机上通过ansible自动采集发现的变量。facts包含每台特定的主机信息。如被控端主机的主机名、ip地址、系统版本、CPU数量、内存状态、磁盘状态……
facts使用场景
1)通过facts变量检查被控端硬件CPU信息,从而生成不同的Nginx配置文件
2)通过facts变量检查被控端主机名称信息,从而生成不同的Zabbix配置文件
3)通过facts变量检查被控端内存状态信息,从而生成不同的memcached的配置文件
4)通过facts变量……

#1.根据主机的cpu信息,生成不同的配置.
    A: 1核心    work_process 1;
    B: 2核心    work_process 2;   
[root@manager~/project1]# cat f10.yml 
- hosts: webservers
  tasks:  
    - name: Configure Nginx.conf
      template:
        src: ./file/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
[root@manager~/project1]# cat file/nginx.conf.j2 
user www;
worker_processes  {{ ansible_processor_vcpus }};
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  {{ansible_processor_vcpus * 1024 }};
}
#2.根据主机名称设定不同配置文件
    zabbix_agent
        Server:   ===> 指向172.16.1.61
        Hostname:      web01   web02
[root@manager project1]# cat ./file/zabbix_agent.conf.j2 
Server={{ zabbix_server_ip }}
ServerActive={{ zabbix_server_ip }}
Hostname={{ ansible_hostname }}
[root@manager project1]# cat f11.yml 
- hosts: webservers
  vars:
    - zabbix_server_ip: 172.16.1.61
  tasks:
    - name: Configure zabbix-agent.conf
      template:
        src: ./file/zabbix_agent.conf.j2
        dest: /tmp/zabbix-agent.conf
        
#3.根据主机的内存生成不同的配置文件,memcached
[root@manager project1]# cat f12.yml 
- hosts: webservers
  tasks:
    - name: Installed Memcached Server
      yum:
        name: memcached
        state: present
    - name: Configure Memcached Server
      template:
        src: ./file/memcached.j2
        dest: /etc/sysconfig/memcached
      notify: Restart Memcached Server
    - name: System Memcached Server
      systemd:
        name: memcached
        state: started
        enabled: yes
  handlers:
    - name: Restart Memcached Server
      systemd:
        name: memcached
        state: restarted

[root@manager project1]# cat file/memcached.j2 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""

你可能感兴趣的:(Ansible之Varialbes—3)