从零开始搭建运维体系 - ansible

基本配置好了局域网内的机器后,第一个遇到的问题就是如何批量操作这么多台机器,ansible就是这么一个自动化运维工具。

ansible是一个基于ssh的批量远程操作命令工具。它有分管理端和被管理端,管理端安装ansible,被管理端什么都不需要安装。这个是非常方便的。只要能远程登陆上就可以。

ansible有两种模式,ansible-hoc和ansible-playbook。简单来说,ansible-hoc就是可以在console上一次执行多个命令。ansible-playbook就是预先编写一个执行步骤,然后在不同机器上执行这个执行步骤。

配置好ssh的用户名密码

我选择使用root账号直接操作ssh的用户,这样我可以站在上帝视角做任何操作,当然这个也是一个双刃剑,也附带一定的危险性。

去每个机器上配置root密码:

passwd root
输入-123456

安装ansible的管理机

ansible的安装比较简单。我选用的是yum安装

安装完成之后,所有的配置文件都在

/etc/ansible/

下面。

ansible配置

修改ansible的默认host配置,在这个配置里面就可以配置上用户名和密码

[local]
localhost ansible_connection=local [test]
192.168.34.3 ansible_connection=ssh ansible_user=root ansible_ssh_pass=123456 [all]
localhost ansible_connection=local
192.168.34.3 ansible_connection=ssh ansible_user=root ansible_ssh_pass=123456
192.168.34.4 ansible_connection=ssh ansible_user=root ansible_ssh_pass=123456
"/etc/ansible/hosts" 50L, 1261C

我配置了三个组,其中一个组叫local,它只有ansible的管理机local,直接使用ansible_connection=local就表示是操作的本机。

另外一个组叫做all,这个all包含了三台机器,34.2~4(local)这个机器是本地机器的IP。

还有一个组叫做test,就代表我发布之前先执行这台程序,算是灰度发布。

测试执行第一条命令

第一条命令长这样:

ansible all -m ping

这个就是ansible-hoc模式,其中all 表示ansible操作在all这个组,-m表示调用的是什么模块,ansible有很多模块,这个ping是最常用的模块之一。其他的常用模块使用可以参考ansible常用模块介绍

你有可能返回这个错误

192.168.34.3 | FAILED | rc=-1 >>
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.

这个就是说需要你把远程服务器加入到known_hosts中,当然你可以不需要加入,修改ansible配置文件/etc/ansible/ansible.cfg

修改这个配置

host_key_checking = False

就可以不需要known_hosts就行了

[root@localhost var]# ansible all -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.34.3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.34.4 | SUCCESS => {
"changed": false,
"ping": "pong"
}

使用ansible创建公司用户

我们希望创建一个公司用户,以后业务应用都用这个用户进行运行,而不是使用root。那么用ansible如何操作?

我们可以使用user模块,使用模块的好处是很容易写出幂等的命令。可以多次执行。如果你不知道user模块有哪些可以配置,就使用命令ansible-doc -s user 来查看,或者去官网查看

ansible test -m user -a 'name=company shell=/bin/bash home=/home/company state=present password=$6$mysecretsalt$RGyLyUuTb8ssDdlZDeLV0gn3khYBQkdIAuyRwAVr9WcH5FpUH6V7qBd4ZI59DXaAuL9Zmift0CTv8mCsQG3Ws.'

这里的password是怎么生成的呢?

可以使用这个命令:

ansible all -i localhost, -m debug -a "msg={{ 'company123' | password_hash('sha512', 'mysecretsalt') }}"

将输出的密码复制到用户里面

192.168.34.3 | CHANGED => {
"append": false,
"changed": true,
"comment": "",
"group": 1001,
"home": "/home/company",
"move_home": false,
"name": "company",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"uid": 1001
}

创建成功了。这里的state=present代表如果这个用户不存在就创建,如果这个用户存在就不创建。所以这个命令是幂等的。

然后我就可以对所有机器执行这个操作了。

[root@localhost var]# ansible all -m user -a 'name=company shell=/bin/bash home=/home/company state=present password=$6$mysecretsalt$RGyLyUuTb8ssDdlZDeLV0gn3khYBQkdIAuyRwAVr9WcH5FpUH6V7qBd4ZI59DXaAuL9Zmift0CTv8mCsQG3Ws.'

批量修改hostname

我希望修改每个机器的hostname, 根据它的ip(ansible定义给它的host)修改为xx-xx-xx-xx,把ip中的点换成-

这个时候就需要用到playbook了。其实playbook本质就是yml。你可以在yml中定义你这个脚本需要执行在哪个机器,执行哪些命令。

比如修改hostname的playbook如下:

- hosts: test
tasks:
- hostname : name={{ ansible_host.split('.') | join('-') }}

操作在test机器组,执行hostname的命令,其中的ansible_host是我ansible调用的host,先用.切割成数组,再用-拼接起来。

如果你还对这些变量和命令比较不熟悉,建议先使用debug模块在ansible-hoc上尝试一下:

[root@localhost ~]# ansible test  -m debug -a "msg={{ansible_host.split('.') | join('-')}}"
192.168.34.3 | SUCCESS => {
"msg": "192-168-34-3"
}

好,执行这个playbook:

[root@localhost ~]# ansible-playbook /etc/ansible/playbooks/change_hostname.yml

PLAY [test] ******************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [192.168.34.3] TASK [hostname] **************************************************************************************************************************************
changed: [192.168.34.3] PLAY RECAP *******************************************************************************************************************************************
192.168.34.3 : ok=2 changed=1 unreachable=0 failed=0

登陆到机器上,或者直接使用shell模块看,成功了

[root@localhost ~]# ansible test -m shell -a 'hostname'
192.168.34.3 | CHANGED | rc=0 >>
192-168-34-3

对所有机器执行这个操作,修改/etc/ansible/playbooks/change_hostname.yml里面的hosts为all。

需要把这个company用户加入到sudoer列表中, 并且把我管理机上的company用户设置为授信用户

首先我管理机上company用户先创建公钥,切换到company用户上,命令ssh-keygen生成公钥和私钥,公钥在/home/company/.ssh/id_rsa.pub

授信就是把公钥放到需要授权的机器上的authroized_key中。

增加用户到sudoers呢就是在/etc/sudoers中增加一行用户信息,并且设置NO PASSWORD。

ansible中最爽的就是有模块的概念,这两个操作都有模块提供,一个是linefile模块,一个是authorized_key模块

- hosts: test
tasks:
- name: 确保存在company这个group
group: name=company state=present
- name: 允许company组的人可以无密码切换sudo
linefile:
dest: /etc/sudoers
state: present
regexp: '^%company'
line: '%company ALL=(ALL) NOPASSWD: ALL'
validate: 'visudo -cf %s'
- name: 为company用户设置authorized_key
authorized_key: user=company key="{{item}}"
with_file:
- /home/company/.ssh/id_rsa.pub

完整playbook如上。

从零开始搭建运维体系 - ansible的更多相关文章

  1. 蚂蚁金服互联网IT运维体系实践

    摘要: 本文来自蚂蚁金服首席技术架构师,基础技术部负责人胡喜.从2010年支撑双十一最高交易峰值2万笔/分钟到2015年双十一的8.59万笔/秒,蚂蚁金服的技术架构和运维体系一直都在不断摸索和实践.本 ...

  2. 阿里巴巴毕玄解密AIOps:一文读懂阿里巴巴运维体系的前世今生

    [编者按]林昊(毕玄),阿里巴巴研发效能事业部负责人.2007年加入阿里,10年间打造了阿里目前使用最为广泛的核心中间件之一的服务框架:建设了阿里的HBase团队,发展到今天HBase已经是阿里最重要 ...

  3. DevOps:运维体系建设

    简介 运维体系的建设的目的在于方便运维工作,通过自动化.规范化.流程化的操作方法提高运维效率,打造一个安全.可靠.高效.可追踪.可回溯的运维环境,实现一个高可用.高并发.具备高容错.自我修复.故障能快 ...

  4. 【运维技术】从零开始搭建开发使用的Kafka环境

    [原创]从零开始搭建开发使用的Kafka环境 入门资料 百度百科: Kafka是一种高吞吐量的分布式发布订阅消息系统,这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决. 对于像Hadoop ...

  5. 【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  6. vue-用Vue-cli从零开始搭建一个Vue项目

    Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...

  7. 在阿里云服务器(ECS)上从零开始搭建nginx服务器

    本文介绍了如何在阿里云服务器上从零开始搭建nginx服务器.阿里云服务器(ECS)相信大家都不陌生,感兴趣的同学可以到http://www.aliyun.com/product/ecs去购买,或到体验 ...

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

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

  9. 从零开始搭建Docker Swarm集群

    从零开始搭建Docker Swarm集群 检查节点Docker配置 1. 打开Docker配置文件(示例是centos 7)vim /etc/sysconfig/docker2. 添加-H tcp:/ ...

随机推荐

  1. 1. 开篇-springboot环境搭建

    最初学习strurs2时,虽然觉得也挺好用的,但也有一些不便的地方:1. 模型绑定必须要在Action中声明对应模型的成员变量:2. Action中对外提供调用的接口必须明确注明:3. 要声明一大堆的 ...

  2. 关于MySQL的1064错误

    MySQL的1064错误是SQL语句写的有问题时出现的,即SQL的语法错误.笔者常常使用MySQL-python这个库来对MySQL进行操作,代码中报这个错误的一般是cursor.execute(sq ...

  3. 打开office时提示错误窗口“向程序发送命令时出现问题”的解决方案

    今天同事问了我一件很怪异的事情,说她的office打不开了,如打开word或excel时,突然出现错误提示错误窗口"向程序发送命令时出现问题",分析原因才知道她安装了 AVG pc ...

  4. java基础小项目练习之1----3天做出飞机大战

    Shoot射击游戏第一天一. 关键问题(理论):1. 简述FlyingObject.Enemy.Award.Airplane.Bee.Bullet.Hero之间的继承与实现关系2. 简述Hero类构造 ...

  5. dictionary.go

    package sego import "github.com/adamzy/cedar-go" // Dictionary结构体实现了一个字串前缀树,一个分词可能出现在叶子节点也 ...

  6. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包

    BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包 题意: 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值 ...

  7. Rmq Problem/mex BZOJ3339 BZOJ3585

    分析: 一开始没看懂题... 后来想用二分答案却不会验证... 之后,想到用主席树来维护... 建一个权值线段树,维护出这个权值以前所有的点最晚在哪里出现... 之后,查一下是不是比查询区间的l断点大 ...

  8. go语言调度器源代码情景分析之五:汇编指令

    本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...

  9. 初探机器学习之使用百度AI服务实现图片识别与相似图片

    一.百度云AI服务 最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云.腾讯云和百度云.其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度 ...

  10. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...