zoukankan      html  css  js  c++  java
  • Playbook剧本之变量

    toc
    Playbook作为编程语言,自然也有变量、判断、循环等……
    Playbook有多种定义变量的方式:

    • HostInventory主机清单中定义
    • Playbook剧本中hosts里面定义
    • 文件中定义,Playbook中调取文件
    • host_vars和group_vars目录中定义(官方推荐)
    • 命令行执行Playbook用 -e 定义

    主机清单定义变量

    ## 修改hosts文件(主机和组都定义相同的,测试会用谁的)
    [root@Ansible project]# cat /etc/ansible/hosts 
    [web]
    web1 ansible_ssh_host=192.168.1.2 file_name=invnetory_host   ##针对主机(包括前面这个都是变量)
    [web:vars]    ## 针对组(组名,后面加上:vars)
    file_name=invnetory_group
    ## 编写Playbook调用变量
    [root@Ansible project]# vim create_file.yml
    - hosts: web
      tasks:
        - name: Create File
          file:
            path: /tmp/ {{ file_name }}      ## 调用变量方式
            state: touch
    ## 执行一下(这里就不检测格式了)
    [root@Ansible project]# ansible-playbook create_file.yml 
    
    PLAY [web] ********************************************************************************
    
    TASK [Gathering Facts] ********************************************************************
    ok: [web1]
    
    TASK [Create File] ************************************************************************
    changed: [web1]
    
    PLAY RECAP ********************************************************************************
    web1 : ok=2 changed=1 unreachable=0 failed=0  
    ## 查看一下创建的文件(创建的是主机变量)
    [root@Ansible project]# ansible web -a "ls /tmp/"
    web1 | CHANGED | rc=0 >>
    ansible_command_payload_4p5rSK
     invnetory_host
    ## 删除主机上 file_name 变量在执行一次
    [root@Ansible project]# ansible-playbook create_file.yml 
    ## 再次查看一下创建的文件
    [root@Ansible project]# ansible web -a "ls /tmp/"
    web1 | CHANGED | rc=0 >>
    ansible_command_payload_prOA1j
     invnetory_group
     invnetory_host

    Playbook中hosts中定义变量

    ## 修改create_file.yml文件(这种只对当前play)
    [root@Ansible project]# vim create_file.yml 
    - hosts: web
      vars: 
        file_name: playbook_file
      tasks:
        - name: Create File
          file:
            path: /tmp/ {{ file_name }}
            state: touch
    ## 执行一下
    [root@Ansible project]# ansible-playbook --syntax-check create_file.yml 
    ## 查看一下结果
    [root@Ansible project]# ansible web -a "ls /tmp/"                       
    web1 | CHANGED | rc=0 >>
    ansible_command_payload_LUBk4W
     invnetory_group
     invnetory_host
     playbook_file

    创建变量文件,Playbook调用

    ## 创建变量文件
    [root@Ansible project]# vim vars.yml
    file_name: file_file
    ## 修改create_file.yml文件
    - hosts: web
      vars_files: ./vars.yml
      tasks:
        - name: Create File
          file:
            path: /tmp/ {{ file_name }}
            state: touch
    ## 执行一下
    [root@Ansible project]# ansible-playbook --syntax-check create_file.yml 
    ## 查看一下结果
    [root@Ansible project]# ansible web -a "ls /tmp/"
    web1 | CHANGED | rc=0 >>
    ansible_command_payload_XAavWX
     file_file
     invnetory_group
     invnetory_host
     playbook_file

    host_vars和group_vars目录中定义变量

    ## 创建目录
    [root@Ansible project]# mkdir {host,group}_vars
    ## 根据主机清单上组名在group_vars上创建文件
    [root@Ansible project]# vim group_vars/web
    file_name: group_file
    ## 直接调用变量
    [root@Ansible project]# vim create_file.yml 
    - hosts: web
      tasks:
        - name: Create File
          file:
            path: /tmp/ {{ file_name }}
            state: touch
    ## 执行一下剧本查看结果
    [root@Ansible project]# ansible-playbook create_file.yml
    [root@Ansible project]# ansible web -a "ls /tmp/"
    web1 | CHANGED | rc=0 >>
    ansible_command_payload_N6kl0w
     file_file
     group_file
     invnetory_group
     invnetory_host
     playbook_file
    ## Ansible自带一个all组,代表全部主机
    [root@Ansible project]# mv group_vars/web group_vars/all
    [root@Ansible project]# vim group_vars/all
    file_name: all_file
    ## 执行一下剧本查看结果
    [root@Ansible project]# ansible-playbook create_file.yml
    [root@Ansible project]# ansible web -a "ls /tmp/"        
    web1 | CHANGED | rc=0 >>
     all_file
     file_file
     group_file
     invnetory_group
     invnetory_host
     playbook_file
    ## 根据主机清单上主机在host_vars上创建文件
    [root@Ansible project]# vim host_vars/web1
    file_name: host_file
    ## 执行一下剧本查看结果
    [root@Ansible project]# ansible-playbook create_file.yml 
    [root@Ansible project]# ansible web -a "ls /tmp/"        
    web1 | CHANGED | rc=0 >>
     all_file
     file_file
     group_file
     host_file
     invnetory_group
     invnetory_host
     playbook_file

    命令行中指定变量

    ## 用 -e 直接指定变量
    [root@Ansible project]# ansible-playbook create_file.yml -e "file_name=shell_file"
    [root@Ansible project]# ansible web -a "ls /tmp/"                                 
    web1 | CHANGED | rc=0 >>
     all_file
     file_file
     group_file
     host_file
     invnetory_group
     invnetory_host
     playbook_file
     shell_file

    变量的优先级从高到低:

    • 命令行中指定变量
    • Playbook调用变量文件
    • Playbook中hosts中定义的变量
    • host_vars目录中定义的变量
    • group_vars目录组名定义的变量
    • group_vars目录all定义的变量
    • 主机清单主机定义的变量
    • 主机清单组定义的变量

    变量赋予register

    这里需要用到debug模块

    • msg ---调试输出的消息
    • var ---将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出
    • verbosity ---debug的级别(默认为0级,全部显示)
    [root@Ansible project]# vim disk_use.yml 
    - hosts: web
      tasks:
        - name: Get Network Port Status
          shell: netstat -lntp
          register: disk_use    ##执行结果赋予给disk_use变量中
    
        - name: OutPut Network Port Status
          debug:
            msg: "{{ disk_use }}"   ##输出变量
    ## 执行一下(尽量用检测一下格式是否正确)
    [root@Ansible project]# ansible-playbook disk_use.yml                
    
    PLAY [web] ********************************************************************************
    
    TASK [Gathering Facts] ********************************************************************
    ok: [web1]
    
    TASK [Get Disk Statistics] ****************************************************************
    changed: [web1]
    
    TASK [OutPut Disk Statistics] *************************************************************
    ok: [web1] => {
        "msg": {
            "changed": true, 
            "cmd": "df -h", 
            "delta": "0:00:00.028851", 
            "end": "2019-05-18 20:21:58.899206", 
            "failed": false, 
            "rc": 0, 
            "start": "2019-05-18 20:21:58.870355", 
            "stderr": "", 
            "stderr_lines": [], 
            "stdout": "Filesystem Size Used Avail Use% Mounted on
    /dev/mapper/centos-root 17G 3.1G 14G 18% /
    devtmpfs 476M 0 476M 0% /dev
    tmpfs 488M 0 488M 0% /dev/shm
    tmpfs 488M 7.7M 480M 2% /run
    tmpfs 488M 0 488M 0% /sys/fs/cgroup
    /dev/sda1 1014M 173M 842M 18% /boot
    tmpfs 98M 0 98M 0% /run/user/0", 
            "stdout_lines": [
                "Filesystem Size Used Avail Use% Mounted on", 
                "/dev/mapper/centos-root 17G 3.1G 14G 18% /", 
                "devtmpfs 476M 0 476M 0% /dev", 
                "tmpfs 488M 0 488M 0% /dev/shm", 
                "tmpfs 488M 7.7M 480M 2% /run", 
                "tmpfs 488M 0 488M 0% /sys/fs/cgroup", 
                "/dev/sda1 1014M 173M 842M 18% /boot", 
                "tmpfs 98M 0 98M 0% /run/user/0"
            ]
        }
    }
    
    PLAY RECAP ********************************************************************************
    web1 : ok=3 changed=1 unreachable=0 failed=0
    ## 指定变量中的选项精简输出
    [root@Ansible project]# vim disk_use.yml 
    - hosts: web
      tasks:
        - name: Get Network Port Status
          shell: netstat -lntp
          register: disk_use    ##执行结果赋予给disk_use变量中
    
        - name: OutPut Network Port Status
          debug:
            msg: "{{ disk_use.stdout_lines }}"   ##指定输出的信息
    ## 再次执行一下
    [root@Ansible project]# ansible-playbook disk_use.yml 
    
    PLAY [web] ********************************************************************************
    
    TASK [Gathering Facts] ********************************************************************
    ok: [web1]
    
    TASK [Get Disk Statistics] ****************************************************************
    changed: [web1]
    
    TASK [OutPut Disk Statistics] *************************************************************
    ok: [web1] => {
        "msg": [
            "Filesystem Size Used Avail Use% Mounted on", 
            "/dev/mapper/centos-root 17G 3.1G 14G 18% /", 
            "devtmpfs 476M 0 476M 0% /dev", 
            "tmpfs 488M 0 488M 0% /dev/shm", 
            "tmpfs 488M 7.7M 480M 2% /run", 
            "tmpfs 488M 0 488M 0% /sys/fs/cgroup", 
            "/dev/sda1 1014M 173M 842M 18% /boot", 
            "tmpfs 98M 0 98M 0% /run/user/0"
        ]
    }
    
    PLAY RECAP ********************************************************************************
    web1 : ok=3 changed=1 unreachable=0 failed=0   

    番外话:变量格式

    在公司项目中,定义变量是用规范的。

    [root@Ansible project]# vim group_vars/all
    project:
      nfs:
        package: nfs-utils
        file_name: data

    调用的变量的可以用两种方式

    • . 比如:{{ project.nfs.package }},不推荐,执行时候可能有问题
    • [] 比如:"{{ project['nfs']['package'] }}" 或者 {{ project["nfs"]["file_name"] }},官方推荐
    - hosts: nfs
      tasks:
        - name: Install Nfs Server
          yum:
            name: "{{ project['nfs']['package'] }}"
            state: installed
        - name: Create File Directory
          file:
            path: / {{ project["nfs"]["file_name"] }}
            state: directory
  • 相关阅读:
    Hadoop: No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).解决办法
    Libnfc
    生产服务GC调优实践及基本流程总结
    万年历算法
    C#中操作Oracle时的SQL语句参数的用法
    对DataGrid的初步了解
    C#中HashTable的用法
    正则表达式
    C#动态调用WebService
    Ubuntu 故障处理笔记
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11883319.html
Copyright © 2011-2022 走看看