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