• Ansible--03 ansible 变量


    Ansible 变量

    变量概述

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

    定义变量的方式

    1. 通过命令行进行变量定义
    2. playbook,在play文件中进行变量定义
    3. 主机清单,通过主机信息文件中进行变量定义

    如何定义变量

    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.yml
    web_pkg: httpd
    db_pkg: mariadb-server
    php_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.7
    zls_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.51
    db02 ansible_ssh_host=172.16.1.52
    
    [nfs_group]
    nfs ansible_ssh_host=172.16.1.31
    
    [rsync_server:children]
    web_group
    backup_group
    
    [rsync_server:vars]
    web_pkg=httpd
    
    [nfs_server:children]
    web_group
    nfs_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/webs
    web_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 ~]# !vim
    vim 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.yml
    dir: vars_file
    
    #定义host_vars中的web01
    [root@m01 ~]# vim host_vars/zls_web01
    dir: host_vars
    
    #定义group_vars
    [root@m01 ~]# vim group_vars/webs
    dir: group_vars
    

    测试阶段:

    #1.命令行测试
    [root@m01 ~]# ansible-playbook test.yml -e "dir=command_vars"
    #查看到命令行定义的文件
    [root@web01 ~]# ll /opt/
    total 0
    drwxr-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 0
    drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
    drwxr-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 0
    drwxr-xr-x 2 root root 6 Sep 19 16:48 command_vars
    drwxr-xr-x 2 root root 6 Sep 19 16:52 playbook_vars
    drwxr-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.sh
    drwxr-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.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
    
    PLAY [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=0
    web02                      : 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.yml
    
    PLAY [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=0
    web02                      : 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=/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 }}
    
  • 相关阅读:
    双向循环链表
    字符串拷贝
    div样式调整.txt
    解析xml的单个节点值和循环节点消息体
    C++中的string
    正则表达式教程
    一个很好的Qt教程个人主页
    单射、双射与满射
    ISO C++ forbids declaration of * with no type
    一个中学生的个人主页
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11552302.html
Copyright © 2020-2023  润新知