之前详细介绍了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=808 192.168.200.137 http_port=8080 maxRequestsPerChild=909 主机组变量: [websers] 192.168.200.136 192.168.200.137 [websers:vars] ntp_server=ntp.exampl.com proxy=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 :80 1)某任务的运行状态为changed后,可通过相应的notify通知相应的handlers 2)任务可以通过tags打标签,然后通过palybook命令-t选项调用.
playbook调用方式
用法:
ansible-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=installed playbook检查方法 [root@ansible-server ~]# ansible-playbook --syntax-check /etc/ansible/test.yaml playbook: /etc/ansible/test.yaml [root@ansible-server ~]# ansible-playbook -C /etc/ansible/test.yaml PLAY [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 ansible backup eth0:10.0.0.41 eth1:172.16.1.41 rsync nfs eth0:10.0.0.31 eth1:172.16.1.31 nfs、Sersync web01 eth0:10.0.0.7 eth1:172.16.1.7 httpd 2) 目录规划 [root@m01 ~]# mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p [root@m01 ~]# tree /etc/ansible/ansible_playbook/ /etc/ansible/ansible_playbook/ ├── conf └── file └── scripts 3) rsync配置文件 准备对应的配置文件存放至/etc/ansible/ansible_playbook/conf/ [root@m01 conf]# cat /etc/ansible/ansible_playbook/conf/rsyncd.conf uid = www gid = www port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.password log file = /var/log/rsyncd.log ##################################### [backup] path = /backup [data] path = /data 4) 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.gz 6) sersync配置文件 准备sersync实时同步的配置文件 [root@m01 ansible_playbook]# cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs 7) 基础环境部署 基础环境:所有机器统一的配置 需要关闭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=restarted 10) 应用环境: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.xml 11) 应用环境: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=mounted 12) 包含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.yaml 13) 操作后测试步骤 快照还原 推送公钥 使用ping模块测试 执行ansible-playbook测试 测试全网备份,测试是否能发邮件,并校验结果 测试nfs的挂载 测试实时同步