博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ansible之playbook的使用总结 - 运维笔记
阅读量:5330 次
发布时间:2019-06-14

本文共 10016 字,大约阅读时间需要 33 分钟。

 

之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结.

为什么引入playbook?

一般运维人员完成一个任务, 比如安装部署一个httpd服务会需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,它的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language)。YAML语法能够简单的表示散列表,字典等数据结构。简单来说, playbook是由一个或多个模块组成的,使用多个不同的模块,完成一件事情。 

Ansible核心功能

-  pyYAML用于ansible编写剧本所使用的语言格式(saltstack---python);
-  rsync-ini语法, sersync-xml语法, nsible-pyYAML语法;
-  paramiko远程连接与数据传输;
-  Jinja2用于编写ansible的模板信息;

YAML三板斧

缩进: YAML使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs;
冒号: 以冒号结尾的除外,其他所有冒号后面所有必须有空格;
短横线: 表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表;

YAML基本语法

列表:每一个列表成员前面都要有一个短横线和一个空格

fruits:    - Apple    - Orange    - Strawberry    - Mango或者:fruits: ['Apple', 'Orange', 'Strawberry', 'Mango']

字典:每一个成员由键值对组成,注意冒号后面要有空格

martin:    name: Martin D'vloper    job: Developer    skill: Elite或者martin: {name: Martin D'vloper, job: Developer, skill: Elite}

列表和字典可以混合使用

-  martin:    name: Martin D'vloper    job: Developer    skills:      - python      - perl      - pascal-  tabitha:    name: Tabitha Bitumen    job: Developer    skills:      - lisp      - fortran      - erlang

playbook基础组件

Hosts:运行执行任务(task)的目标主机
remote_user:在远程主机上执行任务的用户
tasks:任务列表
handlers:任务,与tasks不同的是只有在接受到通知时才会被触发
templates:使用模板语言的文本文件,使用jinja2语法。
variables:变量,变量替换{
{ variable_name }}

整个playbook是以task为中心,表明要执行的任务。hosts和remote_user表明在哪些远程主机以何种身份执行。其他组件让其能够更加灵活。下面介绍下这些插件:

1.  variable

变量定义在资产 (inventory) 中, 默认就是/etc/ansible/hosts文件中

主机变量:192.168.200.136 http_port=808 maxRequestsPerChild=808192.168.200.137 http_port=8080 maxRequestsPerChild=909主机组变量:[websers]192.168.200.136192.168.200.137[websers:vars]  ntp_server=ntp.exampl.comproxy=proxy.exampl.com

变量定义在playbook中

- hosts: webservers  vars:    http_port: 80

使用facts变量

facts变量是由setup模块获取远程主机的信息。用法:# ansible 192.168.200.136 -m setup

在roles中定义变量, 这个后面会介绍到.

ansible-playbook 命令中传入参数

使用 -e选项传入参数# ansible-playbook 192.168.200.136 -e "httpd_port=808" httpd04.yml

变量的引用

{
{ var_name }}

2.  templates

它是一个模块功能,与copy不同的是他的文本文件采用了jinga2语法,jinga2基本语法如下:

字面量:  字符串:使用单引号或双引号  数字:整型,浮点数  列表:{item1,item2,...}  字典:{key1:value1,key2:value2,...}  布尔型:true/false算术运算:  +,-,*,/,//,%,**比较运算:  ==,!=,>,>=,<,<=逻辑运算:  and,or,not

注意:template只能在palybook中使用。

3.  tasks

执行的模块命令

格式:  action:模块参数(此种方式只在较新的版本中出现)  module:参数(已键值对的形式出现)每一个task都有一个名称,用于标记此任务。任务示例:  name: install httpd  yum: name=httpd state=present注意:shell和command没有参数,可在后面直接跟命令  shell: ss -tnl | grep :801)某任务的运行状态为changed后,可通过相应的notify通知相应的handlers2)任务可以通过tags打标签,然后通过palybook命令-t选项调用.

playbook调用方式

用法:

ansible-playbook  <filename.yml> ... [options]

<filename.yml>: yaml格式的playbook文件路径,必须指明

[options]: 选项

-C, --check:并不在远程主机上执行,只是测试。

-i PATH, --inventory=PATH:资产的文件路径
--flush-cache:清楚fact缓存
--list-hosts:列出匹配的远程主机,并不执行任何动作
-t, TAGS, --tags=TAGS:运行指定的标签任务
--skip-tags:跳过指定的notify,后面详细介绍。

palybook书写格式

- hosts: 172.16.60.211                #处理指定服务器.   - (空格)hosts:(空格)172.16.20.211  task:                               #剧本所要干的事情; (空格)(空格)task:  - name:                             #(两个空格)-(空格)name:    command: echo hello clsn linux    #(四个空格)command:(空格)

palybook格式示例

[root@ansible-server ~]# vim /etc/ansible/test.yaml- hosts: 172.16.60.213  tasks:    - name: Install Rsync      yum: name=rsync state=installedplaybook检查方法[root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/test.yamlplaybook: /etc/ansible/test.yaml[root@ansible-server ~]# ansible-playbook -C /etc/ansible/test.yamlPLAY [172.16.60.213] *******************************************************************************************************************TASK [Gathering Facts] *****************************************************************************************************************ok: [172.16.60.213]TASK [Install Rsync] *******************************************************************************************************************ok: [172.16.60.213]PLAY RECAP *****************************************************************************************************************************172.16.60.213              : ok=2    changed=0    unreachable=0    failed=0  上面两个检查命令, 第一个是进行playbook剧本配置信息语法检查; 第二个是模拟playbook剧本执行(彩排)

palybook剧本文件示例

ansible-playbook编写内容扩展剧本任务编写多个任务

- hosts: all  tasks:    - name: restart-network      cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'    - name: sync time      cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"

剧本编写内容扩展:剧本任务编写多个主机

- hosts: 172.16.60.7  tasks:    - name: restart-network      cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'    - name: sync time      cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"- hosts: 172.16.60.31  tasks:    - name: show ip addr to file      shell: echo $(hostname -i) >> /tmp/ip.txt

playbook剧本编写方式

-  多主机单任务编写方式
-  多主机多任务编写方式
-  不同主机多任务编写方式

Ansible-playbook案例分享

1) 机器环境角色                   外网ip                      内网ip                           部署软件m01                  eth0:10.0.0.61         eth1:172.16.1.61         ansiblebackup              eth0:10.0.0.41         eth1:172.16.1.41         rsyncnfs                    eth0:10.0.0.31          eth1:172.16.1.31         nfs、Sersyncweb01               eth0:10.0.0.7           eth1:172.16.1.7            httpd2) 目录规划[root@m01 ~]# mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p[root@m01 ~]# tree /etc/ansible/ansible_playbook//etc/ansible/ansible_playbook/├── conf└── file└── scripts3) rsync配置文件准备对应的配置文件存放至/etc/ansible/ansible_playbook/conf/[root@m01 conf]# cat /etc/ansible/ansible_playbook/conf/rsyncd.confuid = wwwgid = wwwport = 873fake super = yesuse chroot = nomax connections = 200timeout = 600ignore errorsread only = falselist = falseauth users = rsync_backupsecrets file = /etc/rsync.passwordlog file = /var/log/rsyncd.log#####################################[backup]path = /backup[data]path = /data4) nfs配置文件准备nfs配置文件exports[root@m01 ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/nfs_exports/data/ 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)5) Sersync软件包下载Sersync软件包[root@m01 ansible_playbook]# ll /etc/ansible/ansible_playbook/file/-rw-r--r-- 1 root root 727290 Aug  1 12:04 sersync.tar.gz6) sersync配置文件准备sersync实时同步的配置文件[root@m01 ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs7) 基础环境部署基础环境:所有机器统一的配置需要关闭firewalld以及selinux、epel仓库、ssh端口、优化基础配置需要安装rsync和nfs-utils准备www用户需要准备/etc/rsync.pass密码文件需要准备全网备份脚本基础的playbook剧本[root@m01 ansible_playbook]# cat base.yaml- hosts: all  tasks:    - name: Install Epel Repos      get_url: url=http://mirrors.aliyun.com/repo/epel-7.repo dest=/etc/yum.repos.d/epel.repo    - name: Install Rsync Nfs-Utils      yum: name=rsync,nfs-utils state=installed    - name: Create Group WWW      group: name=www gid=666    - name: Create User WWW      user: name=www uid=666 group=666 create_home=no shell=/sbin/nologin    - name: Create Rsync_Client_Pass      copy: content='1' dest=/etc/rsync.pass mode=600    - name: Create Scripts Directory      file: path=/server/scripts recurse=yes state=directory    - name: Push File Scripts      copy: src=./scripts/rsync_backup_md5.sh dest=/server/scripts/    - name: Crontable Scripts      cron: name="backup scripts" hour=01 minute=00 job="/bin/bash /server/scripts/rsync_backup_md5.sh &>/dev/null"8) 应用环境:Rsync安装rsync配置rsync(配置变更,一定要进行重载操作)创建虚拟用户,权限调整创建目录/data/  /backup启动rsync配置邮箱->邮箱的发件人->校验的脚本[root@m01 ansible_playbook]# cat rsync.yaml- hosts: backup  tasks:    - name: Installed Rsync Server      yum: name=rsync,mailx state=installed    - name: configure Rsync Server      copy: src=./conf/rsyncd.conf dest=/etc/rsyncd.conf      notify: Restart Rsync Server    - name: Create Virt User      copy: content='rsync_backup:1' dest=/etc/rsync.password mode=600    - name: Create Data      file: path=/data state=directory recurse=yes owner=www group=www mode=755    - name: Create Backup      file: path=/backup state=directory recurse=yes owner=www group=www mode=755    - name: Start RsyncServer      service: name=rsyncd state=started enabled=yes    - name: Push Check Scripts      copy: src=./scripts/rsync_check_backup.sh dest=/server/scripts/    - name: Crond Check Scripts      cron: name="check scripts" hour=05 minute=00 job="/bin/bash /server/scripts/rsync_check_backup.sh &>/dev/null"9)  应用环境:NFS安装nfs-utils配置nfs (当修改了配置,触发重载操作)创建目录,授权启动[root@m01 ansible_playbook]# cat nfs.yaml- hosts: nfs  tasks:    - name: Installed Nfs Server      yum: name=nfs-utils state=installed    - name: Configure Nfs Server      copy: src=./conf/exports dest=/etc/exports      notify: Restart Nfs Server    - name: Create Share Data      file: path=/data state=directory recurse=yes owner=www group=www mode=755    - name: Start Nfs Server      service: name=nfs-server state=started enabled=yes  handlers:    - name: Restart Nfs Server      service: name=nfs-server state=restarted10) 应用环境:Sersync下载sersync解压,改名,配置启动[root@m01 ansible_playbook]# cat sersync.yaml- hosts: nfs  tasks:    - name: Scp Sersync      copy: src=./file/sersync2.5.4_64bit_binary_stable_final.tar.gz dest=/usr/local/sersync.tar.gz    - name: Zip      shell: cd /usr/local && tar xf sersync.tar.gz && mv GNU-Linux-x86 sersync      args:        creates: /usr/local/sersync    - name: configure Sersync      copy: src=./conf/confxml.xml dest=/usr/local/sersync/    - name: Start Sersync      shell: /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml11) 应用环境:WEB挂载nfs共享的目录[root@m01 ansible_playbook]# cat web.yaml- hosts: web  tasks:    - name: Mount NFS Server Share Data      mount: src=172.16.1.31:/data path=/data fstype=nfs opts=defaults state=mounted12) 包含include[root@m01 ansible_playbook]# cat mail.yaml- import_playbook: base.yaml- import_playbook: rsync.yaml- import_playbook: nfs.yaml- import_playbook: sersync.yaml- import_playbook: web.yaml13) 操作后测试步骤快照还原推送公钥使用ping模块测试执行ansible-playbook测试测试全网备份,测试是否能发邮件,并校验结果测试nfs的挂载测试实时同步

转载于:https://www.cnblogs.com/kevingrace/p/5569648.html

你可能感兴趣的文章
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Maven之setting.xml配置文件详解
查看>>
SDK目录结构
查看>>
malloc() & free()
查看>>
HDU 2063 过山车
查看>>
高精度1--加法
查看>>
String比较
查看>>
Django之Models
查看>>
CSS 透明度级别 及 背景透明
查看>>
Linux 的 date 日期的使用
查看>>
PHP zip压缩文件及解压
查看>>
SOAP web service用AFNetWorking实现请求
查看>>