将ansible一条一条需要执行的命令(任务),编排到一个文件里,统一的有序的执行。这个文件就叫playbook。playbook是ansible的脚本文件
playbook是Ansible的配置,部署和编排的语言。他们可以描述你所希望的远程系统强制执行的政策,或者在一般的IT流程的一组步骤;形象点的说就是:如果ansible的各模块(能实现各种功能)是车间里的各工具;playbook就是指导手册,目标远程主机就是库存和原料对象.
playbook是基于YAML语言格式配置
1.shell脚本: 脚本需要自己编写、要求写脚本的能力比较强、shell脚本的执行的并发性、多线程和多进程的方面是否有优势。通过免密通道+scp+ssh
2.ansible: 模块使用更加简单、很多模块可以使用、节约了很多脚本开发的工作、多线程和多进程、web界面管理
从运维的方便和简单、可替代性方面考虑,ansible有优势
hosts : playbook配置文件作用的主机
tasks: 任务列表
variables: 变量
vars: 变量
templates:包含模板语法的文本文件
handlers :由特定条件触发的任务
roles :用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等
ansible-playbook --check 只检测可能会发生的改变,但不真执行操作
ansible-playbook --list-hosts 列出运行任务的主机
ansible-playbook --syntax-check playbook.yaml 语法检测
-C:效果一样
ansible-playbook -t TAGS_NAME playbook.yaml 只执行TAGS_NAME任务
ansible-playbook playbook.yaml 运行
template模板可以使用ansible里的内置变量和yaml文件里自定义的变量
如何获取ansible里的内置变量?
ansible all -m setup
all 是主机清单里代表所有的主机
ansible web -m setup
web 是主机清单里代表web组的主机
{{ ansible_facts["ens33"]["ipv4"]["address"] }} -->jinja2模板里调用ansible里的内置的变量
示例
示例:给web组的机器安装管理redis服务
[root@ansible ~]# mkdir playbooks
[root@ansible ~]# cd playbooks/
[root@ansible playbooks]# vim redis.yaml
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: start redis
service: name=redis state=started
更加的复杂的操作
由于上面的操作是直接安装redis服务并启动,并没有配置文件,这还不能往生产环境中使用,生产环境中的redis肯定有不同的配置项,因此需要在安装时提供配置文件
[root@ansible playbooks]# yum install redis -y
[root@ansible playbooks]# cp /etc/redis.conf .
[root@ansible playbooks]# pwd
/root/playbooks
[root@ansible playbooks]# ls
redis.conf redis.yaml
[root@ansible playbooks]# vim redis.conf
bind 0.0.0.0 添加配置
[root@ansible playbooks]# cp redis.yaml redis2.yaml
[root@ansible playbooks]# vim redis2.yaml
- hosts: all #所有远程主机
remote_user: root #以远程主机上root用户执行
tasks: #任务
- name: remove redis
yum: name=redis state=absent
- name: install redis #任务之安装
yum: name=redis state=latest #动作调用yum模块安装
- name: copy config file #任务之复制同步配置文件到远程目标主机
copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis #动作copy模块执行
notify: restart redis #触发的动作的名字,发通知给handlers
tags: configfile #任务标记名configfile
- name: start redis #任务之启动redis
service: name=redis state=started #动作调用sevice模块
handlers: #特定情况下,接收到其他任务的通知时被触发
- name: restart redis
service: name=redis state=restarted
1.你使用的ansible什么版本?
2.任务:使用playbook完成
0.卸载nginx
1.yum安装nginx
2.修改nginx的配置的端口号9900
4.启动nginx
5.卸载tree命令软件
6.在所有的node节点服务器上新建/backup目录
7.编写一个脚本实现备份/etc/passwd和/etc/shadow文件到/backup下,文件名里包含当天的日期,例如2019-7-10-passwd_shadow.tar.gz 添加一个计划任务,每天的3:30去执行,在所有的node节点服务器上实施。
[root@ansible playbooks]# cat nginx_cron_backup.yaml
- hosts: all
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=latest
- name: modify port
shell: sed -i '39,40 s/80/8080/g' /etc/nginx/nginx.conf
- name: start nginx
service: name=nginx state=restarted
- name: absent tree
yum: name=tree state=absent
- name: send file
copy: src=/test/bf.sh dest=/root/sanchuang
notify: run shell
handlers:
- name: run shell
cron: minute=30 hour=3 job='bash /root/sanchuang/bf.sh' name=backup_file