逆时针 2019-12-05
之前详细介绍了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基本语法
列表:每一个列表成员前面都要有一个短横线和一个空格
1 2 3 4 5 6 7 8 | fruits: - Apple - Orange - Strawberry - Mango 或者: fruits: [ ‘Apple‘ , ‘Orange‘ , ‘Strawberry‘ , ‘Mango‘ ] |
字典:每一个成员由键值对组成,注意冒号后面要有空格
1 2 3 4 5 6 | martin: name: Martin D‘vloper job: Developer skill: Elite 或者 martin: {name: Martin D‘vloper, job: Developer, skill: Elite} |
列表和字典可以混合使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | - 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文件中
1 2 3 4 5 6 7 8 9 10 11 12 | 主机变量: 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中
1 2 3 | - hosts: webservers vars: http_port: 80 |
使用facts变量
1 2 3 4 | facts变量是由setup模块获取远程主机的信息。 用法: # ansible 192.168.200.136 -m setup |
在roles中定义变量, 这个后面会介绍到.
ansible-playbook 命令中传入参数
1 2 | 使用 -e选项传入参数 # ansible-playbook 192.168.200.136 -e "httpd_port=808" httpd04.yml |
变量的引用
1 | {{ var_name }} |
2. templates
它是一个模块功能,与copy不同的是他的文本文件采用了jinga2语法,jinga2基本语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 | 字面量: 字符串:使用单引号或双引号 数字:整型,浮点数 列表:{item1,item2,...} 字典:{key1:value1,key2:value2,...} 布尔型: true /false 算术运算: +,-,*,/, // ,%,** 比较运算: ==,!=,>,>=,<,<= 逻辑运算: and,or,not |
注意:template只能在palybook中使用。
3. tasks
执行的模块命令
1 2 3 4 5 6 7 8 9 10 11 12 13 | 格式: 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 <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书写格式
1 2 3 4 | - hosts: 172.16.60.211 #处理指定服务器. - (空格)hosts:(空格)172.16.20.211 task: #剧本所要干的事情; (空格)(空格)task: - name: #(两个空格)-(空格)name: command : echo hello clsn linux #(四个空格)command:(空格) |
palybook格式示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [ ~] # vim /etc/ansible/test.yaml - hosts: 172.16.60.213 tasks: - name: Install Rsync yum: name= rsync state=installed playbook检查方法 [ ~] # ansible-playbook --syntax-check /etc/ansible/test.yaml playbook: /etc/ansible/test .yaml [ ~] # 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编写内容扩展:剧本任务编写多个任务
1 2 3 4 5 6 | - 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" |
剧本编写内容扩展:剧本任务编写多个主机
1 2 3 4 5 6 7 8 9 10 11 | - 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | 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) 目录规划 [ ~] # mkdir /etc/ansible/ansible_playbook/{file,conf,scripts} -p [ ~] # tree /etc/ansible/ansible_playbook/ /etc/ansible/ansible_playbook/ ├── conf └── file └── scripts 3) rsync 配置文件 准备对应的配置文件存放至 /etc/ansible/ansible_playbook/conf/ [ 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 [ 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软件包 [ 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实时同步的配置文件 [ ansible_playbook] # cat /etc/ansible/ansible_playbook/conf/confxml.xml.nfs 7) 基础环境部署 基础环境:所有机器统一的配置 需要关闭firewalld以及selinux、epel仓库、 ssh 端口、优化基础配置 需要安装 rsync 和nfs-utils 准备www用户 需要准备 /etc/rsync .pass密码文件 需要准备全网备份脚本 基础的playbook剧本 [ 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 配置邮箱->邮箱的发件人->校验的脚本 [ 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 (当修改了配置,触发重载操作) 创建目录,授权 启动 [ 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 解压,改名,配置 启动 [ 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共享的目录 [ 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 [ 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的挂载 测试实时同步 |