Ansible教程:Playbook基本使用

YAML语法要点

详见 链接

  • --- 文件开头
  • 只能空格缩进,禁止Tab
  • #注释
  • -代表列表项
  • {{ var }} Jinja2变量模板。

Play 顶层常用参数

---
- name: 部署Nginx的play         # play名称,可选
  hosts: webservers             # 必填,目标主机/主机组,来自inventory清单
  gather_facts: true            # 默认true,执行前收集被控主机系统信息(ansible_facts);关闭提速 false
  remote_user: root             # 远程登录用户
  become: true                  # 开启sudo提权(相当于sudo)
  become_user: root             # 提权到哪个用户
  vars:                         # 本play内变量
    nginx_port: 80
  vars_files:                   # 外部变量文件
    - vars/nginx.yml
  handlers:                     # 触发器,只有被notify触发才执行
  tasks:                        # 任务列表,核心

Tasks 任务核心语法

每个 task 调用一个模块,推荐写 name(日志输出可读性强)。

tasks:
  - name: 安装nginx
    yum:
      name: nginx
      state: present # present安装,absent卸载,latest最新版

常用内置模块

  1. yum / apt:包管理器
  2. copy:本地文件复制到远端
  3. template:Jinja2模板渲染后下发(支持变量)
  4. service:管理系统服务(start/stop/restart/enabled)
  5. file:创建目录、修改权限、删除文件
  6. debug:打印调试信息
  7. shell:执行shell命令(非幂等,慎用)
  8. command:执行命令,不支持管道、重定向,比shell安全

例子:nginx部署(使用centos)

编辑playbook文件,执行下面命令:

vim playbook_nginx.yml

内容:

---
- name: 批量部署Nginx      # 剧本名,可略
  hosts: all              # 目标主机/主机组,来自inventory清单
  become: true            # 开启sudo提权

  tasks:
    - name: 安装nginx     # 任务名
      yum:                # 使用yum模块,适用于centos系统上执行安装
        name: nginx        # 安装nginx
        state: present     # 表示安装操作
    - name: 启动nginx,并设置开机自启
      service:            # 调用serivce模块
        name: nginx        # 设置nginx服务
        state: started     # 启动服务
        enabled: yes       # 开机自启

例子:nginx部署(使用ubuntu)

编辑playbook文件,执行下面命令:

vim playbook_nginx.yml

内容:

---
- name: 批量部署Nginx      # 剧本名,可略
  hosts: all              # 目标主机/主机组,来自inventory清单
  become: true            # 开启sudo提权

  tasks:
    - name: 安装nginx     # 任务名
      apt:                # 使用apt模块,适用于ubuntu系统上执行安装
        name: nginx        # 安装nginx
        state: present     # 表示安装操作
    - name: 启动nginx,并设置开机自启
      service:            # 调用serivce模块
        name: nginx        # 设置nginx服务
        state: started     # 启动服务
        enabled: yes       # 开机自启

执行命令

语法检查

检查 playbook 的语法,不会执行操作

ansible-playbook playbook_nginx.yml --syntax-check -i ansible_client.ini

跑测试,模拟执行,不改动真实机器(推荐)

ansible-playbook playbook_nginx.yml --check -i ansible_client.ini

或者

ansible-playbook playbook_nginx.yml -C -i ansible_client.ini

执行剧本

ansible-playbook playbook_nginx.yml

指定主机清单文件

ansible-playbook playbook_nginx.yml -i ansible_client.ini

只针对部分主机执行

ansible-playbook playbook_nginx.yml -i ansible_client.ini -l 192.168.1.100

返回结果说明

  • ok:任务已满足状态,无变更
  • changed:Ansible对主机做了修改
  • failed:任务执行失败,该主机停止后续任务
  • skipped:when条件不满足,跳过任务

注意

  1. 优先使用原生模块,尽量少用shell/command,破坏幂等性;
  2. YAML缩进严格,空格数量必须对齐,不要Tab;
  3. 生产执行前,一定先 --check 干跑;
  4. 复杂项目拆分为Role,不要写超大单文件playbook;
  5. 尽量开启gather_facts做系统判断,不需要再关闭提速;
  6. 敏感密码不要明文写yaml,使用ansible-vault加密文件。