linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
  • Ansible

    • Ansible: 基本操作
    • Ansible: 安装
    • Ansible: 简介
    • YAML: 文件格式
    • Playbook

      • Playbook: 介绍
      • Playbook: 操作
    • 模块

      • Yum模块常用参数
    • 实战

      • Ansible 实战
  • Anaconda

    • Anaconda命令
  • Iptables

    • Iptable: 防火墙
    • iptables 用法
  • Systemd

    • 系统服务配置
    • 系统服务启动文件
    • 性能优化

      • Linux 系统监控
      • Linux 系统性能优化
      • Linux 系统故障诊断
      • Linux 系统日志管理
  • Network

    • 用一张图解释 8 种流行的网络协议
    • 反子网掩码
    • 交换机端口模式
    • eNSP 软件
    • 华为交换机配置命令
    • eNSP静态路由实验
  • Commands

    • 命令别名:alias
    • 多类型资源统计工具: dstat
    • history配置
    • unzip命令
    • Linux用户到期登录时间和随机密码
    • 常用 Command
    • ssh

      • ssh-keygen
      • linux ssh命令
  • CI/CD

    • Jenkins CI/CD 管道
  • Kubernetes

    • Docker系列学习

      • 01. 什么是Docker
      • 02. Docker安装
      • 03. 使用Docker镜像
      • 04. 利用commit理解镜像构成
      • 05. 操作Docker容器
      • 06. 使用Dockerfile定制镜像
      • 07. Dockerfile指令详解
      • 08. Dockerfile多阶段创建
      • 09. 访问仓库
      • 10. 修改docker的启动项
      • 11. Nexus3.x的私有仓库
      • 12. docker-hub加速器
      • 13. 数据管理
      • 14. 使用网络
  • Shell编程

    • Shell 编程基础
    • Shell 脚本执行消耗的时间
    • Shell 自动生成简介

Playbook: 介绍

  • 简介
    • 与 ad-hoc 的区别
  • 核心元素
  • 基本语法
    • YAML 规则
  • 使用示例
    • 1. 基本示例
  • Playbook的运行方式
    • 基本用法
    • 常用选项
    • 执行示例
  • Playbook中元素属性
    • 1. 主机与用户(Hosts & Users)
    • 2. 任务列表(Tasks)
    • 3. 处理器(Handlers)
  • Playbook中变量的使用
    • 1. 变量定义方式
    • 2. 变量使用规则
    • 3. 特殊变量
    • 4. 变量作用域
  • 最佳实践

简介

Playbook 是 Ansible 的配置、部署和编排语言。它可以描述您希望远程系统执行的策略,或者是一组步骤的一般性流程。

与 ad-hoc 的区别

  • Playbook 可持久化使用
  • 支持更复杂的部署流程
  • 可重用和共享

核心元素

  1. Hosts:目标主机列表
  2. Tasks:任务列表
  3. Variables:变量定义
  4. Templates:模板文件
  5. Handlers:事件触发器
  6. Tags:标签选择器

基本语法

YAML 规则

  • 使用 .yml 或 .yaml 扩展名
  • 使用 --- 开始文档
  • 使用空格进行缩进
  • 区分大小写
  • 使用 # 注释

使用示例

1. 基本示例

cat > playbook01.yml << EOF
---                       #固定格式
- hosts: 192.168.1.31     #定义需要执行主机
  remote_user: root       #远程用户
  vars:                   #定义变量
    http_port: 8088       #变量

  tasks:                             #定义一个任务的开始
    - name: create new file          #定义任务的名称
      file: name=/tmp/playtest.txt state=touch   #调用模块,具体要做的事情
    - name: create new user
      user: name=test02 system=yes shell=/sbin/nologin
    - name: install package
      yum: name=httpd
    - name: config httpd
      template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:                 #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
        - restart apache      #notify要执行的动作,这里必须与handlers中的name定义内容一致
    - name: copy index.html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
    - name: start httpd
      service: name=httpd state=started
  handlers:                                    #处理器:更加tasks中notify定义的action触发执行相应的处理动作
    - name: restart apache                     #要与notify定义的内容相同
      service: name=httpd state=restarted      #触发要执行的动作
EOF
  • 测试页面准备

    echo "<h1>playbook test file</h1>" >>/var/www/html/index.html
    
  • 配置文件准备

    cat httpd.conf |grep ^Listen
        Listen {{ http_port }}
    
  • 执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok

    ansible-playbook playbook01.yml
    
  • 验证上面playbook执行的结果

    ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02'
    # 192.168.1.31 | CHANGED | rc=0 >> /tmp/playtest.txt uid=990(test02) gid=985(test02) 组=985(test02)
    
    curl 192.168.1.31:8088
    # <h1>playbook test file</h1>
    

Playbook的运行方式

基本用法

使用 ansible-playbook 命令运行 playbook 文件:

# 基本格式
ansible-playbook playbook.yml [options]

# 检查语法
ansible-playbook playbook.yml --syntax-check

# 测试运行(不实际执行)
ansible-playbook playbook.yml --check

# 列出受影响的主机
ansible-playbook playbook.yml --list-hosts

# 列出所有可用的 tags
ansible-playbook playbook.yml --list-tags

# 列出所有任务
ansible-playbook playbook.yml --list-tasks

# 限制运行的主机
ansible-playbook playbook.yml --limit web1

# 设置并发数(默认5)
ansible-playbook playbook.yml -f 10

# 运行带有 deploy 标签的任务
ansible-playbook playbook.yml -t deploy

# 显示详细输出
ansible-playbook playbook.yml -vvv

常用选项

选项说明示例
--check, -C测试模式,不实际执行ansible-playbook play.yml -C
--list-hosts显示将要运行的主机列表ansible-playbook play.yml --list-hosts
--list-tags列出所有可用的 tagsansible-playbook play.yml --list-tags
--list-tasks列出所有任务ansible-playbook play.yml --list-tasks
--limit限制运行的主机ansible-playbook play.yml --limit web1
-f N设置并发数(默认5)ansible-playbook play.yml -f 10
-t TAGS只运行指定 tag 的任务ansible-playbook play.yml -t deploy
-v[vv]显示详细输出ansible-playbook play.yml -vvv

执行示例

# 测试运行 playbook
ansible-playbook site.yml --check

# 只在 web 组运行
ansible-playbook site.yml --limit web

# 运行带有 deploy 标签的任务
ansible-playbook site.yml -t deploy

# 显示详细输出
ansible-playbook site.yml -vvv

Playbook中元素属性

1. 主机与用户(Hosts & Users)

定义要操作的目标主机和执行用户:

# 基本格式
---
- hosts: 192.168.1.31
  remote_user: root

# 指定多个主机/组
- hosts: webservers:dbservers
  remote_user: deploy

任务级别用户

tasks: 
  - name: run df -h
    remote_user: test
    shell: name=df -h

  # 使用 sudo
  - name: install package
    sudo: yes
    sudo_user: admin
    yum: name=httpd state=present

2. 任务列表(Tasks)

每个任务都应该:

  • 有描述性的名称
  • 指定要使用的模块
  • 提供必要的参数
tasks:
  - name: create new file
    file: path=/tmp/test01.txt state=touch
  - name: create new user
    user: name=test001 state=present

3. 处理器(Handlers)

Handlers 用于响应变更通知:

  • httpd.yml
tasks:
  - name: 配置 Apache
    template: 
      src: httpd.conf.j2
      dest: /etc/httpd/conf/httpd.conf
    notify: restart apache    # 通知处理器

handlers:
  - name: restart apache     # 处理器名称
    service:
      name: httpd
      state: restarted

注意:

  • handlers 只在被通知时执行
  • 多次通知只执行一次
  • 按照定义顺序执行

Playbook中变量的使用

1. 变量定义方式

命令行变量

# 单个变量
ansible-playbook test.yml -e "version=1.0.0"

# 多个变量
ansible-playbook test.yml -e "hosts=web user=test"

# 使用变量文件
ansible-playbook test.yml -e "@vars.yml"

Playbook 变量

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
    app_version: "1.0.0"
   
  tasks:
    - name: 配置 Apache
      template:
        src: httpd.conf.j2
        dest: /etc/httpd/conf/httpd.conf

变量文件

# vars/main.yml
---
db_name: myapp
db_user: admin
db_password: secret

# playbook.yml
---
- hosts: dbservers
  vars_files:
    - vars/main.yml
  tasks:
    - name: 创建数据库
      mysql_db:
        name: "{{ db_name }}"
        state: present

2. 变量使用规则

  • 变量名只能包含字母、数字和下划线
  • 变量名必须以字母开头
  • 在模板中使用变量需要加双花括号 {{ var_name }}
  • 命令行变量优先级最高

3. 特殊变量

# 内置变量
ansible_hostname: 主机名
ansible_distribution: 操作系统
ansible_os_family: 系统家族
ansible_architecture: 系统架构

# 注册变量
tasks:
  - name: 检查服务状态
    command: systemctl status httpd
    register: service_status
   
  - name: 显示状态
    debug:
      var: service_status.stdout

4. 变量作用域

  • 全局变量: 适用于所有主机
  • 主机变量: 只适用于特定主机
  • 组变量: 适用于特定组的所有主机
  • 任务变量: 只在特定任务中有效
# /etc/ansible/hosts

# 主机变量
[webservers]
web1 http_port=8080 ansible_ssh_user=deploy

# 组变量
[webservers:vars]
app_env=production
max_clients=200

最佳实践

  1. 变量管理

    • 使用有意义的变量名
    • 集中管理变量文件
    • 合理使用变量作用域
  2. 安全建议

    • 加密敏感变量
    • 避免明文密码
    • 使用 vault 加密文件

注意:

  • 注意变量优先级
  • 避免变量名冲突
  • 谨慎使用全局变量

参考资料:

  • Ansible 变量指南
  • 最佳实践
最近更新时间:
Next
Playbook: 操作