运维自动化之Ansible
本章内容
- 运维自动化发展历程及技术应用
- Ansible命令使用
- Ansible常用模块详解
- YAML语法简介
- Ansible playbook基础
- Playbook变量、tags、handlers使用
- Playbook模板templates
- Playbook条件判断 when
- Playbook字典 with_items
- Ansible Roles
企业实际应用场景分析
1 | Dev开发环境 |
自动化运维应用场景
1 | 文件传输 |
常用自动化运维工具
1 | Ansible:python,Agentless,中小型应用环境 |
特性
1 | 1> 模块化:调用特定的模块,完成特定任务 |
推公钥
系统 环境为centos,执行脚本前请在当前目录创建ip.txt文件,把需要推送的服务器的ip及密码填写好。
1.在脚本当前目录,编辑ip.txt文本,填写相应信息
#请填写需要推送的服务器ip和i密码
#格式:ip 空格(不分空格次数,只要是空格就可以) 密码
#例:192.168.23.111 passwd
#例:192.168.23.112 passwd
2.执行脚本推送公钥 curl -o ssh.sh http://xz.itcytblog.cn/ssh.sh&& bash ssh.sh
1 |
|
安装
1 | rpm包安装: EPEL源 |
相关文件
1 | 配置文件 |
主机清单inventory
1 | Inventory 主机清单 |
ansible 配置文件
1 | Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认) |
ansible系列命令
1 | Ansible系列命令 |
ansible
1 | ansible通过ssh实现配置管理、应用部署、任务执行等功能, |
1 | ansible all --list 列出所有主机 |
ansible的Host-pattern
1 | ansible的Host-pattern |
ansible命令执行过程
1 | ansible命令执行过程 |
ansible使用示例
1 | 示例 |
ansible常用模块
1 | 模块文档:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html |
ansible系列命令
1 | 可以通过网上写好的 |
playbook
使用源码安装的注意:
需要复制配置文件到/etc/ansible/ansible.cfg ,如果不操作这个步,执行playbook时由于无法读取配置文件,会报错无法连接到hosts
1 | > playbook是由一个或多个"play"组成的列表 |
playbook图解
1 | 用户通过ansible命令直接调用yml语言写好的playbook,playbook由多条play组成 |
YAML介绍
1 | YAML是一个可读性高的用来表达资料序列的格式。 |
YAML语法简介
1 | > 在单一档案中,可用连续三个连字号(——)区分多个档案。 |
YAML语法简介
1 | List:列表,其所有元素均使用“-”打头 |
YAML语法
1 | YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。 |
三种常见的数据交换格式
Playbook核心元素
1 | Hosts 执行的远程主机列表(应用在哪些主机上) |
playbook基础组件
1 | Hosts: |
1 | tasks:任务列表 |
1 | 如果命令或脚本的退出码不为零,可以使用如下方式替代 |
运行playbook
1 | 运行playbook的方式 |
Playbook VS ShellScripts
安装httpd
1 | SHELL脚本 |
1 | Playbook定义 |
示例:Playbook 创建用户
1 | 示例:sysuser.yml |
Playbook示例 安装httpd服务
1 | 示例:httpd.yml |
Playbook示例 安装nginx服务
1 | 示例 nginx.yml |
handlers和notify结合使用触发条件
1 | Handlers 实际上就是一个触发器 |
Playbook中handlers使用
1 | - hosts: websrvs |
示例
1 | - hosts: webnodes |
示例
1 | - hosts: websrvs |
Playbook中tags使用
1 | tage: 添加标签 |
示例
1 | //heartbeat.yaml |
Playbook中tags使用
1 | - hosts: testsrv |
Playbook中变量的使用
1 | 变量名:仅能由字母、数字和下划线组成,且只能以字母开头 |
1 | 在主机清单中定义变量,在ansible中使用变量 |
1 | 将变量写进单独的配置文件中引用 |
Ansible基础元素
1 | Facts:是由正在通信的远程目标主机发回的信息,这些信息被保存在ansible变量中。 |
示例:使用setup变量
1 | 示例:var.yml |
示例:变量
1 | 示例:var.yml |
示例:变量
1 | 示例:var.yml |
变量
1 | 主机变量 |
示例:变量
1 | 普通变量 |
使用变量文件
1 | cat vars.yml |
变量
1 | 组嵌套 |
invertory参数
1 | invertory参数:用于定义ansible远程连接目标主机时使用的参数,而非传递给playbook的变量 |
invertory参数
1 | inventory参数 |
模板templates
1 | 文本文件,嵌套有脚本(使用模板编程语言编写) 借助模板生成真正的文件 |
Jinja2相关
1 | 字面量 |
Jinja2:算术运算
1 | 算术运算 |
Jinja2
1 | 比较操作符 |
template 的使用
1 | template功能:根据模块文件动态生成对应的配置文件 |
template示例
1 | 示例:利用template 同步nginx配置文件 |
Playbook中template变更替换
1 | 修改文件nginx.conf.j2 下面行为 |
Playbook中template算术运算
1 | 算法运算: |
when 实现条件判断
1 | 条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试, |
示例:when条件判断
1 | - hosts: websrvs |
示例:when条件判断
1 | 示例: |
Playbook中when条件判断
1 | --- |
迭代:with_items
1 | 迭代:当有需要重复性执行的任务时,可以使用迭代机制 |
示例
1 | 示例: 创建用户 |
示例:迭代
1 | 示例:将多个文件进行copy到被控端 |
示例:迭代
1 | - hosts: websrvs |
示例:迭代
1 | - hosts:websrvs |
示例:迭代嵌套子变量
1 | - hosts:websrvs |
with_itmes 嵌套子变量
1 | with_itmes 嵌套子变量 |
Playbook字典 with_items
1 | - name: 使用ufw模块来管理哪些端口需要开启 |
Playbook中template for if when循环
1 | {% for vhost in nginx_vhosts %} |
示例
1 | // temnginx.yml |
示例
1 | // temnginx.yml |
roles
1 | roles |
Roles
1 | 角色(roles):角色集合 |
Ansible Roles目录编排
roles目录结构
1 | 每个角色,以特定的层级目录结构进行组织 |
Roles各目录作用
1 | /roles/project/ :项目名称,有以下子目录 |
创建role
1 | 创建role的步骤 |
实验: 创建httpd角色
1 | 1> 创建roles目录 |
针对大型项目使用Roles进行编排
1 | roles目录结构: |
示例
1 | roles的示例如下所示: |
实验: 创建一个nginx角色
1 | 建立nginx角色在多台主机上来部署nginx需要安装 创建账号 |
Roles案例
Roles目录编排
Playbook中调用
playbook调用角色
1 | 调用角色方法1: |
通过roles传递变量
1 | 通过roles传递变量 |
向roles传递参数
1 | 而在playbook中,可以这样使用roles: |
条件式地使用roles
1 | 甚至也可以条件式地使用roles |
Roles条件及变量等案例
1 | When条件 |
完整的roles架构
1 | // nginx-role.yml 顶层任务调用yml文件 |
roles playbook tags使用
1 | roles playbook tags使用 |
实验: 创建角色memcached
1 | memcacched 当做缓存用,会在内存中开启一块空间充当缓存 |
其它功能
1 | 委任(指定某一台机器做某一个task) |
Ansible Roles
1 | 委任 |
推荐资料
1 | http://galaxy.ansible.com |
实验: 实现二进制安装mysql的卸载
1 | cat remove_mysql.yml |