剧本:
playbook 文件,用于长久保存并且实现批量管理,维护,部署的文件,类似于脚本存放命令和变量,剧本中存放的是模块,变量;
剧本yaml格式,yaml格式的文件:空格,冒号。
剧本是属于批量管理,运维必会的内容。
and剧本与and ad-hoc:他们都可以批量管理,使用模块,但也有不同;
and剧本可以重复调用,而ans ad-hoc不容易重复调用,重复使用是不是很方便;
建议:
当部署服务,有多个步骤的任务布置时,建议用剧本;
如果仅测试模块,临时性的任务,建议用ad-hoc。
---------------------------------------------------------
剧本书写格式:
文件解析:
第一行顶头三减号,可以不写;
第二行指定角色,批量执行命令的server
第三行以后就是任务列表tasks了:
- name: 就是说明性描述等;
shell: 指定模块后就可以进行操作执行了;
书写剧本 注意以.yml或.yaml结尾;
书写Ans playbook注意事项:
同一个层级的内容对齐的.
不同层级的通过2个空格对齐
不能使用tab键
可以将剧本的脚本统一放一个文件目录下:/server/script/playbook下,同时将hosts文件也复制过来,好指定主机
[root@m01 /server/script/playbook]# cp /etc/ansible/hosts .(注意,这里最后有个点,当前目录,可能看不到)
照着上边的图片书写第一个剧本
执行剧本:
[root@m01 /server/script/playbook]# ansible-playbook -i hosts 01.show.yml
#执行完,在server上可以看到,对应/tmp/ans-test.log文件有01/02/03的输出;
---------------------------------------------------------
案例01: 创建目录/server/files/并分发文件/etc/hosts到/server/files/
中间转换步骤: 任务的步骤--> 模块(命令行)
[root@m01 ~]# ansible all -m file -a 'path=/server/files/ state=directory'
[root@m01 ~]# ansible all -m copy -a 'src=/etc/hosts dest=/server/files/'
终极目地:转换为剧本
---
- hosts: all
tasks:
- name: 01 选创建目录
file: path=/server/files/ state=directory
- name: 02 分发文件
copy: src=/etc/hosts dest=/server/files/
#脚本完
注意,这晨file与copy后,一行搞定了,选项后加=号,可以这样写,如果是多行,选项后需要用:号,如下:
---
- hosts: all
tasks:
- name: 01 选创建目录
file:
path: /server/files/
state: directory
- name: 02 分发文件
copy:
src: /etc/hosts
dest: /server/files/
---------------------------------------------------------
案例02: 分发软件包,安装软件包,启动服务
zabbix-agent软件包(下载)
安装软件包
配置(略)
启动开机自启动
需要用到的模块:get_url | yum | lineinfile | systemd
脚本如下:
---
- hosts: centos
tasks:
- name: 01 下载软件包到/tmp/下
get_url:
url: https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent-6.0.7-1.el7.x86_64.rpm
validate_certs: no #类似于wget中的--no-check-certificate
dest: /tmp/
- name: 02 安装软件包
yum:
name: /tmp/zabbix-agent-6.0.7-1.el7.x86_64.rpm
state: present
- name: 03 配置
debug:
msg: "这里就用debug模块的msg,输出点信息,模拟配置了文件"
- name: 04 服务启动
systemd:
name: zabbix-agent
enabled: yes
state: started
#至此,脚本完
---------------------------------------------------------
案例03: nfs服务
nfs服务端:在backup上部署nfs服务,共享/backup-nfs目录,all_squash,匿名用户:nfsnobody
nfs客户端:web挂载 /ans-upload目录挂载nfs服务端共享的/backup-nfs(永久挂载)
第一步:列出流程
服务端流程:
1. 部署nfs-utils,rpcbind
2. 修改配置文件
3. 创建共享目录并改所有者
4. 启动服务rpcbind,nfs(注意顺序)
客户端流程:
1. 安装nfs-utils
2. 挂载与永久挂载
第二步:根据步骤写流程剧本,如下:
---
#nfs服务端部署
- hosts: backup
tasks:
- name: 01 server部署nfs-utils, rpcbind
yum:
name: nfs-utls,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 启动服务rpcbind,nfs(注意顺序)
systemd:
name: rpcbind
enabled: yes
state: started
- name: 04 续,启动服务rpcbind,nfs(注意顺序)
systemd:
name: nfs
enabled: yes
state: started
#nfs客户端部署
- hosts: web
tasks:
- name: 01 部署nfs-utils
yum:
name: nfs-utls
state: present
- name: 02 挂载nfs
mount:
src: 172.16.1.41:/backup-nfs
path: /ans-upload
fstype: nfs
state: mounted
============================================================================
Ansible中的变量
变量无处不在,在ans中大部分地方都可以定义变量;
比较常用的创建变量的地方:剧本中,类似于``(反斜杠)功能,共用的变量文件。
可以定义变量的地方:
1、在剧本文件中定义,这个比较常用. 仅仅限于当前的play使用;
2、register变量(注册变量),如ip=`hostname -I`,可以实现脚本中反引号的功能,可以获取命令结果
3、变量文件, **根据主机清单分分组进行定义变量 **,场景:如果多个剧本,使用相同的变量,大型的剧本roles
4、inventory主机清单中定义变量,可以用于批量修改主机使用,其他很少用了.
5、命令行中,几乎不用.
6、facts变量,一般用于获取主机基本信息:ip,主机名,系统(centos/ubuntu);如果不需要可以关闭,用于加速剧本的执行
---------------------------------------------------------
剧本中使用变量
批量创建/test-vir/test/upload/
vars : variable 变量的内容,变量.
dir就是变量,变量的内容:右边的内容.
cat 05.vars.yml
- hosts: all
vars:
dir: /test-vir/test/upload/
tasks:
- name: 创建目录
file:
path: "{{ dir }}"
state: directory
注:使用变量的时候如果变量是某个选项的开头,则变量引用的时候需要加上双引号。
path: /test-vir/{{ dir }} #这种可以不加引号,变量不是开头
注:在剧本play中定义变量应用:
1. 仅仅在当前play生效;
2. 一般用来存放路径,用户名,ip地址,类似于之前使用的脚本;
3. 注意引号使用。
---------------------------------------------------------
共用变量-变量文件
cat 05.vars.yml
---
- hosts: all
var_files: ./vars.yml
tasks:
- name: file test
file:
path: "{{ dir }}/{{ user }}-{{ file }}"
state: touch
cat vars.yml
dir: /tmp/
file: test.txt
user: mclind
#文件完
---------------------------------------------------------
共用变量-根据主机组使用变量
group_vars根据主机清单的分组去匹配;
变量文件;
主机组创建变量文件;
目录如下:
group_vars/ #下边是这个目录下的结构
lb/vars.yml #存放lb组的变量
web/vars.yml #存放web组的变量
data/vars.yml #存放data组的变量
all/vars.yml #所有主机共用的变量
一般使用all分组即可,把所有变量存放一起供剧本使用
[root@m01 /server/script/playbook]# mkdir -p group_vars/all/
[root@m01 /server/script/playbook]# vim group_vars/all/vars.yml
user: www
nfs_dir: /nfs_backup
web_mount_dir: /web_nfs
nfs_server: 172.16.1.41
rsync_pass: 1
#变量脚本完,接下来就可以写测试脚本了
cat test.yml
- hosts: all
tasks:
- name: 测试group变量
debug:
msg: "变量内容{{user}} {{rsync_pass}}"
- hosts: web
tasks:
- name: 测试web组是否识别group变量
debug:
msg: "web组识别的变量内容{{user}} {{rsync_pass}}"
---------------------------------------------------------
facts变量
ans内置变量,ans运行剧本的时候会有一个默认的task(Gathering Facts),这个背后在收集每个主机的基本信息。(比如,IP,主机名,磁盘,这个主机的各种信息)
这些基本信息就称为facts变量;
facts变量setup模块获取
[root@m01 ~]# ansible backup -m setup
常用fact变量
ansible_hostname #主机名
ansible_memtotal_mb #内存大小(总计) 单位mb
ansible_processor_vcpus #cpu数量
ansible_default_ipv4.address #默认的网卡ip eth0
ansible_distribution #系统发行版本名字
CentOS Ubuntu Debian ...
ansible_processor_vcpus
ansible_processor_cores
ansible_date_time.date
批量修改系统/etc/motd文件,登录的时候输出系统的基本信息.
输出主机名
输出内存总大小
输出ip地址
发行版本
cpu数
核心数
#1. 创建包含变量的模板文件
#2. 发送模板文件替代/etc/motd 即可
cat 07.change_motd.yml
- hosts: all
tasks:
- name: 分发motd文件
template:
src: templates/motd.j2
dest: /etc/motd
backup: yes
- name: 分发motd文件
cp:
src: templates/motd.j2
dest: /tmp/motd
backup: yes
[root@m01 ~]# cat templates/motd.j2
#################################
welcome to oldboy elastic linux system
操作需谨慎,删根弹指间.
主机名: {{ ansible_hostname }}
ip地址: {{ ansible_default_ipv4.address }}
内存大小: {{ ansible_memtotal_mb }}
CPU数量: {{ ansible_processor_vcpus }}
核心总数: {{ ansible_processor_cores }}
发行版本: {{ ansible_distribution }}
注:template vs copy模块
copy仅仅传输数据,复制文件.
template 传输数据,复制文件的时候,文件中的变量会被解析和运行。
关于facts变量实际应用案例:
1. 通过facts变量获取系统的基本信息
2. 通过facts变量获取信息并进行判断
3. 如果不需要可以进行关闭,加速剧本的运行( gather_facts: no)。
---------------------------------------------------------
register变量注册变量
本质上就是用来实现脚本中的 反引号功能,ip=`hostname -I`
用户通过命令获取的内容都存放到Register变量中
某个Register变量的信息:date
{
'stderr_lines': [],
u'changed': True,
u'end': u'2022-08-24 16:38:27.887829',
'failed': False,
u'stdout': u'2022-08-24',
u'cmd': u'date +%F',
u'rc': 0,
u'start': u'2022-08-24 16:38:27.860574',
u'stderr': u'',
u'delta': u'0:00:00.027255',
'stdout_lines': [u'2022-08-24'],
'ansible_facts': {u'discovered_interpreter_python':
u'/usr/bin/python'}
这里是JSON,字典格式;
json形式数据.
key: value
键: 值
变量: 内容
cat 08.reg-var.yml
- hosts: all
tasks:
- name: get date
shell: date +%F
registr: result
- name: print result 变量内容
debug:
msg: |
"registr变量的全部内容是:{{ result.stderr }}"
"register变量的精确的内容是:{{ result.stdout }}"
#也可以先打印一行
msg: dater命令结果,{{ result }}
注:
stdout部分是我们想要的内容.
register变量result.
result.stdout #std standard output 标准输出
msg:中的|表示下面的内容是多行. |也可以用于其他模块中.