Playbook剧本之变量

主机清单定义变量
Playbook中hosts中定义变量
创建变量文件,Playbook调用
host_vars和group_vars目录中定义变量
命令行中指定变量
变量赋予register
番外话:变量格式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\n/dev/mapper/centos-root 17G 3.1G 14G 18% /\ndevtmpfs 476M 0 476M 0% /dev\ntmpfs 488M 0 488M 0% /dev/shm\ntmpfs 488M 7.7M 480M 2% /run\ntmpfs 488M 0 488M 0% /sys/fs/cgroup\n/dev/sda1 1014M 173M 842M 18% /boot\ntmpfs 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
上一篇:Ansible之playbook拓展


下一篇:Mac Technology Overview(一)