1.剧本概述
playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件. 类似于脚本存放命令和变量
剧本yaml格式,yaml格式的文件:空格,冒号
2. 区别
|-----|--------------|-------------|
| | ans-playbook | ans ad-hoc |
| 共同点 | 批量管理,使用模块 | 批量管理,使用模块 |
| 区别 | 重复调用 | 不是很方便,不容易重复 |
| 场景 | 部署服务,多个步骤的任务 | 测试使用 |
- 剧本书写格式
bash
##书写剧本
---
- hosts: all
tasks:
- name: 这是第1个
shell: echo '1' >/tmp/xzb66.txt
- name: 这是第2个
shell: echo '2'>/tmp/xzb66.txt
- name: 这是第3个
shell: echo '3'>/tmp/xzb66.txt
##执行剧本 -i 指定你的/etc/ansible/hosts的文件地址
ansible-playbook -i hosts 01-playbook-yml
执行的时候有奶牛:
可以删除软件或修改ansible.cfg配置进行关闭 #nocows = 1 去掉注释即可
书写Ans playbook注意事项:
同一个层级的内容对齐的
不同层级的通过2个空格对齐
不能使用tab键
3.剧本案例
案例01: 创建目录并分发文件
bash
##1. 创建目录/server/files/
##2. /etc/hosts文件发送过去/server/files/
---
- hosts: all
tasks:
- name: 01创建目录
file:
path: /server/file/
state: directory
- name: 02创建文件
copy:
src: /etc/hosts
dest: /server/file/
##3. 执行剧本,查看结果
ansible-playbook -i hosts 02-playbook.yml
案例02: 分发软件包,安装软件包,启动服务
bash
- hosts: all
tasks:
- name: 01 下载软件包
get_url:
url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.7-1.el7.x86_64.rpm
validate_certs: no
dest: /tmp/
- name: 02 安装软件包
yum:
name: /tmp/zabbix-agent2-6.0.7-1.el7.x86_64.rpm
state: present
- name: 03 配置
debug:
msg: "进行配置zabbix-agent"
- name: 04 开机自启
systemd:
name: zabbix-agent2
enabled: yes
state: started
bash
##运行剧本
ansible-playbook -i hosts 03-playbook.yml
##查看结果
ansible all -i hosts -m shell -a 'ps -ef|grep zabbix'
案例03: 部署NFS服务
bash
##nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody
##nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)
- hosts: backup
tasks:
- name: 01 在backup上部署nfs,rpcbind服务端
yum:
name: nfs-utils,rpcbind
state: present
- name: 02 修改配置文件
lineinfile:
path: /etc/exports
line: "backup-nfs 172.16.1.0/24(rw,all_squash)"
create: true
- name: 03 创建共享目录并修改所有者
file:
path: backup-nfs
owner: nfsnobody
group: nfsnobody
state: directory
- name: 04-1 启动服务(注意顺序)
systemd:
name: rpcbind
enabled: yes
state: started
- name: 04-02 启动服务
systemd:
name: nfs
enabled: yes
state: started
- hosts: nfs
tasks:
- name: 01 部署nfs-utils
yum:
name: nfs-utils
state: present
- name: 02 挂载
mount:
src: 172.16.1.41:/backup-nfs
path: /ans-upload
fstype: nfs
state: mounted
bash
##运行剧本,查看结果
ansible-playbook -i hosts 05-playbook-yml
##查看
ansible nfs -i hosts -a 'df -h'
4. Ansible中的变量
变量无处不在,在ans中大部分地方都可以定义变量
比较常用的创建变量的地方:剧本中,类似于命令行 ` `(反引号)的 功能,共用的变量文件.
|-----------------------|------------------------------------------------------------|
| 可以定义变量的地方 | 说明 |
| 在剧本文件中定义 | 比较常用. 仅仅限于当前的play使用 |
| register变量(注册变量) | ip=`hostname -I` 实现脚本中反引号的功能,可以获取命令结果 |
| 变量文件(根据主机清单分分组进行定义变量) | 如果多个剧本,使用相同的变量,大型的剧本roles |
| inventory主机清单中定义变量 | 未来可以用于批量修改主机使用,其他很少用了 |
| facts变量 | 一般用于获取主机基本信息:ip,主机名,系统 (centos/ubuntu) 如果不需要可以关闭,用于加速剧本的执行 |
4.1 剧本中使用变量
批量创建/oldboy/xzb/upload/
- hosts: all
vars:
dir: /oldboy/xzb996/upload/
tasks:
- name: 创建目录
file:
path: "{{dir}}"
state: directory
##运行剧本,查看结果
ansible-playbook -i hosts 05-vars-yml
提示:
使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号
在剧本play中定义变量应用:仅仅在当前play生效,一般用来存放路径,用户名,ip地址,类似于之前使用的脚本,注意引号使用
dir: /oldboy/xzb/upload/
file:
path: "{{ dir }}"#这种要添加,变量是开头.
file:
path: /oldboy-new/{{ dir }} #这种可以不加引号,变量不是开头.
4.2 共用变量-变量文件
##创建变量文件
dir: /tmp/
file: xzb.txt
user: xzb996
##创建剧本
- hosts: all
vars_files: ./vars.yml ##也可以写变量文件的绝对路径
tasks:
- name: 变量文件
file:
path: "{{dir}}/{{user}}-{{file}}"
state: touch
##运行剧本,查看结果
ansible-playbook -i hosts 06-vars.yml
4.3 共用变量-根据主机组使用变量
group_vars/
lb/vars.yml #存放lb组的变量
web/vars.yml #存放web组的变量
data/vars.yml #存放xxx组的变量
all/vars.yml #所有主机共用的变量
未来一般使用all分组即可,把所有变量存放在一起,供剧本使用
bash
##在剧本的统计目录下创建group_vars/all/vars.yml
[root@ansible_xing /server/scripts/playbook]# mkdir -p /group_vars/all/
vim vars.yml
user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1
##创建剧本
[root@ansible_xing /server/scripts/playbook]# vim 07-group-vars.yml
- hosts: all
tasks:
- name: 测试group变量
debug:
msg: "变量内容 {{user}} {{rsync_pass}}"
- hosts: backup
tasks:
- name: 测试web组是否被识别到
debug:
msg: "web组识别的变量内容为{{user}} {{rsync_pass}}"
bash
##运行剧本
ansible-playbook -i hosts 07-group-vars.yml
4.4 register变量注册变量
本质上就是用来实现脚本中的反引号功能. ip=`hostname -I`
用户通过命令获取的内容都存放到Register变量中
bash
- hosts: all
tasks:
- name: get data
shell: date +%F
register: result
- name: print result 变量内容
debug:
msg: "register变量的全部内容是{{result.stdout}}"
bash
##运行脚本查看结果
ansible-playbook -i hosts 08-reg-vars.yml
4.5 facts变量
运行剧本的时候ans会收集每个主机的基本信息,这些信息形成的变量叫做facts变量.
facts变量setup模块获取,可以通过ansible -i hosts nfs -m setup查看.
bash
##常用fact变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4.address #默认的网卡ip eth0
ansible_distribution #系统发行版本名字
bash
- hosts: all
tasks:
- name: 显示系统信息
debug:
msg: |
你的系统是:{{ansible_hostname}}
内存大小:{{ansible_memtotal_mb}}
cpu数量:{{ansible_processor_vcpus }}
默认网卡ip:{{ansible_default_ipv4.address}}
系统发行版本:{{ansible_distribution}}
bash
##运行脚本,查看结果
ansible-playbook -i hosts 09-facts.yml