自动化运维工具介绍,Ansible介绍和安装,执行命令,操作文件和目录,远程执行脚本

自动化运维工具

需求:成百上千台机器,批量地执行某些命令、批量地升级某个服务。

Shell、expect脚本就可以实现自动化,但是需要我们自己手动编写脚本,效率低下、学习和维护成本很高。

主流自动化运维工具:Puppet、Saltstack、Ansible等。

Puppet

关于Puppet的介绍文章:https://blog.51cto.com/ixdba/1149055

Puppet是开源的基于Ruby的系统配置管理工具,基于C/S的部署架构。是一个为实现数据中心自动化管理而设计的配置管理软件,它使用跨平台语言规范,管理配置文件、用户、软件包、系统服务等。客户端默认每隔半小时会和服务器通信一次,确认是否有更新。当然也可以配置主动触发来强制客户端更新。这样就把日常的系统管理任务代码化了,代码化的好处是可以分享,保存,避免重复劳动,也可以快速恢复以及快速的大规模部署服务器。

Saltstack

Saltstack使用Python开发,是一个非常简单易用和轻量级的管理工具。C/S架构,由Master和Minion构成,通过ZeroMQ进行通信。Saltstack的master端监听4505与4506端口,4505为salt的消息发布系统,4506为salt客户端与服务端通信的端口;salt客户端程序不监听端口,客户端启动后,会主动连接master端注册,然后一直保持该TCP连接,master通过这条TCP连接对客户端控制,如果连接断开,master对客户端就无能为力了。当然,客户端若检查到断开后会定期的一直连接master端的。

Ansible

ansible是个什么东西呢?官方的title是:Ansible is Simple IT Automation. 中文解释:简单的自动化IT工具。

这个工具的目标有这么几项:自动化部署APP;自动化管理配置项;自动化的持续交互;自动化的(AWS)云服务管理。

所有的这几个目标从本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。通俗的说就是批量的在远程服务器上执行命令 。当然,最主要的是它是基于paramiko开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。简单归纳一下:基于Python paramiko开发,分布式,无需客户端,轻量级,配置语法使用YMAL及Jinja2模板语言,更强的远程命令执行操作。

Saltstack vs Ansible

Saltstack必须要安装agent(minion),所以部署环节多了一步,Ansible无需安装agent。

SaltStack是C/S架构,有master和minion,Ansible只需要有一个中心节点。

Saltstack基于ZeroMQ通信,Ansible基于ssh,Saltstack执行效率比Ansible快,如果机器量很大(>200)最好使用Saltstack

Ansible相比较Saltstack,学习起来更加容易

其他方面更详细的对比,参考

https://www.cnblogs.com/huang0925/p/4664608.html

Ansible

官网 www.ansible.com

在线电子书:https://getansible.com

Ansible是一款由RedHat赞助的开源软件。它是一款可以在整个IT团队中使用的自动化语言,从系统到网络到开发。它目前已经整合了虚拟化(Vmware、RHEV、Xen等)、网络设备(思科、F5、OpenSwitch)、容器(Docker、LXC)、公有云(亚马逊云AWS、微软Azure)、DEVOPS(Gitlab、Github、Jenkins)、监控/分析(Splunk、InfluxDB)等多个领域。

img

安装Ansible

文档:https://docs.ansible.com/ansible/latest/index.html

在CentOS7上安装Ansible:

yum install -y epel-release

yum install -y ansible

另外,ansible也支持使用pip安装

yum install python-pip

pip install ansible

验证是否登录成功,查看版本

ansible --version

Ansible因为是angent-less,所以只有一个控制中心,其他机器无需安装任何软件包。但要想控制远程机器,还需要配置密钥认证。

1)在控制中心生成密钥对

最好是先检查一下,ls /root/.ssh/,看看该目录下有没有id_rsa以及id_rsa.pub两个文件。如果没有执行如下命令

```

ssh-keygen

[root@jinkai01 ~]# ssh-keygen

[root@jinkai01 ~]# ls /root/.ssh/

authorized_keys id_rsa id_rsa.pub known_hosts

```

2)配置密钥认证

在控制中心,执行ssh-copy-id

ssh-copy-id [user@]远程机器ip

[root@jinkai01 ~]# ssh-copy-id 192.168.111.140

验证无密码远程登录

[root@jinkai01 ~]# ssh 192.168.111.140

Last login: Mon Dec 7 21:51:42 2020 from jinkai01

[root@jinkai05 ~]#

3)编辑hosts文件

Ansible 通过设备列表以分组的方式添加到 /etc/ansible/hosts 文件来实现对设备的管理,所以在正式管理之前,首先要编写好 hosts 文件。hosts 文件中,以[ ]包含的部分代表组名,设备列表支持主机名和IP地址。

默认情况下,通过访问22端口(SSH)来管理设备。若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口标明,以行为单位分隔配置。另外,hosts文件还支持通配符。

#格式如下

vim /etc/ansible/hosts

## [test]

## alpha.example.org

## beta.example.org

## 192.168.1.100

## 192.168.1.110

测试

Ansible的返回结果非常友好,一般会用三种颜色来表示执行结果:

红色:表示执行过程出现异常;

橘黄颜色:表示命令执行后目标有状态变化;

绿色:表示执行成功且没有目标机器做修改;

ansible all -m ping

[root@jinkai01 ~]# cat /etc/ansible/hosts

[test]

192.168.111.140

jinkai05

[root@jinkai01 ~]# ansible all -m ping

jinkai05 | SUCCESS => {

"ansible_facts": {

​ "discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

192.168.111.140 | SUCCESS => {

"ansible_facts": {

​ "discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

[root@jinkai01 ~]#

# 这里的all代表hosts文件里所有的主机,也可以指定单个

ansible jinkai05 -m ping

[root@jinkai01 ~]# ansible jinkai05 -m ping

jinkai05 | SUCCESS => {

"ansible_facts": {

​ "discovered_interpreter_python": "/usr/bin/python"

},

"changed": false,

"ping": "pong"

}

远程执行命令

command模块

command模块在远程主机执行命令,不支持管道、重定向等shell的特性。常用的参数如下:

chdir:在远程主机上运行命令前要提前进入的目录;

creates:在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务;removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务;executeable:指明运行命令的shell程序

[root@jinkai01 ~]# ansible test -m command -a "chdir=/ ls ./"

ansible test -m command -a 'hostname'

[root@jinkai01 ~]# ansible test -m command -a 'hostname'

jinkai05 | CHANGED | rc=0 >>

jinkai05

192.168.111.140 | CHANGED | rc=0 >>

jinkai05

#这里的test为hosts配置文件中配置的那个主机组名,-m后面指定模块名,这里的command为远程执行命令的模块,-a后面跟具体的命令

ansible 127.0.0.1 -m shell -a 'w'

[root@jinkai01 ~]# ansible 127.0.0.1 -m shell -a 'w'

127.0.0.1 | CHANGED | rc=0 >>

22:07:31 up 2:17, 1 user, load average: 0.20, 0.13, 0.09

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

root pts/0 192.168.111.1 19:56 3.00s 0.95s 0.01s w

#除了command模块外,也可以使用shell模块实现远程执行命令。shell还支持执行远程主机上的shell脚本。

远程执行脚本

shell模块

shell模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shell特性:如管道、重定向等。

首先创建一个shell脚本,/tmp/1.sh,内容如下

#!/bin/bash

echo date > /tmp/ansible_test.txt

然后把该脚本分发到各个机器上

ansible test -m copy -a "src=/tmp/1.sh dest=/tmp/test.sh mode=0755"

最后是批量执行该shell脚本

ansible test -m shell -a "/tmp/test.sh"

shell模块,还支持远程执行命令并且带管道

ansible test -m shell -a "cat /etc/passwd|wc -l "

拷贝文件或目录

copy模块

copy模块用于复制指定主机文件到远程主机的指定位置。常见的参数如下:

dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容;

src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录;

mode:指出复制时,目标文件的权限,可选;

owner:指出复制时,目标文件的属主,可选;

group:指出复制时目标文件的属组,可选;

content:指出复制到目标主机上的内容,不能和src一起使用,相当于复

content指明的数据到目标文件中;

ansible jinkai05 -m copy -a "src=/etc/passwd dest=/tmp/test123 owner=root group=root mode=0755"

[root@jinkai01 ~]# ansible jinkai05 -m copy -a "src=/etc/passwd dest=/tmp/test123 owner=root group=root mode=0755"

jinkai05 | CHANGED => {

"ansible_facts": {

​ "discovered_interpreter_python": "/usr/bin/python"

},

"changed": true,

"checksum": "75a4463c380b111d3bf0f2dae9787bc339b2f86e",

"dest": "/tmp/test123",

"gid": 0,

"group": "root",

"md5sum": "4b94e9c4fce7a5a255401706b959b739",

"mode": "0755",

"owner": "root",

"size": 1030,

"src": "/root/.ansible/tmp/ansible-tmp-1607350135.26-8003-211914668409808/source",

"state": "file",

"uid": 0

}

#注意:源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。如果拷贝的是文件,dest指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。但相反,如果desc是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面。

ansible test -m copy -a "src=/etc/passwd dest=/tmp/123"

#这里的/tmp/123和源机器上的/etc/passwd是一致的,但如果目标机器上已经有/tmp/123目录,则会再/tmp/123目录下面建立passwd文件

参考链接:https://www.cnblogs.com/keerya/p/7987886.html

扩展:ansible 常用模块

1)查看模块帮助:ansible-doc 模块名 例如:ansible-doc shell 搜索:/EX 查看案例

2)ping模块:测试连接到目标主机的ssh端口是否能正常通信

[root@jinkai01 ~]#ansible` test -m ping -o```

3)command模块:用于远程主机命令,默认模块,建议使用shell模块

[root@jinkai01 ~]# ansible test -mcommand-a'uptime'``

4)shell模块:执行远程命令,一些简单的shell命令

`[root@jinkai01 ~]# ``ansible test -m shell -a 'cat /etc/passwd |grep root'```

5)copy模块:复制文件到远程主机

[root@jinkai01 ~]# ansible test -mcopy -a 'src=/etc/hosts dest=/tmp/hosts '``

[root@jinkai01 ~]# ansible test -mcopy -a 'src=/etc/hosts dest=/tmp/hosts backup=yes'``

6)user模块:创建和删除用户

创建用户:ansible test -m user -a'name=jack shell=/sbin/nologin'``

删除用户:ansible test -m user -a'name=jack state=absent'``

echo123| openssl passwd-1` -stdin```

ansible test -m user -a'name=jack password="$1$Ec9OCYTb$OJtUgRRglXNuEMmSCLfPl/"'``

7)yum模块:安装和卸载软件包

安装:ansible test -m yum -a'name=httpd state=latest'``

卸载:ansible test -m yum -a'name=httpd state=absent'``

8)service模块:控制服务运行状态

ansibletest -m service -a'name=httpd state=started enabled=yes'` \state``是服务的启动,重启,关闭;enabled是服务器的开机启动```

ansible test -m service -a'name=httpd state=stopped enabled=no'` ```

9)file模块:创建文件或目录

创建文件:ansible test -m file -a 'path=/tmp/1.logmode=777` state=touch' ```

创建目录:ansible test -m file -a 'path=/tmp/dir1mode=777` state=directory'```

10)cron模块:创建和移除定义任务

ansible test -m cron -a'name="test"minute="*/10"job="/bin/echo hello"`'```

ansible test -m cron -a'name="test2"minute="00"hour="03"job="/bin/echo hello"`'```

移除:ansible test -m cron -a `'name`=`"test2"` minute=`"00"` hour=`"03"` job=`"/bin/echo hello"` state=absent'

猜你喜欢

转载自blog.51cto.com/11451960/2640795
今日推荐