ansible playbook

文章目录

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
上一篇:移动平台WEB前端开发技巧汇总


下一篇:ansible使用知识概要和脑图