ansible playbook剧本编写以及综合案例详解(十二)

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: ansible playbook剧本1.Ad-Hoc简介Ad-Hoc其实是一个概念性的名字,是相对于写ansible playbook来说的,类似于命令行敲入shell命令和写shell脚本两者之间的关系。如果我们敲入一些目录去比较快的完成一些事情,而不需要将这些命令保存下来,这样的命令叫做ad-hoc命令,说白了就是ansible的模块。

ansible playbook剧本

1.Ad-Hoc简介

Ad-Hoc其实是一个概念性的名字,是相对于写ansible playbook来说的,类似于命令行敲入shell命令和写shell脚本两者之间的关系。


如果我们敲入一些目录去比较快的完成一些事情,而不需要将这些命令保存下来,这样的命令叫做ad-hoc命令,说白了就是ansible的模块。


ansible提供两种方式去完成任务

1)ad-hoc命令


执行shell命令或者shell脚本,可以执行一些简单的命令,不需要将这些执行的命令特别保留下来,适合执行简单的命令

2)ansible playbook


可以解决比较复杂的任务,可以将命令保存下来,适合执行配置管理或者部署客户机

AD-hoc是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbook,ad-hoc的执行依赖于模块,ansible官方提供了大量的模块,具体可以通过ansible-doc -l查看,可以使用ansible-doc -s module 来查看某个模块的参数,也可以使用ansible-doc module来查看该模块更详细的信息

2.ansible playbook基本概述

playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情

playbook通过yaml语法识别描述的状态文件,扩展名是yaml

2.1.YAML三板斧

缩进

YAML使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tab(默认,因为一个tab=4个空格)

设置tab缩进的宽度

vimrc是vim工具的模板文件
[root@ansible ~]# vim .vimrc
set tabstop=2

冒号

以冒号结尾的除外,其他所有冒号后面必须有空格

短横线

表示列表项,使用一个短横杠加一个空格

多个项使用同样的缩进级别作为同一列表

2.2.playbook的核心元素

hosts:主机清单
tasks:任务
vars:变量
handlers:特定条件触发的任务(例如启动一个服务,如果配置文件没有发生改变,则不重启)
template:包含了模板语法的文本文件
name:任务名称
notify:监控当前任务,如果修改后就触发对应的命令
例子
- host: all
 tasks:
  - name: Install rsync
    yum: name=rsync state=installed
  - name: config
    copy: src= dest=
  - name: start
      service: name=rsyncd state=started enabled=yes

2.3.ansible playbook常用选项

语法格式
ansible-playbook 选项 剧本文件
常用选项
-C,--check        //模拟运行
--list-tasks      //列出剧本任务
--list-hosts      //列出剧本主机清单
--list-tags       //列出剧本标记
--syntax-check      //检测语法

3.playbook实现配置Apache

3.1.准备Apache配置文件

[root@ansible ansible_playbook]# scp root@192.168.81.180:/etc/httpd/conf/httpd.conf conf/apache/
[root@ansible ansible_playbook]# sed -ri 's/Listen 80/Listen 8080/g' conf/apache/httpd.conf

3.2.编写Apache剧本文件

[root@ansible ansible_playbook]# vim apache_playbook.yaml 
- hosts: web
  tasks:
    - name: Install Httpd
      yum: name=httpd state=installed
    - name: Config Httpd
      copy: src=./conf/apache/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: Restart Httpd
    - name: Start Httpd
      service: name=httpd state=started enabled=yes
  handlers:
    - name: Restart Httpd
      service: name=httpd state=restarted

image.png

3.3.检测配置语法并模拟运行

[root@ansible ansible_playbook]# ansible-playbook --syntax-check apache_playbook.yaml 
playbook: apache_playbook.yaml      //出现文件名表示语法没问题

image.png

3.4.执行剧本

[root@ansible ansible_playbook]# ansible-playbook apache_playbook.yaml 
PLAY [web] *************************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [192.168.81.180]
TASK [Install Httpd] ***************************************************************************************************************************************************
ok: [192.168.81.180]
TASK [Config Httpd] ****************************************************************************************************************************************************
changed: [192.168.81.180]
TASK [Start Httpd] *****************************************************************************************************************************************************
ok: [192.168.81.180]
RUNNING HANDLER [Restart Httpd] ****************************************************************************************************************************************
changed: [192.168.81.180]
PLAY RECAP *************************************************************************************************************************************************************
192.168.81.180             : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

3.5.验证客户端是否成功

[root@web ~]# lsof -i:8080
COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   102175   root    4u  IPv6 264946      0t0  TCP *:webcache (LISTEN)
httpd   102177 apache    4u  IPv6 264946      0t0  TCP *:webcache (LISTEN)
httpd   102178 apache    4u  IPv6 264946      0t0  TCP *:webcache (LISTEN)
httpd   102179 apache    4u  IPv6 264946      0t0  TCP *:webcache (LISTEN)
[root@web ~]# curl -I 127.0.0.1:8080

4.Ansible项目案例

4.1.环境规划image.png4.2.ansible需要的配置

1)保障ssh认证生效

[root@ansible ~]# ssh-keygen -t rsa -P "" -f .ssh/id_rsa
[root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.81.220
[root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.81.230
[root@ansible ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.81.180

2)安装ansible

[root@ansible ~]# yum -y install ansible

3)准备所有配置文件

准备目录
[root@ansible ~]# mkdir -p /etc/ansible/ansible_playbook/{conf,script,file,tools}
[root@ansible ~]# tree /etc/ansible/ansible_playbook/
/etc/ansible/ansible_playbook/
├── apache_playbook.yaml
├── base.yaml
├── conf
│   ├── exports
│   ├── hosts
│   ├── mail.rc
│   ├── rsyncd.conf
│   └── selinux.config
├── cs.yaml
├── file
├── script
│   ├── rsyncd_backup.sh
│   └── rsyncd_sjjy2.sh
└── tools
1.本地hosts
[root@ansible conf]# cp /etc/hosts /etc/ansible/ansible_playbook/conf/
2.selinux配置文件
[root@ansible conf]# cp /etc/selinux/config /etc/ansible/ansible_playbook/conf/selinux.config
3.rsyncd.conf
[root@ansible conf]# cp /etc/rsyncd.conf /etc/ansible/ansible_playbook/conf/
4.exports
[root@ansible conf]# cp /etc/exports /etc/ansible/ansible_playbook/conf/
5.mail.rc
[root@ansible conf]# cp /etc/mail.rc /etc/ansible/ansible_playbook/conf/
6.sersync
7.rsync备份脚本
[root@ansible conf]# cp /server/script/rsyncd_backup.sh /etc/ansible/ansible_playbook/script/
8.rsync检测脚本
[root@ansible conf]# cp /server/script/rsyncd_sjjy2.sh /etc/ansible/ansible_playbook/script/

4.3.编写基础环境配置剧本

1)编写剧本

实现内容:

关闭selinux、配置epel仓库、安装rsync、nfs-utils(可有可无)、创建组、创建用户、创建目录、推送rsync客户端脚本、客户端密码文件、计划任务

编写剧本时建议一个模块一个任务的对应,否则会提示警告

方法1:一个任务多个模块
[root@ansible ansible_playbook]# vim base.yaml 
#对所有主机进行基本配置
- hosts: all
  tasks:
    #关闭selinux
    - name: Disable Selinux
      copy: src=./conf/selinux.config dest=/etc/selinux/config
    #推送解析文件
    - name: Push hosts
      copy: src=/etc/hosts dest=/etc
    #关闭Firewalld
    - name: Disable Firewalld
      service: name=firewalld state=stopped enabled=no
    #配置epel源
    - name: Epel Repo Base file
      get_url: url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/epel.repo
      get_url: url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/etc/yum.repos.d/CentOS-Base.repo
  #安装rsync、nfs-utils
    - name: Install Rsync Nfs-utils
      yum: name=rsync,nfs-utils state=installed
    #创建组
    - name: Create group
      group: name=www gid=666
    #创建用户
    - name: Create user
      user: name=www uid=666 group=666 create_home=no shell=/sbin/nologin
    #创建目录
    - name: Create directory
      file: path=/data owner=666 group=666 recurse=yes state=directory
      file: path=/backup owner=666 group=666 recurse=yes state=directory
      file: path=/server/script owner=666 group=666 recurse=yes state=directory
    #推送脚本
    - name: Push Script
      copy: src=./script/rsyncd_backup.sh dest=/server/script/rsyncd_backup.sh 
    #推送客户端密码文件
    - name: Push Client Backup Pass
      copy: content=123456 dest=/etc/rsync_pass mode=600
    #创建计划任务
    - name: Create Client Backup Cron
      cron: name='Rsync Backup' hour=1 minute=0 job='/bin/sh /server/script/rsyncd_backup.sh &>/dev/null' 
方法2:一个模块一个任务
[root@ansible ansible_playbook]# vim base.yaml 
#对所有主机进行基本配置
- hosts: all
  tasks:
    #关闭selinux
    - name: Disable Selinux
      copy: src=./conf/selinux.config dest=/etc/selinux/config
    #推送解析文件
    - name: Push Hosts
      copy: src=/etc/hosts dest=/etc
    #关闭Firewalld
    - name: Disable Firewalld
      service: name=firewalld state=stopped enabled=no
    #配置epel源
    - name: Epel Repo 
      get_url: url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/epel.repo
    #配置base源
    - name: Base Repo
      get_url: url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/etc/yum.repos.d/CentOS-Base.repo
    #安装rsync、nfs-utils
    - name: Install Rsync Nfs-utils
      yum: name=rsync,nfs-utils state=installed
    #创建组
    - name: Create Group
      group: name=www gid=666
    #创建用户
    - name: Create User
      user: name=www uid=666 group=666 create_home=no shell=/sbin/nologin
    #创建目录/data
    - name: Create Directory Data
      file: path=/data owner=666 group=666 recurse=yes state=directory
    #创建目录/backup
    - name: Create Directory Backup
      file: path=/backup owner=666 group=666 recurse=yes state=directory
    #创建目录/server/script
    - name: Create Directory Script
      file: path=/server/script owner=666 group=666 recurse=yes state=directory
    #推送脚本
    - name: Push Script
      copy: src=./script/rsyncd_backup.sh dest=/server/script/rsyncd_backup.sh 
    #推送客户端密码文件
    - name: Push Client Backup Pass
      copy: content=123456 dest=/etc/rsync_pass mode=600
    #创建计划任务
    - name: Create Client Backup Cron
      cron: name='Rsync Backup' hour=1 minute=0 job='/bin/sh /server/script/rsyncd_backup.sh &>/dev/null' 

2)执行剧本

[root@ansible ansible_playbook]# ansible-playbook -C base.yaml

4.4.编写rsyncd配置剧本

实现内容:

安装rsync,mailx、推送主配置文件、推送密码文件、启动服务、推送校验脚本、设置定时任务

[root@ansible ansible_playbook]# vim rsync.yaml 
#针对rsync做配置的剧本
- hosts: backup
  tasks:
    #安装rsync,mailx
    - name: Install Rsync Mailx
      yum: name=rsync,mailx state=installed
    #推送主配置文件rsyncd.conf
    - name: Push Rsyncd Config
      copy: src=./conf/rsyncd.conf dest=/etc/rsyncd.conf
    #推送密码文件
    - name: Push Rsyncd Passwd
      copy: content='rsync_backup:123456' dest=/etc/rsync_passwd mode=600
    #启动服务
    - name: Start Rsync
      service: name=rsyncd state=started enabled=yes
      notify: Restart Rsyncd
    #配置mailx
    - name: Mailx Config
      copy: src=./conf/mail.rc dest=/etc
    #推送校验脚本
    - name: Push Md5sum script
      copy: src=./script/rsyncd_sjjy2.sh dest=/server/script
    #设置定时任务
    - name: Rsyncd Check Cron
      cron: name='Rsyncd Check' hour=5 minute=0 job='/bin/sh /server/script/rsyncd_sjjy2.sh'
  handlers:
    - name: Restart Rsyncd
      service: name=rsyncd state=restarted
[root@ansible ansible_playbook]# ansible-playbook rsync.yaml

4.5.编写nfs配置剧本

实现内容:

安装nfs-utils、推送配置文件、启动

[root@ansible ansible_playbook]# vim nfs.yaml
#配置nfs
- hosts: nfs
  tasks:
    #安装nfs
    - name: Installed Nfs-utils
      yum: name=nfs-utils state=installed
    #推送配置文件
    - name: Push Nfs Config
      copy: src=./conf/exports dest=/etc/exports
      notify: Restart NFS
    #启动rpcbind
    - name: Started Rpcbind
      service: name=rpcbind state=started
    #启动nfs
    - name: Started Nfs
      service: name=nfs state=started enabled=yes
  handlers:
    - name: Restart NFS
      service: name=nfs state=restarted
[root@ansible ansible_playbook]# ansible-playbook nfs.yaml

4.6.编写安装sersync剧本

[root@ansible ansible_playbook]# vim sersync.yaml 
#配置sersync
- hosts: nfs
  tasks:
    #安装inotify-tools
    - name: Install Inotify-tools
      yum: name=inotify-tools state=installed
    #推送配置文件
    - name: Push sersync Config
      copy: src=./tools/sersync dest=/usr/local/ mode=755
    #启动
    - name: Started Sersync
      shell: /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
[root@ansible ansible_playbook]# ansible-playbook sersync.yaml

4.7.编写安装httpd并挂载nfs剧本

[root@ansible ansible_playbook]# vim httpd.yaml
#httpd配置
- hosts: web
  tasks:
    #安装httpd
    - name: Install Httpd
      yum: name=httpd state=installed
    #推送配置文件
    - name: Push Httpd Config
      copy: src=./conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: Restart Httpd
    #启动httpd
    - name: Start Httpd
      service: name=httpd state=started enabled=yes
    #挂载nfs
    - name: Mount Nfs
      mount: src=192.168.81.230:/data path=/data fstype=nfs state=mounted
  handlers:
    - name: Restart Httpd
      service: name=httpd state=restarted
[root@ansible ansible_playbook]# ansible-playbook httpd.yaml

4.8.整合playbook

[root@ansible ansible_playbook]# vim main.yaml 
#整合剧本
- import_playbook: base.yaml
- import_playbook: rsync.yaml
- import_playbook: nfs.yaml
- import_playbook: sersync.yaml
- import_playbook: httpd.yaml
相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
Ansible之playbook剧本-1
Ansible之playbook剧本
124 0
|
5月前
|
NoSQL 应用服务中间件 Shell
Ansible playbook 与handler
Ansible playbook 与handler
56 6
|
5月前
|
搜索推荐 Shell 应用服务中间件
ansible中的剧本playback详解
ansible中的剧本playback详解
|
7月前
|
关系型数据库 MySQL 网络安全
ansible 深入介绍之 主机清单与playbook
ansible 深入介绍之 主机清单与playbook
Ansible之playbook剧本-3
Ansible之playbook剧本
76 0
|
Python
Ansible之playbook剧本-2
Ansible之playbook剧本
69 0
|
Shell 网络安全 开发工具
|
运维 关系型数据库 应用服务中间件
【运维知识进阶篇】Ansible自动化运维-PlayBook详解
【运维知识进阶篇】Ansible自动化运维-PlayBook详解
268 0
|
应用服务中间件 Linux 数据安全/隐私保护
ansible:playbook学习笔记
ansible:playbook学习笔记
143 0
|
1月前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。