这一篇ansible-playbook(二) 是紧跟上一篇ansible-playbook 的使用 来进行扩展,这一篇相对上一篇增加了 template (模板),backup(备份),register,failed_when 等情况的扩展。这一篇也是要基于上一篇关于 ansible-playbook 变量,Roles 的基础上来看。
先大致介绍template 和backup 功能:
template : 我们在针对一个比如像配置文件进行拷贝的时候,这个配置文件基本框架都是不变的。比如一个web 应用yml 针对 dev,stg,prd 环境需要规定端口是什么,数据库是什么等等。但针对dev 、stg、prd 的数据库url ,用户名,密码又是不一样的。所以针对同一个配置文件,面对不同环境又不能简单拷贝。这个时候我们就可以设置一个模板,但涉及到具体 url ,用户名,密码 用变量替代。针对不同环境使用不同值,这个时候过去文件就会将具体涉及到用户名,密码 变量的地方就会被真正值所替代了。
backup: 备份,顾名思义就是拷贝文件的时候如果原来的地方就有一个文件,这个时候就将原来的文件从命名一个备份文件。但如果原来文件和新拷贝文件一致则不会备份。
主要实现逻辑针对两次使用不同命令,将dev和stg 进行拷贝
# 拷贝生效dev的值
ansible-playbook owner.yml -v -i /inventory/dev/hosts.ini
# 拷贝生效stg的值
ansible-playbook owner.yml -v -i /inventory/stg/hosts.ini
cat owner
---
- hosts: owner
gather_subset: min
roles:
- owner
cat roles/owner/tasks/main.yml
---
- name: "common vars"
include_vars:
dir: "{{ inventory_dir }}/vars"
- name: "copy shell file"
copy:
src: .
dest: /usr/src/shell
backup: yes
- name: config
template:
src: "base.config.j2"
dest: "/usr/src/shell/base.config"
backup: yes
- name: "exec shell"
shell:
chdir: /usr/src/shell
cmd: >
sh test_shell.sh
cat roles/owner/tasks/template/base.config.j2
log.config={{ logging.config }}
test.param={{ test.param }}
那么不同变量,dev 和 stg 的变量
cat /inventory/dev/vars/common.yml
logging:
config: classpath:log4j2-dev.xml
test:
param: dev
cat /inventory/stg/vars/common.yml
logging:
config: classpath:log4j2-stg.xml
test:
param: stg
结果如下:
可以看到执行命令之后当指定dev 拷贝出来的值为dev,当指定stg 的时候stg
先大致介绍register 和failed_when功能:
**register ** : register 是将执行shell 命令的返回值获取出来
failed_when: 当后面为true 会,ansible-playbook 会认为该任务执行失败。
ansible-playbook test_register.yml
cat test_register.yml 查看test_register.yml 如下
---
- hosts: owner
remote_user: root
tasks:
- name: "exec shell"
shell: "df -hP | grep -v docker | awk 'NR>1 && int($5) >10'"
register: result
failed_when: result.stdout
直接运行 df -hP | grep -v docker | awk ‘NR>1 && int($5) >10’ 命令如下
那么上面表示将获取 df -hP | grep -v docker | awk ‘NR>1 && int($5) >10’ 的返回值,因为有返回值,那么相当于true ,ansible-playbook 认为执行失败。将其改为df -hP | grep -v docker | awk ‘NR>1 && int($5) >20’ 由于最大为14%,不到20 就会成功。
//还有经常用到判断语句
“‘FAILED’ in result.stderr”
result.stdout.find(’/dev’)== -1
如果只想查看一下执行内容:
---
- hosts: owner
remote_user: root
tasks:
- name: "exec shell"
shell: "df -hP | grep -v docker | awk 'NR>1 && int($5) >10'"
register: result
- debug:
msg: -{{ result }}