ansible剧本类似于shell脚本 但是他有自己的语法规范
ansible剧本作用介绍
(1) 可以实现服务自动部署
(2) 可以提高运维工作效率
(3) 可以较少运维工作问题(报错)
(4) 可以节省公司运维成本
- 剧本编写组成:
(1) 剧本的角色信息: hosts: xx(定义主机信息)
(2) 剧本任务信息: tasks: (定义任务信息)
剧本的编写规范
编写规范遵循yaml语法规范
- 缩进规范 两个空格表示一个缩进
不平级标题之间开头相隔两个空格
注意: 缩进只能以空格表示 tab会报错 - 字典规范 冒号后面要有空格
例:shell: 命令信息
注意: 冒号结尾时不需要有空格 注释信息中冒号也不需要 - 列表规范: 横线后面要有一个空格
例:
name:
- nfs
- rsync
剧本编写及注意事项
编写脚本时要用.yml当后缀 方便显示剧本内编写格式
vim test.yml
- 执行剧本命令:
ansible-playbook 剧本路径
- 测试剧本命令:
ansible-playbook -C 剧本路径
- 检测剧本语法是否错误:
ansible-playbook --syntax-check 剧本路径
PS: 剧本写完后先进行语法检查 然后在测试剧本 最后在执行
编写剧本: rsync自动搭建项目
#rsync服务自动搭建
- hosts: rsync_serve 定义执行命令的主机组(角色)
tasks: 定义需要执行的命令 (剧本)
- name: 分发编写的配置文件 注释信息 将任务分隔开 报错容易排查
copy: src=/server/playbook/deploy/rsyncd.conf dest=/etc/
- name: 创建用户 缩进两个空格
user: name=rsync shell=/sbin/nologin create_home=no
- name: 创建目录 赋予权限 - name: 代表列表信息
file: path=/backup owner=rsync group=rsync state=directory
- name: 创建书写验证文件
copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
- name: 启动服务
service: name=rsyncd state=started enabled=yes
#rsync客户端搭建
- hosts: rsync_client 另一角色组
tasks: 新定义的剧本
- name: 编写密码文件
copy: content='123456' dest=/etc/rsync.password mode=600
- name: 创建测试文件
file: path=~/test.txt state=touch
- name: 测试是否可用
shell: rsync -avz /root/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
- name: 删除测试文件
file: path=~/test.txt state=absent
剧本编写扩展功能
在剧本中设置变量信息
vars: 指定变量信息
方法一: 在剧本中设置变量
- hosts: 172.16.1.41
Vars: 设置变量命令
- Abc: 123 设置的变量
tasks:
- name: 注释信息
copy: src={{ Abc }} 引用变量 用两个花括号引用并变量两边都有空格分隔
方法二:在命令中设置变量
ansible-playbook -e abc=123 xxx剧本
参数-e 设置临时变量
方法三: 在主机清单中设置
(1) 单个主机设置变量
172.16.1.31 Abc=123
(2) 多个主机设置变量
[backup]
172.16.1.41
172.16.1.31
[backup:vars]
Abc=123
PS: 三种变量命令行配置变量优先级最高
其次为剧本中设置
最后为主机清单配置
在剧本中设置注册信息
register:
指定注册信息
在执行剧本时不会输出信息 注册功能就是将某些信息输出显示出来
- hosts: nfs_client
tasks:
- name: mount dir
mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
- name: check mount
shell: df -h
register: oldboy 在要输出内容的命令下写入 设置变量
- name: display mount info 因为shell和debug不能再一条中所以分开
debug: msg={{ oldboy.stdout_lines }} 引用变量 输出内容
PS:
register:
指定一个变量 赋予上方命令执行结果
debug:
排查模块 可指定内容在剧本执行时进行输出
.stdout_lines
指定输出内容更容易看懂
在剧本中设置判断信息
when:
指定判断信息
判断一些主机是否符合条件 按条件判断是否执行某些命令以便更灵活的管理主机
判断常用信息
Ansible 172.16.1.41 -m setup -a “ansible_hostname”
(收集主机所有信息)
常用主机信息:
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例:32位,还是64位。
ansible_eth0: 仅显示eth0的信息。
ansible_hostname: 仅显示主机名。
ansible_kernel: 仅显示内核版本。
ansible_lvm: 显示lvm相关信息。
ansible_memtotal_mb: 显示系统总内存。
ansible_memfree_mb: 显示可用系统内存。
ansible_memory_mb: 详细显示内存情况。
ansible_swaptotal_mb: 显示总的swap内存。
ansible_swapfree_mb: 显示swap内存的可用内存。
ansible_mounts: 显示系统磁盘挂载情况。
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
判断信息设置方法
- hosts: all
tasks:
- name: install software
yum: name=nfs-utils state=installed
- name: create data dir
file: path=/data/ state=directory
when: (ansible_hostname == "nfs01") 判断符合主机名为nfs01的才可执行上面命令
PS: when: (判断条件 == “条件值”) when剧本内置判断命令
判断语法结构信息:
匹配单个信息:
when: (ansible_hostname == "nfs01")
(匹配符合这个条件的才可以)匹配多个信息
when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
(或者关系 满足其中一个条件就可以)
when: (ansible_hostname == "nfs01") and (ansible_eth0 == "10.0.0.31")
(并且关系 满足多个条件才可以)对匹配信息进行取反
when: (ansible_hostname != "nfs01")
(匹配不符合这个条件的才可以)
剧本中的循环功能
with_items:
指定循环信息
同一条命令多次执行时可用循环模式
例
- hosts: 172.16.1.41
tasks:
- name: 批量创建用户
user: name={{ item }}
with_items:
- oldboy
- rsync
with_items 定义变量循环 上面{{ }} 引用循环
也可写作
- hosts: 172.16.1.41
tasks:
- name: 批量创建用户
user: name={{ n1 }} shell={{ n2 }} uid={{ n3 }}
with_items:
- {n1: ‘rsync01’, n2: ‘/sbin/nologin’, n3: ‘3001’}
- {n1: ‘rsync02’, n2: ‘/bin/bash’,n3: ‘3002’}
第一次循环会读取第一条的内容并被上面引用 第二次循环会引用第二条的内容从而达到多次循环
剧本的忽略错误功能
ignore_errors: yes
指定忽略错误信息
因为剧本的特性 逐条执行剧本 所有当剧本中某条命令报错 剧本就会停止
这样对shell等没有密等性的命令很不友好 这里就需要忽略错误继续执行后面的剧本
例
- hosts: 172.16.1.41
tasks:
- name: 错误忽略功能
shell: useradd rsync 当有这个用户 就会报错
ignore_errors: yes 开启忽略当前错误(忽略这一个name条目中所有命令的错误)
剧本中标签功能
剧本中写入tags:
指定标记信息
命令行输入参数 -t
指定单独执行剧本内的标记命令
命令行输入参数 –skip-tags
指定除了标记信息剩下的全执行
把某条命令标记上 以便拿出来单独执行或跳过 就不执行那条命令
例
- hosts: 172.16.1.41
tasks:
- name: 标签功能
shell: mount -t nfs 172.16.1.41:/data /mnt
- name: 标签功能
shell: mount /dev/sbd2 /tmp
tags: moot 自己定义
命令行输出:第一种
ansible-playbook xx.yml -t moot 只执行标记的任务
ansible-playbook xx.yml –skip-tags moot 指定不执行这条命令 执行其他的
取消剧本收集主机信息功能
加快剧本运行速度
gather_facts: no
指定是否关闭收集主机信息功能 当关闭时 判断功能无法使用
例
- hosts: backup
gather_facts: no 指定关闭收集主机信息功能 默认为yes
tasks:
- name: xxx
剧本触发功能配置
notify: xx
定义触发器名称
handlers:
定义触发触发器后执行的命令
当有些配置文件做出改变时 需要重启服务 这时需要触发器 当检查到文件改变就会触发触发器
例
- hosts: 172.16.1.41
tasks:
- name: 复制文件
copy: src=/tmp/ dest=/etc/
notify: copy01 自己定义触发器名,被触发后到下面找这个名字的触发器
handlers: 所以命令的最后执行触发器
- name: copy01 触发器 触发后执行触发器下面的命令
service: name=rsyncd state=restarted