Ansible-Playbook--剧本
#一、Playbook介绍
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个"play"组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令
。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
ansible是通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。
playbook格式:
playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name
核心元素:
PlaybooksVariables
:变量元素,可传递给Tasks/Templates使用;Tasks
:任务元素,由模块定义的操作的列表,即调用模块完成任务;Templates
:模板元素,使用了模板语法的文本文件;Handlers
:处理器元素,通常指在某事件满足时触发的操作;Roles
:角色元素
playbook的基础组件:
- name
定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。- hosts
hosts用于指定要执行指定任务的主机.- user
remote_user则用于指定远程主机上的执行任务的用户- tasks
任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。- vars
定义变量(如果不使用内部变量需要提前定义)- vars_files
调用定义变量文件- notify
任务执行结果如果是发生更改了的则触发定义在handler的任务执行- handlers
用于当前关注的资源发生变化时采取一定指定的操作
###示例一:
在 ansible-web1 服务器的 /opt下 创建playbk_test.txt文件
#配置剧本
[aaa@qq.com ~]# vim /etc/ansible/test.yml #创建文件必须以.yml或者yaml结尾
---
- host: ansible-web1 #指定对ansible-web1操作
user: root #指定root用户去操作
tasks: #指定一个任务
- name: playbk_test #任务的名称,执行过程会打印出来
file: state=touch path=/opt/playbk_test.txt #在/opt下创建play_test.txt文件
#检测剧本
[aaa@qq.com ~]# ansible-playbook --syntax-check /etc/ansible/test.yml
playbook: /etc/ansible/test.yml
#运行剧本
[aaa@qq.com ~]# ansible-playbook /etc/ansible/test.yml
PLAY [ansible-web1] ********************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [ansible-web1]
TASK [playbk_test] *********************************************************************************************************
changed: [ansible-web1]
PLAY RECAP *****************************************************************************************************************
ansible-web1 : ok=2 changed=1 unreachable=0 failed=0
#查看ansible-web1
[aaa@qq.com ~]# ls /opt
playbk_test.txt
###示例二:
将ansible-server /root下的handlers.txt 发送到 ansible-web1 /opt下发送成功后追加文本 test 进去
handlers:由特定条件触发的Tasks
handlers:处理器
notify:触发器
语法:
tasks:
- name: TASK_NAME
module: arguments #1.上面任务执行成功,然后
notify: HANDLER_NAME #2.通知他
handlers:
- name: HANDLER_NAME #3.一一对应,这里的描述与notify定义的必须一样
module: arguments #4.执行这个命令
#在本地创建文件
[aaa@qq.com ~]# touch handlers.txt
#配置剧本
[aaa@qq.com ~]# vim /etc/ansible/handers.yaml
- hosts: ansible-web1
user: root
tasks:
- name: test copy
copy: src=/root/handlers.txt dest=/opt #拷贝文件
notify: test handlers #上面执行成功传给tes thandlers
handlers:
- name: test handlers #与上方配置传送对象一样
shell: echo 'test' >> /opt/handlers.txt
#检测剧本
[aaa@qq.com-server ~]# ansible-playbook --syntax-check /etc/ansible/handers.yaml
#运行剧本
[aaa@qq.com ~]# ansible-playbook /etc/ansible/handers.yaml
#查看ansible-web1
[aaa@qq.com ~]# cat /opt/handlers.txt
test
###示例三:
使用变量安装多个程序
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为item
,使用with_item
属性给定要迭代的元素;
#配置剧本
[aaa@qq.com ~]# vim /etc/ansible/yum_list.yml
- hosts: ansible-web1
remote_user: root
tasks:
- name: install_list
yum: name={{ item }} state=latest #使用变量安装
with_items: #变量中是如下内容
- tree
- nginx
#检测剧本
[aaa@qq.com ~]# ansible-playbook --syntax-check /etc/ansible/yum_list.yml
playbook: /etc/ansible/yum_list.yml
#运行剧本
[aaa@qq.com ~]# ansible-playbook /etc/ansible/yum_list.yml
#查看ansible-web1
[aaa@qq.com ~]# tree
.
0 directories, 0 files
[aaa@qq.com ~]# nginx -v
nginx version: nginx/1.16.1
###示例四:
自定义变量 在 ansbile-web1 /mnt下 创建vars_est目录,拷贝ansblie-server /root下的 tt_var.txt文件 到ansbile-web1/mnt/vars_est目录里
#创建变量存放目录及配置变量文件
[aaa@qq.com ~]# mkdir /etc/ansible/vars
[aaa@qq.com ~]# vim /etc/ansible/vars/vars.yml
[aaa@qq.com ~]# cat /etc/ansible/vars/vars.yml
src_path: /root/tt_var.txt
dest_path: /mnt/vars_test/
[aaa@qq.com ~]# touch tt_var.txt
#配置剧本
[aaa@qq.com ~]# vim /etc/ansible/test_var.yml
- hosts: ansible-web1
user: root
vars_files: #引用变量文件
- /etc/ansible/vars/vars.yml #变量文件位置
tasks:
- name: create derectory #任务1名称
file: path={{ dest_path }} state=directory mode=755
- name: copy file #任务2名称
copy: path={{ src_path }} dest={{ dest_path }}
#检测剧本
[aaa@qq.com ~]# ansible-playbook --syntax-check /etc/ansible/test_var.yml
playbook: /etc/ansible/test_var.yml
#运行剧本
[aaa@qq.com ~]# ansible-playbook /etc/ansible/test_var.yml
PLAY [ansible-web1] ********************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [ansible-web1]
TASK [create derectory] ****************************************************************************************************
changed: [ansible-web1]
TASK [copy file] ***********************************************************************************************************
changed: [ansible-web1]
PLAY RECAP *****************************************************************************************************************
ansible-web1 : ok=3 changed=2 unreachable=0 failed=0
#查看ansible-web1
[aaa@qq.com ~]# ll /mnt/
总用量 0
drwxr-xr-x. 2 root root 24 3月 20 02:46 vars_test
[aaa@qq.com ~]# ll /mnt/vars_test/
总用量 0
-rw-r--r--. 1 root root 0 3月 20 02:46 tt_var.txt
###实战:通过playbook安装apache
#全部配置hosts解析
[aaa@qq.com ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.181.128 ansible-web1
192.168.181.129 ansible-web2
192.168.181.130 ansible-web3
192.168.181.146 ansible-server
#server安装httpd,准备配置文件
[aaa@qq.com ~]# yum -y install httpd
[aaa@qq.com ~]# cp /etc/httpd/conf/httpd.conf . #复制配置文件
#将端口改为8080
[aaa@qq.com ~]# vim httpd.conf
Listen 8080
#配置剧本
[aaa@qq.com ~]# vim /etc/ansible/apche.yml
---
- hosts: ansible-web2
user: root
tasks:
- name: install apche
yum: name=httpd state=latest
- name: copy conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf
notify: start httpd
handlers:
- name: start httpd
service: name=httpd state=restarted
#检测剧本
[aaa@qq.com ~]# ansible-playbook --syntax-check /etc/ansible/apche.yml
playbook: /etc/ansible/apche.yml
#启动剧本
[aaa@qq.com ~]# ansible-playbook /etc/ansible/apche.yml
PLAY [ansible-web2] ********************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************
ok: [ansible-web2]
TASK [install apche] *******************************************************************************************************
changed: [ansible-web2]
TASK [copy conf file] ******************************************************************************************************
changed: [ansible-web2]
RUNNING HANDLER [start httpd] **********************************************************************************************
changed: [ansible-web2]
PLAY RECAP *****************************************************************************************************************
ansible-web2 : ok=4 changed=3 unreachable=0 failed=0
#查看ansible-web2
[aaa@qq.com ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1014/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1118/master
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 11716/sshd: aaa@qq.com
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 12593/sshd: aaa@qq.com
tcp6 0 0 :::8080 :::* LISTEN 12979/httpd
tcp6 0 0 :::22 :::* LISTEN 1014/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1118/master
tcp6 0 0 ::1:6010 :::* LISTEN 11716/sshd: aaa@qq.com
tcp6 0 0 ::1:6011 :::* LISTEN 12593/sshd: aaa@qq.com
访问测试192.168.181.129:8080
###示例五:创建多个play
play1 在 ansible-web1 创建用户和组
play2 在 ansible-web2 安装apache并启动
group模块参数:
name参数: #必须参数,用于指定组名称。
state参数: #用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组。
gid参数: #用于指定组的gid。如果不指定为随机
system参数: #如果是yes为系统组。--可选
#配置剧本
[aaa@qq.com ~]# cat /etc/ansible/play.yaml
---
- hosts: ansible-web1
user: root
tasks:
- name: create group
group: name=tomhome gid=1888 system=true
- name: create user
user: name=tom uid=1888 system=true
- hosts: ansible-web2
user: root
tasks:
- name: install apache
yum: name=httpd state=latest
- name: start apache
service: name=httpd state=started
#检测剧本
[aaa@qq.com ~]# ansible-playbook --syntax-check /etc/ansible/play.yaml
playbook: /etc/ansible/play.yaml
#运行剧本
[aaa@qq.com ~]# ansible-playbook /etc/ansible/play.yaml
###示例六:条件执行 when 模块
#配置剧本
[aaa@qq.com ~]# cat /etc/ansible/when.yaml
- hosts: ansible-web1
user: root
tasks:
- name: use when
file: path=/root/testwhen.txt state=touch
- name: insert date
shell: echo 'test' >> /root/testwhen.txt #2在执行这个模块命令
when: ansible_hostname == 'ansible-web1' #1.先条件执行,先判断when是否成立,如果成立则执行上面命令,ansible-web1指的是被控节点上真正的主机名称,不是清单里写的名称
#检测运行
[aaa@qq.com ~]# ansible-playbook --syntax-check /etc/ansible/when.yaml
[aaa@qq.com ~]# ansible-playbook /etc/ansible/when.yaml
#查看
[aaa@qq.com ~]# cat /root/testwhen.txt
test
###示例七:使用变量并且不显示搜集主机相关信息
gather_facts 参数:指定了在任务部分执行前,是否先执行setup模块获取主机相关信息,默认值为true,改成false之后在执行过程中不会搜集主机相关信息。
#配置剧本
[aaa@qq.com ansible]# vim /etc/ansible/create_user.yml
- hosts: ansible-web2
user: root
gather_facts: false #是否执行setup模块,搜集对方机器的信息
vars: #自定义变量
- user: "jack" #user是自定义变量名称,“jack”是变量值
- src_path: "/root/a.txt" #同上
- dest_path: "/root"
tasks:
- name: create user
user: name={{ user }}
- name: copy file
copy: src={{ src_path }} dest={{ dest_path }}
[aaa@qq.com ansible]# vim /root/a.txt #创建测试文件
123
#检测运行
[aaa@qq.com ~]# ansible-playbook --stntax-check /etc/ansible/create_user.yml
[aaa@qq.com ~]# ansible-playbook /etc/ansible/create_user.yml
#查看
[aaa@qq.com ~]# id jack
uid=1000(jack) gid=1000(jack) 组=1000(jack)
[aaa@qq.com ~]# cat /root/a.txt
123