由于大部分互联网公司服务器环境复杂,线上线下环境、测试正式环境、分区环境、客户项目环境等造成每个应用都要重新部署,而且服务器数量少则几十台,多则千台,若手工一台台部署效率低下,且容易出错,不利后期运维,因此需要Ansible或者Saltstack来解决此问题。
  Ansible与Saltstack最大的区别是Ansible无需在被控主机部署任何客户端代理,默认直接通过SSH通道进行远程命令执行或下发配置,这里不作详细对比,直接使用Ansible。Ansible是DevOps项目基础工具之一,致力于自动化、工具化的全新维护模式,通过工具化自动化的作业,提高生产效率的同时减轻维护人员的重担。
  Ansible是一款基于Python开发的自动化运维工具,实现了批量系统配置、批量程序部署、批量运行命令等功能,主要特点:
  • 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,默认使用SSH协议对设备进行管理;
  • 配置简单、功能强大、扩展性强;
  • 支持API及自定义模块,可通过Python轻松扩展;
  • 通过Playbooks来定制强大的配置、状态管理;
  • 幂等性:一种操作重复多次结果相同

Ansible工作流程

 

  ansible.cfg主要配置指定host文件路径,指定roles_path参数,其它参数默认。

  部署Ansible的控制机需要python 2.7及以上,需要安装paramiko模块、PyYAML、Jinja2、httplib2等模块,若被管节点为windows,则需要有powershell3并制授权远程管理。

  控制节点交互一般采用公钥认证,这需要将主机节点的公钥发放到所有被管节点,也可采用密码形式通讯,但由于需要在hosts文件中明文标出不安全 不推荐,配置密码:

/etc/ansible/hosts
192.168.0.200 ansible_ssh_user=root ansible_ssh_pass=123@abc

  主机清单(host inventory)定义了管理主机的策略,需要在host文件中写入主机的IP地址即可,若操作的主机未在清单中会提示错误。

ansible命令执行过程

1、加载自己的配置文件,默认/etc/ansible/ansible.cfg
2、查找对应的主机配置文件,找到要执行的主机或者组。
3、加载自己对应的模块文件,如command
4、通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器
5、对应执行用户家目录的.ansible/tmp/XXX/XXX.PY文件
6、给文件+x执行
7、执行并返回结果
8、删除临时py文件,sleep 0 退出。
  Ansible完成任务的两种方式,一种是Ad-Hoc,就是ansible命令,另一种就是Ansible-playbook,也就是ansible-playbook命令。他们的区别就像是Command命令行和Shell Scripts。

ansible命令

获取192.168.0.123主机信息

ansible 192.168.0.123 -m shell -a "uname -a"
 

ansible常用模块

  • command、shell、raw、script执行shell命令
  • copy:复制文件到远程主机,可以改权限等
  • file设置文件目录属性等
  • fetch 从远程某主机获取文件到本地
  • service 服务程序管理,启动停止重启服务等操作
  • user管理用户账号
  • script在指定节点运行服务端的脚本

Playbooks中的一些技巧

playbook目录结构

  webservice.yml为入口,files目录存放静态文件,handlers存放一些task的handler,templates存放jinja2模板文件,vars存放变量文件。

  ansible-playbook执行logstash安装剧本

ansible-playbook /logstash/site.yml

  这里不详细介绍playbook的使用,只摘出几个重要的使用场景方法。

delegate_to

  将某一个任务委托给指定主机,如在192.168.0.9服务器上检测k8s集群状态:
- name: get status
  command: get k8s status
  delegate_to: "192.168.0.9"
  若委派给本机的时候,还可以使用更快捷的方法local_action
- name: get status
  local_action : command 'get k8s status'

run_once

  run_once: true来指定该task只能在某一台机器上执行一次. 可以和delegate_to 结合使用,指定在"192.168.0.9"上执行一次升级数据库操作

- command: /opt/upgrade_db.py
run_once: true
delegate_to: "192.168.0.9"

  如果没有delegate_to, 那么这个task会在第一台机器上执行

ignore_errors

  指定 ignore_errors:true,任务失败继续完成剩余的任务。例如,当删除最初并不存在的日志文件时抛错 但忽略错误继续执行剩余的任务。
- name: 'Delete logs'
shell: rm -f /var/log/nginx/errors.log
ignore_errors: true

register 注册变量

  使用 debug 模块与 register 变量,输出网络信息

- hosts: proxyservers
tasks:
- name: "get host port info"
shell: netstat -lntp
register: host_port

- name: "print host port"
debug:
#msg: "{{ host_port }}" # 输出全部信息
#msg: "{{ host_port.cmd }}" # 引用方式一
msg: "{{ host_port['stdout_lines'] }}" # 引用方式二

connection: local

  在本地服务器上运行命令,而不是SSH

- name: 创建 aggregator proxy证书签名请求
template: src=aggregator-proxy-csr.json.j2 dest=/ssl/aggregator-proxy-csr.json
connection: local

until轮询等待

  轮询等待kube-apiserver启动完成,查看api服务是否running状态,重试10次,每次间隔3秒

- name: 轮询等待kube-apiserver启动
shell: "systemctl status kube-apiserver.service|grep Active"
register: api_status
until: '"running" in api_status.stdout'
retries: 10
delay: 3
tags: upgrade_k8s, restart_master

when判断

  当系统为centos等时执行centos.yml任务

- import_tasks: centos.yml
when: 'ansible_distribution in ["CentOS","RedHat","Amazon","Aliyun"]'

内置变量inventory_hostname

  inventory_hostname变量可以获取到被操作的当前主机的主机名称,这里所说的主机名称并不是linux系统的主机名,而是对应主机在清单中配置的名称

如果使用IP配置主机,inventory_hostname的值就是IP,如果使用别名,inventory_hostname的值就是别名

  如只给k8s主节点分发配置文件

- name: 分发kubeconfig配置文件
copy: src=cluster_dir/item dest=/etc/kubernetes/item
when: "inventory_hostname in groups['kube_master']"

notify指令和handlers

  如果在某个task中定义了notify指令,当Ansible在监控到该任务 changed=1时,会触发该notify指令所定义的handler,然后去执行handler,需要注意的是hander是被触发而被动执行的。

  网上示例,安装httpd、复制配置文件到远端主机、启动httpd服务:

cat apache.yml
- hosts: webservers
remote_user: root
tasks:
- name: install apache
yum: name=httpd state=latest
- name: install configure file for httpd
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd #通知restart httpd这个触发器
- check httpd #可以定义多个触发器
- name: start httpd service
service: enabled=true name=httpd state=started
handlers: #定义触发器,和tasks同级
- name: restart httpd #触发器名字,被notify引用,两边要一致
service: name=httpd state=restart
- name: check httpd
shell: netstat -ntulp | grep 80

ansible管理windows

  环境要求Ansible管理主机Linux系统,远程主机的通信方式也由SSH变更为PowerShell,同时管理机必须预安装Python的Winrm模块。

  Windows客户端主机开启Winrm服务,PowerShell需3.0+版本且Management Framework 3.0+版本,实测Windows 7 SP1和Windows Server 2008 R2及以上版本系统经简单配置可正常与Ansible通信。

  具体安装内容这里不作详情介绍。

自动化运维利器Ansible要点汇总的更多相关文章

  1. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  2. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客

    自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署

  3. CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机

    使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...

  4. 自动化运维工具Ansible介绍

    一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...

  5. 自动化运维之ansible

    第三十九课 自动化运维之ansible 目录 十五. ansible介绍 十六. ansible安装 十七. ansible远程执行命令 十八. ansible拷贝文件或目录 十九. ansible远 ...

  6. 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操

    前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...

  7. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

  8. 如何高效地远程部署?自动化运维利器 Fabric 教程

    关于 Python 自动化的话题,在上一篇文章中,我介绍了 Invoke 库,它是 Fabric 的最重要组件之一.Fabric 也是一个被广泛应用的自动化工具库,是不得不提的自动化运维利器,所以,本 ...

  9. 自动化运维工具-Ansible之7-roles

    自动化运维工具-Ansible之7-roles 目录 自动化运维工具-Ansible之7-roles Ansible Roles基本概述 Ansible Roles目录结构 Ansible Roles ...

随机推荐

  1. RHEL7.2下DHCP服务器的搭建

    DHCP(?Dynamic Host Configuration Protocol)是一种帮助计算机从指定的DHCP服务器获取配置信息的自举协议 请求配置信息的计算机叫做DHCP客户端,而提供信息的叫 ...

  2. Jenkins 使用PowerShell插件部署Net5项目

    Jenkins安装 PowerShell plugin 插件 新建自由项目 拖到 构建 处,添加 PowerShell 构建 贴入下方脚本即可 # 变量 $ProjectPath = "E: ...

  3. zabbix告警推送至个人微信

    文章原文 自从接触zabbix后,就一直想着怎么才能把告警推送到个人微信上.有这样的想法主要是个人微信的使用频率远远要比钉钉,企业微信,邮箱,飞书等使用频率要高.比如我,就遇到过在周末的时候,因为没有 ...

  4. (三、四)Superset 1.3图表篇——透视表-Pivot Table

    本系列文章基于Superset 1.3.0版本.1.3.0版本目前支持分布,趋势,地理等等类型共59张图表.本次1.3版本的更新图表有了一些新的变化,而之前也一直没有做过非常细致的图表教程. 而且目前 ...

  5. 取消input默认提示框

    input输入框有自动保存记忆功能,点击的时候之前输入的内容会在下拉框自动提示 autocomplete="off",这是H5的一个属性. <input type=" ...

  6. 常见shell脚本测试题 if/case语句

    1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提 ...

  7. Pikachu靶场通关之XSS(跨站脚本)

    一.XSS(跨站脚本)概述 Cross-Site Scripting 简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS.一般XSS可以 ...

  8. wpf 多表头

    WPF多表头技术探索总结 方案一:Grid+TextBlock嵌套DataGrid方式. 该方案是现在项目中已使用的方案.实现起来比较简单,但不具有通用性,不同数据DataGrid需要指定不同的Tex ...

  9. TP5 pc和wap跳转404

    在config.php中配置 // HttpException异常 'http_exception_template' => [ // 定义404错误的重定向页面地址 404 => isW ...

  10. C# 获取动态类中所有的字段

    /// <summary>        /// 动态类 获取字典集合        /// </summary>        /// <typeparam name= ...