由于大部分互联网公司服务器环境复杂,线上线下环境、测试正式环境、分区环境、客户项目环境等造成每个应用都要重新部署,而且服务器数量少则几十台,多则千台,若手工一台台部署效率低下,且容易出错,不利后期运维,因此需要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文件中明文标出不安全 不推荐,配置密码:

  1. /etc/ansible/hosts
  2. 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秒

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

when判断

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

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

内置变量inventory_hostname

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

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

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

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

notify指令和handlers

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

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

  1. cat apache.yml
  2. - hosts: webservers
  3. remote_user: root
  4. tasks:
  5. - name: install apache
  6. yum: name=httpd state=latest
  7. - name: install configure file for httpd
  8. copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
  9. notify:
  10. - restart httpd #通知restart httpd这个触发器
  11. - check httpd #可以定义多个触发器
  12. - name: start httpd service
  13. service: enabled=true name=httpd state=started
  14. handlers #定义触发器,和tasks同级
  15. - name: restart httpd #触发器名字,被notify引用,两边要一致
  16. service: name=httpd state=restart
  17. - name: check httpd
  18. 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. js 中连续的 3 个点 three dots (...) in javascript

    这个叫扩展运算符 https://dev.to/sagar/three-dots---in-javascript-26ci 5 种用法 1 function myFunc(...[x, y, z]) ...

  2. Appium自动化(5) - 如何获取android app 的Activity 和 Package

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 在Desired Capab ...

  3. Linu常用日志分析实战

    日志结构分析 分析日志状态码所在位置为第九个 遍历取出第一行日志的每个字段 //取出第一行日志 awk 'NR==1{for(i=1;i<=NF;i++)print i"= " ...

  4. 截断误差VS舍入误差

     截断误差:是指计算某个算式时没有精确的计算结果,如积分计算,无穷级数计算等,使用极限的形式表达的,显然我们只能截取有限项进行计算,此时必定会有误差存在,这就是截断误差. 舍入误差:是指由于计算机表示 ...

  5. I/O流中的字节流

    今天总结一下Java中重要的知识点I/O流,今天主要学习了字节流(自己的理解) 什么是I/O:我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input和输出ou ...

  6. 接口测试-Mock测试方法

    接口测试-Mock测试方法一.关于Mock测试1.什么是Mock测试?Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造 ...

  7. [转载20131024]Nginx服务器漏洞的利用和修复方法

    本文主要分为两大部分,第一部分介绍了Nginx的一些常见安全漏洞的形成原因.利用方法,并给出了相应的解决办法;第二部分介绍了Nginx安全加固时需要关注的主要内容. Nginx(发音同engine x ...

  8. P6563-[SBCOI2020]一直在你身旁【dp,单调队列】

    正题 题目链接:https://www.luogu.com.cn/problem/P6563 题目大意 长度为\(n\)的序列\(a_i\),现在有一个随机\([1,n]\)的整数,每次你可以花费\( ...

  9. Python爬虫--淘宝“泸州老窖”

    爬虫淘宝--"泸州老窖" 爬去淘宝"泸州老窖" 相关信息: import requests import re import json import panda ...

  10. 踩坑系列《十三》解决时间戳long转换int溢出(即转换值为负数)

    最近业务需求,需要使用到 int 类型的时间戳,所以在使用时间戳的时候,由于java自带的 System.currentTimeMillis() 返回的类型是long,强行转换一波的话,是会出现数据溢 ...