文章目录
- Yaml是什么
- 官网
- 实例
- 特点
- 数据结构
- playbook yaml 示例
- 简介
- 核心元素
- host
- remote_user
- tasks
- 实践
- 强制成功
- 忽略错误
- 添加标签
- 查看 标签
- 指定标签执行任务
- 关键语法
- 示例
Yaml是什么
描述性语言,类似 json
官网
www.yaml.org
实例
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
namespace: uat
name: game-test
labels:
app: game-test
特点
- 大小写敏感
- 缩进表示层级关系
- 缩进只能空格,不能tab
- 同级必须对齐
- ‘#’ 号表示注释
- 文件内容分隔符 —
数据结构
- 对象
- 列表
playbook yaml 示例
vim test1.yaml
---
- host: web
remote_user: root
tasks:
- name: install mysql
yum: name=mysql state=prsent
- name: start mysql
service: name=mysql state=started enabled=yes
# 执行 playbook
ansible-playbook -C test1.yaml # 检查文件,试运行
ansible-playbook test1.yaml # 运行 playbook
简介
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
- 任务组合
- ansible 命令演变而来
核心元素
- Tasks:任务,由模板定义的操作列表
- Variables:变量
- Templates:模板,即使用模板语法的文件
- Handlers:处理器 ,当某条件满足时,触发执行的操作
- Roles:角色
host
# 跟命令行中 hosts 使用方式一致
hosts: <host>
hosts: web
hosts: web:mysql
hosts: web:&mysql
hosts: web:!mysql
remote_user
# 远程登录的用户
# 如果 不是 root
# 可以用
remote_user: putong # -u
sudo: yes # -b 转换用户 sudo_user
sudo_user: root
# 切换到指定用户
tasks
# 对应 命令行中 模块及模块参数部分
tasks:
- name: install mysql # 任务名
yum: name=mysql state=present # 任务内容
action: yum name=mysql state=present # 任务内容的另一种写法
# playbook 中 模块的 坑:
shell: ls
shell: pwd
# 只执行最后一条,所以只能写 一条 模块任务
实践
test.yaml
---
- hosts: mysql
remote_user: root
tasks:
- name: create user
user: name=nginx-test system=yes uid=82 shell=/sbin/nologin
- name: create web root
file: name=/data/webserver/html state=directory
- name: touch web index
shell: echo '<h1>帅</h1>' > /data/webserver/html/index.html
- name: install nginx
yum: name=nginx state=present
- name: copy config
copy: src=/data/ansible/playbook/nginx.conf dest=/etc/nginx/nginx.conf
- name: start nginx service
service: name=nginx state=started enabled=yes
# 校验语法
ansible-playbook --syntax-check test.yaml
# 试运行
ansible-playbook -C test.yaml
# 运行
ansible-playbook test.yaml
ansible-playbook 发生异常时任务会中断
强制成功
---
- hosts: web
remote_user: root
tasks:
- name: create new user
user: name=web_user system=yes uid=82 shell=/sbin/nologin
- name: check user
# 这一行是错的 getend getent
shell: getend passwd | grep web_user
- name: create web root
file: name=/data/webserver/html/ state=directory
上面的 yaml 执行失败, check user 失败后 create web root 不会继续执行
为了解决中断的问题,可以做如下更改
# 用
shell: getend passwd | grep web_user || /bin/true
# 替换 shell: getend passwd | grep web_user
忽略错误
- hosts: web
remote_user: root
tasks:
- name: create new user
user: name=web_user system=yes uid=82 shell=/sbin/nologin
- name: check user
# 这一行是错的 getend getent
shell: getend passwd | grep web_user
ignore_errors: true
- name: create web root
file: name=/data/webserver/html/ state=directory
添加标签
> 场景:多个 任务 中 只想执行 其中的 一个 或 部分,用 tag 标识 出来
# 主机添加标签
---
- hosts: web
tags: hosts-tag
# 任务添加标签
- hosts: web
remote_user: root
tasks:
- name: create user
user: name=new_user system=yes uid=88 shell=/sbin/nologin
tags: task-tag
查看 标签
ansible-playbook test.yaml --list-tags
指定标签执行任务
ansible-playbook -t <tag name> test.yaml
注意:ansible 操作是幂等的,如果幂等了,不触发依赖任务
关键语法
- handlers
- notify
示例
---
- hosts: web
remote_user: root
tasks:
- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
# 通知 重启 处理
notify: restart nginx
handlers:
# 重启
- name: restart nginx
service: name=nginx status=restarted
---
# 触发多个任务
- hosts: web
remote_user: root
tasks:
- name: copy config
copy: src=nginx.conf dest=/etc/nginx/nginx.conf
# 通知 重启 处理
notify:
- restart nginx
- check nginx
handlers:
# 重启
- name: restart nginx
service: name=nginx status=restarted
- name: check nginx
shell: netstat -tnulp | grep nginx > /tmp/nginx.txt