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

核心元素:
Playbooks
Variables :变量元素,可传递给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文件

#配置剧本
[root@ansible-server ~]# 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文件

#检测剧本
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/test.yml

playbook: /etc/ansible/test.yml

#运行剧本
[root@ansible-server ~]# 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
[root@ansible-web1 ~]# 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.执行这个命令
#在本地创建文件
[root@ansible-server ~]# touch handlers.txt

#配置剧本
[root@ansible-server ~]# 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

#检测剧本
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/handers.yaml

#运行剧本
[root@ansible-server ~]# ansible-playbook /etc/ansible/handers.yaml

#查看ansible-web1
[root@ansible-web1 ~]# cat /opt/handlers.txt 
test

###示例三:
使用变量安装多个程序

循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为 item,使用 with_item 属性给定要迭代的元素;

#配置剧本
[root@ansible-server ~]# 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

#检测剧本
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/yum_list.yml

playbook: /etc/ansible/yum_list.yml

#运行剧本
[root@ansible-server ~]# ansible-playbook /etc/ansible/yum_list.yml

#查看ansible-web1
[root@ansible-web1 ~]# tree
.

0 directories, 0 files

[root@ansible-web1 ~]# nginx -v
nginx version: nginx/1.16.1

###示例四:
自定义变量 在 ansbile-web1 /mnt下 创建vars_est目录,拷贝ansblie-server /root下的 tt_var.txt文件 到ansbile-web1/mnt/vars_est目录里

#创建变量存放目录及配置变量文件
[root@ansible-server ~]# mkdir /etc/ansible/vars
[root@ansible-server ~]# vim /etc/ansible/vars/vars.yml
[root@ansible-server ~]# cat /etc/ansible/vars/vars.yml 
src_path: /root/tt_var.txt
dest_path: /mnt/vars_test/
[root@ansible-server ~]# touch tt_var.txt

#配置剧本
[root@ansible-server ~]# 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 }}

#检测剧本
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/test_var.yml

playbook: /etc/ansible/test_var.yml

#运行剧本
[root@ansible-server ~]# 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
[root@ansible-web1 ~]# ll /mnt/
总用量 0
drwxr-xr-x. 2 root root 24 3月  20 02:46 vars_test

[root@ansible-web1 ~]# ll /mnt/vars_test/
总用量 0
-rw-r--r--. 1 root root 0 3月  20 02:46 tt_var.txt

###实战:通过playbook安装apache

#全部配置hosts解析
[root@ansible-server ~]# 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,准备配置文件
[root@ansible-server ~]# yum -y install httpd
[root@ansible-server ~]# cp /etc/httpd/conf/httpd.conf .     #复制配置文件

#将端口改为8080
[root@ansible-server ~]# vim httpd.conf
Listen 8080

#配置剧本
[root@ansible-server ~]# 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

#检测剧本
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/apche.yml

playbook: /etc/ansible/apche.yml

#启动剧本
[root@ansible-server ~]# 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
[root@ansible-web2 ~]# 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: root@pt 
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      12593/sshd: root@pt 
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: root@pt 
tcp6       0      0 ::1:6011                :::*                    LISTEN      12593/sshd: root@pt

访问测试192.168.181.129:8080

image.png

###示例五:创建多个play
play1 在 ansible-web1 创建用户和组
play2 在 ansible-web2 安装apache并启动

group模块参数:
name参数:     #必须参数,用于指定组名称。
state参数:     #用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组。
gid参数:     #用于指定组的gid。如果不指定为随机
system参数:     #如果是yes为系统组。--可选
#配置剧本
[root@ansible-server ~]# 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

#检测剧本
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/play.yaml

playbook: /etc/ansible/play.yaml

#运行剧本
[root@ansible-server ~]# ansible-playbook /etc/ansible/play.yaml

###示例六:条件执行 when 模块

#配置剧本
[root@ansible-server ~]# 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指的是被控节点上真正的主机名称,不是清单里写的名称

#检测运行
[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/when.yaml
[root@ansible-server ~]# ansible-playbook /etc/ansible/when.yaml

#查看
[root@ansible-web1 ~]# cat /root/testwhen.txt 
test

###示例七:使用变量并且不显示搜集主机相关信息
gather_facts 参数:指定了在任务部分执行前,是否先执行setup模块获取主机相关信息,默认值为true,改成false之后在执行过程中不会搜集主机相关信息。

#配置剧本
[root@ansible 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 }}
[root@ansible ansible]# vim /root/a.txt    #创建测试文件
123

#检测运行
[root@ansible-server ~]# ansible-playbook --stntax-check /etc/ansible/create_user.yml
[root@ansible-server ~]# ansible-playbook /etc/ansible/create_user.yml

#查看
[root@ansible-web2 ~]# id jack
uid=1000(jack) gid=1000(jack) 组=1000(jack)
[root@ansible-web2 ~]# cat /root/a.txt 
123
发布了92 篇原创文章 · 获赞 0 · 访问量 1435

猜你喜欢

转载自blog.csdn.net/Forgetfanhua/article/details/105249459