当前位置:首页 > 服务端 > Ansible(三)

Ansible(三)

Ansible(三)

Ansible变量解析

1.变量概述

变量提供了便捷的方式来管理ansible项目中的动态值,比如zabbix-3.4.15,可能后期会反复的使用到这个版本的值,那么如果将此值设置为变量,后续使用和修改都将变得非常方便。这样可以简化项目的创建和维护

定义变量分为如下三种方式

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

2)在play文件中进行定义变量

3)通过inventory在主机组或单个主机中设置变量

如果定义的变量出现重复,且造成冲突,优先级如下:

命令行定义的变量-高于-->play文件中进行定义变量-高于-->inventory文件定义的变量

2.变量定义

1、playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义

#安装两个软件包使用变量方式
[root@m01 project1]# cat  p2.yml 
- hosts: webservers
  vars:
    - web_package: httpd
    - ftp_package: vsftpd
  tasks:
    - name: Installed Packages
      yum: 
        name: 
          - "{{ web_package }}"
          - "{{ ftp_package }}"
        state: present

2、也可以在playbook中使用vars_files指定文件作为变量文件,好处就是其他的playbook也可以调用

[root@m01 project1]# cat vars.yml 
web_package: httpd
ftp_package: vsftpd

[root@m01 project1]# cat p2.yml 
- hosts: webservers
  vars_files: ./vars.yml
  tasks:
    - name: Installed Packages
      yum: 
        name: 
          - "{{ web_package }}"
          - "{{ ftp_package }}"
        state: present

3.在inventory中定义变量,主机变量优先级高于主机组变量(不推荐,容易将环境弄的特别乱)

[root@m01 project1]# vim /etc/ansible/hosts 
[webservers]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8
[webservers:vars]
filename=group_vars

[root@m01 project1]# cat p3.yml 
- hosts: webservers
  tasks:
    - name: Create File
      file: path=/tmp/{{ filename }} state=touch

4.更好的方式是在ansible的项目目录中创建额外的两个变量目录,分别是host_varsgroup_vars

group_vars目录下必须存放和inventory清单文件中定义的组名一致,如下
[root@m01 project1]# cat /etc/ansible/hosts 
[webservers]
web01 ansible_ssh_host=172.16.1.7
web02 ansible_ssh_host=172.16.1.8

[root@m01 project1]# cat group_vars/webservers 
web_package: httpd
ftp_package: vsftpd
注意:系统提供了特殊的组,all,也就说在group_vars目录下创建一个all文件,定义变量对所有的主机都生效


[root@m01 project1]# cat host_vars/web01 
web_package: zlib-static
ftp_package: zmap

[root@m01 project1]# cat group_vars/webservers 
web_package: httpd
ftp_package: vsftpd


[root@m01 project1]#  cat p4.yml 
- hosts: webservers
#- hosts: otherservers
  tasks:
    - name: Installed Packages
      yum: 
        name: 
          - "{{ web_package }}"
          - "{{ ftp_package }}"
        state: present


[root@m01 project1]# ansible-playbook p4.yml 

PLAY [webservers] ********************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************
ok: [web02]
ok: [web01]

TASK [Installed Packages] ************************************************************************************************
ok: [web02]
changed: [web01]

PLAY RECAP ***************************************************************************************************************
web01                      : ok=2    changed=1    unreachable=0    failed=0   
web02                      : ok=2    changed=0    unreachable=0    failed=0   

5.通过命令行覆盖变量,inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命
令行直接指定变量所覆盖。使用--extra-vars-e设定变量。

[root@m01 project1]# ansible-playbook p4.yml -e "web_package=zarafa-devel" -e "ftp_package=zarafa-utils"

6.变量优先级测试
命令行变量--->play中的vars_files--->play中的vars变量-->host_vars中定义的变量--->group_vars/组--->group_vars/all

[root@m01 project1]# cat p5.yml 
- hosts: webservers
#  vars:
#    filename: play_vars
#  vars_files:
#    - ./vars.yml
  tasks:

    - name: Create 
      shell: mkdir -pv /tmp/{{ filename }}
      register: mk_test

    - name: debug
      debug: msg={{ mk_test }}

7.变量也支持层级定义,使用.可能会有问题,建议使用[]代替。

[root@m01 project1]# cat vars1.yml 
rainbow:
  web:
    web_package: httpd
    db_package: mariadb

code:
  web:
    filename: code_web_filename

	
[root@m01 project1]# cat p8.yml 
- hosts: webservers
  vars_files: ./vars1.yml
  tasks:
    - name: Install Package
      yum: name= "{{ rainbow['web']['web_package'] }}"

    - name: create filename
      file: 
        path: /tmp/{{ code.web.filename }}
        state: touch

3.变量注册

register

- hosts: webservers
  tasks:
    - name: Get Network Port Status
      shell: netstat -lntp
      register: net_port

    - name: OutPut Network Port Status
      debug:
        msg: "{{ net_port.stdout_lines }}"

4.facts变量

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

facts使用场景

1)通过facts检查CPU,来生成对应Nginx配置文件

2)通过facts检查主机名信息,来生成不同的``zabbix`配置文件

3)通过fact检索的内存情况来自定义MySQL的配置文件

1、facts基本用法,比如获取被控端的主机名和IP地址

[root@m01 project1]# cat facts.yml 
- hosts: web
  tasks:
    - name: OutPut variables ansible facts
      debug:
        msg: >
         this default IPv4 address "{{ ansible_fqdn }}" is "{{ ansible_default_ipv4.address }}"

2、facts开启后会影响ansible主机的性能,如果没有采集被控端主机需求可以选择关闭

[root@m01 project1]# cat facts.yml 
- hosts: webservers
  #gather_facts: no   关闭facts采集
  vars: 
    - zabbix_server: 172.16.1.71
  tasks:
    - name: Copy Zabbix Agent Configure
      template: src=./zabbix_agentd.conf dest=/tmp/zabbix_agent.conf

3、如何获取facts的变量,需要使用filter进行过滤,使用 setup模块

ansible web01 -m setup -a filter="mb"

4、使用facts根据不同的内存生成不同Memcached配置文件

playbook安装一个memcached
[root@m01 project1]# cat memcached.j2 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""

[root@m01 project1]# cat p11.yml 
- hosts: webservers
  tasks:
    - name: Installed Memcached
      yum: name=memcached state=present

    - name: Configure Memcached
      template: src=./memcached.j2 dest=/etc/sysconfig/memcached

    - name: Start Memcached
      service: name=memcached state=started enabled=yes

作者:水煮沉浮~大刀肉
来源链接:https://www.cnblogs.com/zxm1/p/14459498.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125680.html

分享给朋友: