zoukankan      html  css  js  c++  java
  • 第十章 Ansibleplaybook变量基础

    一、ansible变量概述

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

    二、ansible定义变量的方式

    1.通过命令行进行变量定义
    2.在playbook文件中进行变量定义
    3.通过Inventory主机信息文件中进行变量定义
    4.通过vars_files的方式定义变量
    5.通过host_vars和group_vars定义变量
    

    三、playbook文件中进行变量定义

    1.在模块下面定义变量

    - hosts: web_group
      tasks:
        - name: ensure a list of packages installed
          yum:
            name: "{{ packages }}"
          vars:
            packages:
            - httpd
            - httpd-tools
    
        - name: remove server
          yum:
            name: "{{ packages }}"
            state: absent
          vars:
            packages:
            - httpd
            - httpd-tools
    
    #问题:模块下定义变量,变量只在当前动作生效,到其他动作后变量需要重新定义
    

    2.在hosts下面定义变量

    - hosts: web_group
      vars:
        packages:
        - httpd
        - httpd-tools
      tasks:
        - name: ensure a list of packages installed
          yum:
            name: "{{ packages }}"
    
        - name:
          yum:
            name: "{{ packages }}"
            state: absent
    

    3.在hosts下面定义多个变量

    - hosts: web_group
      vars:
        packages:
          - httpd
          - httpd-tools
        db:
          - mariadb-server
          - MySQL-python
    
      tasks:
        - name: install web server
          yum:
            name: "{{ packages }}"
    
        - name: install mariadb-server
          yum:
            name: "{{ db }}"
            
    #问题:变量卸载hosts下面,可以解决多个动作分别设置变量的问题,但是设置的变量只能在当前的playbook中使用,其他的playbook无法使用
    

    四、vars_file方式定义变量

    1.定义变量文件

    [root@m01 ~]# vim vars.yml
    web: 
      - httpd
      - httpd-tools
    db: mariadb-server
    

    2.palybook调用变量文件

    [root@m01 ~]# vim moudle_vars.yml 
    - hosts: web_group
      vars_files: /root/vars.yml
      tasks:
        - name: install web server
          yum:
            name: "{{ web }}"
            state: absent
    
        - name: install mariadb-server
          yum:
            name: "{{ db }}"
            state: absent
    

    3.添加变量文件

    [root@m01 ~]# vim vars1.yml 
    nfs:
      - nfs-utils
      - rpcbind
    

    4.调用多个变量文件

    [root@m01 ~]# vim moudle_vars.yml 
    - hosts: web_group
      vars_files: 
        - /root/vars.yml
        - /root/vars1.yml
      tasks:
        - name: install web server
          yum:
            name: "{{ web }}"
    
        - name: install mariadb-server
          yum:
            name: "{{ db }}"
    
        - name: install nfs server
          yum:
            name: "{{ nfs }}"
    

    五、Inventory中定义变量

    1.主机清单中定义变量

    [root@m01 ~]# vim /etc/ansible/hosts 
    [web_group]
    web01 ansible_ssh_pass='1'
    web02 ansible_ssh_pass='1'
    web03 ansible_ssh_pass='1'
    
    ......
    
    [web_group:vars]
    web=httpd
    db=mariadb-server
    

    2.调用变量

    - hosts: web_group
      tasks:
        - name: install web server
          yum:
            name: "{{ web }}"
            state: absent
    
        - name: install db server
          yum:
            name: "{{ db }}"
    
    #问题:
    	1.主机清单定义变量,只能给某个组使用,如果所有主机都使用需要定义很多变量
    	2.主机清单内容很多的时候,配置变量会使文件变得太大
    

    3.复合组定义变量

    [root@m01 ~]# vim /etc/ansible/hosts
    [web_group]
    web01 ansible_ssh_pass='1'
    web02 ansible_ssh_pass='1'
    web03 ansible_ssh_pass='1'
    
    ... ...
    
    [nginx_group:children]
    web_group
    slb
    
    [web_group:vars]
    web=httpd
    db=mariadb-server
    
    [nginx_group:vars]
    web=nginx
    rsync=rsync
    

    4.调用变量

    [root@m01 ~]# vim mkdir.yml 
    - hosts: nginx_group
      tasks:
        - name: Mkdir dir
          file:
            path: /tmp/{{web}}
            state: directory
    
        - name: Mkdir dir
          file:
            path: /tmp/{{rsync}}
            state: directory
            
    #执行结果
    [root@m01 ~]# ansible-playbook mkdir.yml
    
    [root@web01 ~]# ll /tmp/
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 17:52 httpd
    drwxr-xr-x 2 root root 6 Sep 23 17:52 rsync
    
    [root@lb01 ~]# ll /tmp/
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 17:52 nginx
    drwxr-xr-x 2 root root 6 Sep 23 17:52 rsync
    
    #结论:主机清单定义变量时,复合组定义的变量优先级低于主机组定义的
    

    六、使用内置变量

    1.直接使用内置变量

    [root@m01 ~]# vim mkdir.yml 
    - hosts: nginx_group
      tasks:
        - name: Mkdir dir
          file:
            path: /backup/{{ansible_fqdn}}_{{ansible_eth1.ipv4.address}}_{{ansible_date_time.date}}
            state: directory
    

    2.内置变量设置变量

    [root@m01 ~]# vim mkdir.yml 
    - hosts: nginx_group
      vars:
        - remote_ip: "{{ansible_eth1.ipv4.address}}"
        - host: "{{ansible_fqdn}}"
        - date: "{{ansible_date_time.date}}"
      tasks:
        - name: Mkdir dir
          file:
            path: /backup/{{remote_ip}}_{{host}}_{{date}}
            state: directory
    

    3.内置变量常用方式

    #编写配置文件
    [root@m01 ~]# vim /root/conf/redis.conf
    bind {{ansible_eth1.ipv4.address}}
    
    #编写playbook
    [root@m01 ~]# vim redis.yml 
    - hosts: web_group
      tasks:
        - name: Install Redis Server
          yum:
            name: redis
    
        - name: Config Redis Server
          template:
            src: /root/conf/redis.conf
            dest: /etc/
            
    #执行
    [root@m01 ~]# ansible-playbook redis.yml
    
    #查看结果
    [root@web01 ~]# grep "^bind" /etc/redis.conf 
    bind "172.16.1.7"
    [root@web02 ~]# grep "^bind" /etc/redis.conf
    bind "172.16.1.8"
    [root@web03 ~]# grep "^bind" /etc/redis.conf
    bind "172.16.1.9"
    

    七、host_vars和group_vars定义变量

    之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
    host_vars
    group_vars
    切记,目录名字一定要一致,不能做任何修改。
    

    1.主机组定义变量

    1.创建主机组变量目录(名字一定是group_vars)
    [root@m01 ~]# mkdir group_vars
    
    2.主机组目录下创建变量文件(文件名字一定是主机清单中主机组的名字)
    [root@m01 ~]# vim group_vars/web_group
    web: httpd
    
    3.调用变量
    [root@m01 ~]# vim mkdir.yml 
    - hosts: web_group
      tasks:
        - name: Mkdir dir
          file:
            path: /tmp/{{web}}
            state: directory
    

    2.主机定义变量

    1.创建主机变量目录(名字一定是host_vars)
    [root@m01 ~]# mkdir host_vars
    
    2.主机目录下创建变量文件(文件名字一定是主机清单中主机的名字)
    [root@m01 ~]# vim host_vars/web01
    web: web01_host_vars
    
    3.调用变量
    [root@m01 ~]# vim mkdir.yml 
    - hosts: web_group
      tasks:
        - name: Mkdir dir
          file:
            path: /tmp/{{web}}
            state: directory
            
    4.执行
    [root@m01 ~]# ansible-playbook mkdir.yml 
    
    5.查看结果
    [root@web01 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 18:57 web01_host_vars
    [root@web02 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 18:57 httpd
    [root@web03 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 18:57 httpd
    

    3.测试

    #1.配置主机清单
    [root@m01 ~]# cat /etc/ansible/hosts 
    [web_group]
    web01 ansible_ssh_pass='1'
    web02 ansible_ssh_pass='1'
    web03 ansible_ssh_pass='1'
    
    [slb]
    lb01 ansible_ssh_pass='1'
    
    [nginx_group:children]
    web_group
    slb
    
    #2.配置变量
    [root@m01 ~]# cat group_vars/nginx_group
    web: nginx_group
    [root@m01 ~]# cat group_vars/web_group
    web: web_group
    [root@m01 ~]# cat host_vars/web01
    web: web01_host_vars
    
    #3.调用变量
    [root@m01 ~]# vim mkdir.yml 
    - hosts: nginx_group
      tasks:
        - name: Mkdir dir
          file:
            path: /tmp/{{web}}
            state: directory
            
    #4.执行
    [root@m01 ~]# ansible-playbook mkdir.yml
    
    #5.查看结果
    [root@lb01 ~]# ll /tmp/
    drwxr-xr-x 2 root root 6 Sep 23 19:02 nginx_group
    [root@web01 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 19:02 web01_host_vars
    [root@web02 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 19:02 web_group
    [root@web03 ~]# ll /tmp
    total 0
    drwxr-xr-x 2 root root 6 Sep 23 19:02 web_group
    
    #6.结论:
    	主机定义的优先级高于主机组,主机组定义的变量优先级高于复合组
    

    八、命令行进行变量定义

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

    1.使用命令行定义单个变量

    [root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend"
    

    2.使用命令行定义多个变量

    [root@m01 ~]# ansible-playbook mkdir.yml -e "web=commend" -e "db=mysql"
    
    #注意:指定的变量会根据命令行执行,没有指定的变量继续按照变量的设置执行
    

    九、变量调用的优先级测试

    #1.定义vars_file变量
    [root@m01 ~]# vim vars.yml
    web: vars_file
    
    #2.主机清单定义变量
    [root@m01 ~]# vim /etc/ansible/hosts
    [nginx_group:vars]
    web=host_vars
    
    #3.主机组定义变量
    [root@m01 ~]# vim group_vars/nginx_group 
    web: group_vars
    
    #4.主机定义变量
    [root@m01 ~]# vim host_vars/web01 
    web: host_vars
    
    #5.playbook定义变量
    [root@m01 ~]# vim mkdir.yml 
    - hosts: nginx_group
      vars:
        web: playbook_vars
      vars_files: /root/vars.yml
      tasks:
        - name: Mkdir dir
          file:
            path: /tmp/{{web}}
            state: directory
            
    #6.命令行执行定义变量
    [root@m01 ~]# ansible-playbook mkdir.yml -e "web=command"
    
    #7.依次执行,得到结论
    优先级排序:从上到下以此降低
    	1.命令行
    	2.vars_files
    	3.playbook中配置变量
    	4.主机定义变量
    	5.主机组定义变量
    	6.主机清单定义变量
    

    十、层级定义变量

    #编辑变量文件
    [root@m01 ~]# vim vars_file.yml
    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
    
    #编辑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.yml
    
  • 相关阅读:
    Java8 Stream Function
    PLINQ (C#/.Net 4.5.1) vs Stream (JDK/Java 8) Performance
    罗素 尊重 《事实》
    小品 《研发的一天》
    Java8 λ表达式 stream group by max then Option then PlainObject
    这人好像一条狗啊。什么是共识?
    TOGAF TheOpenGroup引领开发厂商中立的开放技术标准和认证
    OpenMP vs. MPI
    BPMN2 online draw tools 在线作图工具
    DecisionCamp 2019, Decision Manager, AI, and the Future
  • 原文地址:https://www.cnblogs.com/jhno1/p/15723207.html
Copyright © 2011-2022 走看看