Playbook剧本之变量
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