---
- hosts:alltasks:- name: 01 打开冰箱门shell: echo 01 >> /tmp/bingxiang.log- name: 02 把大象放进冰箱里shell: echo 02 >> /tmp/bingxiang.log- name: 03 关上冰箱门shell: echo 03 >> /tmp/bingxiang.log
[root@m01 /server/ans/playbook]# cat 05-nfs-server.yaml
---
- hosts: dbtasks:- name: 01 部署nfs服务端软件yum:name: nfs-utilsstate: installed- name: 02 修改配置文件lineinfile:path: /etc/exportsline: "/data 172.16.1.0/24(rw)"state: presentbackup: yes- name: 03 创建对应的目录file:path: /data/owner: nfsnobodygroup: nfsnobodystate: directory- name: 04 启动服务rpc-bindsystemd:name: rpcbindenabled: yesstate: started- name : 05 启动服务nfssystemd:name: nfsenabled: yesstate: started
注意:如果从windows传文件记得要用doc2unix转换一下yaml文件格式!
10 Ansible-变量系列
10.1 变量分类
变量 | ||
---|---|---|
命令行 | 临时使用,较少用 | |
变量文件vars_files | 某一个主机使用,较少使用 | |
主机组共用的变量文件 group_vars | 应用范围广泛. | |
ansible的内置变量(facts变量) | 收集主机的基本信息,ip地址,主机名,系统及版本… | |
register变量 | 实现命令行$()或``功能 |
10.2 变量详解
1)vars,var_files,group_vars
- 剧本中定义变量
---
- hosts: allvars:dir_name: /hbinz_007file_name: hbinz007tasks:- name: 01.mkdirfile:path: "{{dir_name}}"state: directory- name: 02.touchfile:path: "{{dir_name}}/{{file_name}}"state: touch
- 剧本比较大的时候,把变量放进一个文件中
cat vars.yml
dir_name: /hbinz_007
file_name: hbinz007cat 08.vars_files_dir.yaml
---
- hosts: allvars_files: ./vars.yamltasks:- name: 01.mkdirfile:path: "{{ dir_name }}"state: directory- name: 02.touchfile:path: "{{ dir_name}}/{{ file_name }}"state: touch
- 创建一个变量文件,给某个组共用
用法:需要创建一个group_vars目录.目录下面创建以主机组命名的目录.存放变量文件vars.ymlgroup_vars/ 目录lb/vars.yml #存放lb组的变量web/vars.yml #存放web组的变量data/vars.yml #存放xxx组的变量all/vars.yml #所有主机共用的变量
案例01-根据不同的主机组创建对应的目录
group_vars/ 目录web/vars.yaml #存放web组的变量data/vars.yml #存放xxx组的变量all/vars.yml #所有主机共用的变量1.在剧本文件的目录下创建group_vars目录,并且里面的目录如下:
tree group_vars/
group_vars/
├── all
│ └── vars.yml
├── data
│ └── vars.yaml
└── web└── vars.yamlhosts文件下定义的:
[hbinz]
172.16.1.7
172.16.1.31
172.16.1.41
172.16.1.51[web]
172.16.1.7
[db]
172.16.1.51
[nfs]
172.16.1.31
[backup]
172.16.1.41[data:children]
backup
db
nfs
-------------------------------------------------
web服务器创建 /app/code/目录
dir_name: /app/code/
data服务端创建 /data/目录
dir_name: /data/cat 09.vars_group_dir.yml
---
- hosts: alltasks:- name: 根据主机创建不同的目录file:path: "{{ dir_name }}"state: directory
- group_vars未来应用场景:使用all统一存放变量
案例02-使用group_vars的all组定义变量
cat vars.yml
dir_name_code: /app/code/
dir_name_data: /data/cat 09.vars_group_vars_dir.yml
- hosts: alltasks:- name: 01 {{ dir_name_code }}file:path: "{{ dir_name_code }}"state: directory- name: 02 {{ dir_name_data }}file:path: "{{ dir_name_data }}"state: directory
- 变量基础定义小结
使用方法 | 具体含义 | 应用场景 |
---|---|---|
变量写在剧本开头: | vars: | 简单的较少的可以用这一种 |
变量写在独立文件中: | vars_files:指定变量文件位置 | 了解即可 |
变量写在独立文件中,按照组进行分类: | group_vars/目录all/vars.yml | 掌握在all中创建所有主机/分组用的变量即可。 |
- ansible-facts变量
facts变量说明 : ansible内置变量,执行剧本,有个默认的任务(task),收集每个主机的基本信息.
# 查看 ansible facts变量内容常用fact变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4.address #默认的网卡ip eth0
ansible_distribution #系统发行版本名字CentOS Ubuntu Debian ...
ansible_processor_cores #核心总数
ansible_date_time.date #当前时间 年-月-日
案例01-系统巡检-获取所有机器的基础信息保存到/tmp/主机名命令文件中
步骤:
01.创建文件
02.写入内容cat 10.vars_sys_info.yml
---
- hosts: alltasks:- name: 创建文件并写入系统基本信息lineinfile:path: /tmp/{{ ansible_hostname }}create: yesline: "主机名:{{ansible_hostname}}\nip地址:{{ansible_default_ipv4.address}}\n内存总计:{{ansible_memtotal_mb}}"
- facts小结
- 如果ans中使用到了一些系统的基础信息. eg: ip地址,主机名,时间.
如果没有这种需求或通过别的方式实现这个需求,可以关闭facts功能,让剧本执行加速. 使用gather_facts: no
- 如果ans中使用到了一些系统的基础信息. eg: ip地址,主机名,时间.
cat 08.vars_files_dir.yaml
---
- hosts: allgather_facts: novars_files: ./vars.yamltasks:- name: 01.mkdirfile:path: "{{ dir_name }}"state: directory- name: 02.touchfile:path: "{{ dir_name}}/{{ file_name }}"state: touch
3)ansible-register变量
eg:创建压缩包压缩包名字包含时间.tar打包压缩,date获取时间
shell:
tar zcf /tmp/etc-`date +%F`.tgz /etc/
1)案例01-创建以主机名命名文件/opt/主机名
步骤:
01.获取主机名:hostname
02.创建文件,使用上一步结果register:变量名字 #这个变量的内容,叫json格式
register:hostname #json格式,只想要输出标准输出,stdout=standard output标准输出
hostname.stdout #获取命令的结果 `hostname`
cat 12.vars_register.yml
---
- hosts: alltasks:- name: 01.获取主机名shell: hostnameregister: hostname- name: 02.输出变量内容debug:msg: "{{hostname.stdout}}"
按照路径创建文件
---
- hosts: alltasks:- name: 01.获取主机名shell: hostnameregister: hostname- name: 输出变量内容debug:msg: "{{hostname.stdout}}"- name: 02.创建文件file:path: /opt/{{ hostname.stdout }}state: touch
register变量输出结果
register: hostname
hostname.stdout #正常输出信息
hostname.rc #取出返回值.
hostname.stderr #取出错误信息.
10.3变量小结
为何使用变量:
剧本,脚本使用的变量放在一个文件中,剧本开头的。
一般存放:用户名,用户组,目录,端口.....
变量 | ||
---|---|---|
命令行 | 临时使用,较少用 | |
剧本文件中vars定义 | 当前这个剧本生效,涉及多个剧本不方便 | |
变量文件vars_files | 所有变量写入到文件中:key:value变量:值 ,在剧本中通过定义vars_files: 使用,引用变量文件路径./vars.yml | 每次使用需要手动在剧本加载.vars_files:./vars.yml |
主机组共用的变量文件 group_vars | 应用范围广泛,根据主机清单里面的分组创建目录,存放vars.yml | 根据主机所属的主机组,自动读取group_vars/组名/vars.yml文件.一般的结构:group_vars/all/vars.yml |
ansible内置变量(facts变量) | 收集主机的基本信息,ip地址,主机名,系统及版本… | 如果想提升ans执行速度可以关闭gather_facts: no |
register变量(注册变量) | 实现命令行$()或``功能 | 寄存器变量(注册,临时变量):把命令,模块结果,存放到reg格式变量中,通过变量.stdout取出对应值 |
11.Ansible-进阶-剧本调试方法
11.1概述
具体方法 | ||
---|---|---|
debug模块 | ||
tags标签 | ||
忽略错误 |
11.2Debug模块
debug模块 | ||
---|---|---|
msg | 相当于echo命令,配合着register一起用 | |
案例01-调试-nfs服务端部署脚本 |
cat 13-debug-nfs-server.yml
---
- hosts: dbtasks:- name: 01 部署nfs服务端软件yum:name: nfs-utilsstate: installed- name: 02 修改配置文件lineinfile:path: /etc/exportsline: "/data 172.16.1.0/24(rw)"state: presentbackup: yes- name: 03 创建对应的目录file:path: /data/owner: nfsnobodygroup: nfsnobodystate: directoryregister: file_jieguo- name: 输出,显示这个过程debug:msg: "{{ file_jieguo }}"- name: 04 启动服务rpc-bindsystemd:name: rpcbindenabled: yesstate: started- name : 05 启动服务nfssystemd:name: nfsenabled: yesstate: started
11.3 tags标签
一般用于调试剧本,给剧本每个task可以设置个标签
运行剧本的时候可以运行指定标签
运行剧本可以排除某些标签[root@m01 /server/ans/playbook]# cat 14-tags-nfs-server.yml
---
- hosts: dbtasks:- name: 01 部署nfs服务端软件yum:name: nfs-utilsstate: installedtags:- install- name: 02 修改配置文件lineinfile:path: /etc/exportsline: "/data 172.16.1.0/24(rw)"state: presentbackup: yestags:- conf- conf_file- name: 03 创建对应的目录file:path: /data/owner: nfsnobodygroup: nfsnobodystate: directorytags:- conf- conf_dir- name: 04 启动服务rpc-bindsystemd:name: rpcbindenabled: yesstate: startedtags:- start_srv- name : 05 启动服务nfssystemd:name: nfsenabled: yesstate: startedtags:- start_srv
运行指定的标签
ansible-playbook -i hosts --tags conf 14-tags-nfs-server.yml
或
ansible-playbook -i hosts --tags conf_file,conf_dir 14-tags-nfs-server.yml
运行剧本的时候排除指定的标签.
ansible-playbook -i hosts --skip-tags install,conf_file 14-tags-nfs-server.yml
11.4忽略错误
用于运行剧本的时候,强制让某个任务(模块)运行即使出错了,也不要中断我们的剧本
cat 15-ignore-tags-nfs-server.yml
---
- hosts: dbtasks:- name: 01 部署nfs服务端软件yum:name: nfs-utilstate: installedignore_errors: yestags:- install- name: 02 修改配置文件lineinfile:path: /etc/exportsline: "/data 172.16.1.0/24(rw)"state: presentbackup: yestags:- conf- conf_file- name: 03 创建对应的目录file:path: /data/owner: nfsnobodygroup: nfsnobodystate: directorytags:- conf- conf_dir- name: 04 启动服务rpc-bindsystemd:name: rpcbindenabled: yesstate: startedtags:- start_srv- name : 05 启动服务nfssystemd:name: nfsenabled: yesstate: startedtags:- start_srv
ansible-playbook -i hosts 15-ignore-tags-nfs-server.yml
11.5调试方法小结
具体方法 | 应用场景 | |
---|---|---|
debug模块 | 执行剧本的时候输出剧本的执行流程,一般配合register一起使用. 输出facts变量.自定义变量. | |
tags 标签 | 给一些模块加上标签,运行剧本的时候可以运行指定标签的内容,排除指定标签. | |
忽略错误 | 运行剧本的时候忽略一些模块的错误,让剧本继续运行. |
12.Ansible-进阶-进阶应用
- include
- handler
- when判断
- 循环
12.1 include功能-熟悉
include文件包含.把一个任务分成多个剧本来实现,书写个总剧本文件,通过include_tasks: 引用子剧本文件.
⚠ 子剧本文件中只需要些模块部分(task部分即可)