Ansible其实一个it运维自动化工具,主要是完成it基础设施的配置应用的部署,可以对百十台的主机,上千台的主机进行管理,它一直强调的是:
简单易用,所以我们就能很快的上手它,所以不需要好的基础能力
简单-----减少学习的成本:它使用易读的描述语言部署的文件。
无需特殊编码技能:也就是它不需求你会开发,你就能很快的上手使用。
任务按顺序执行:ansible执行就是按你的任务从上到下依次去执行,所以很好去理解,很好的去写这个配置文件。
强大-----协调应用程序生命周期,因为一个应用程序的生命周期分为多个阶段,例如从代码的拉取到构建,然后再到部署,然后再到测试,一个应用的周期大概是这样的,ansible可以在这个应用周期中完成一系列任务
应用部署
配置管理
工作流程编排
我们可以通过刚才的那几个阶段去写配置文件,这样就能很清晰的看出这个应用程序到底要做哪些事,根据我们做那些事,我们再逐一的去分解
这也就是ansible的主要的功能
无代理----可预测,可靠和安全
无代理架构,也就是在一台服务器上安装ansible就可以了,而不需要在客户端再安装一个agent,
使用openssh通信,确保了安全性,
没有代理维护成本
Ansible相对比同类的saltstack他们都是使用python去编写的,在早些年saltstack市场占有率是远超ansible,而近几年市场占有率是远超saltstack的,其实主要的原因呢,就是跟它这个设计模式有关系,因为ansible最初呢讲究的就是无代理架构,而saltstack要在被管理端,要装一个agent,装一个很简单,要考虑后期的维护,所以根据现在的市场需求,很多情况下,在某些机器上安装一些复杂的agent和其他的一些工具,对于现在的企业it环境中,每个服务器上面都安装了很多的agent,有可能自己研发了被监控端的agent,日志的agent,回头再安装一些其他的agent,要初始化要舒适化四五个agent,久而久之就会增加很多额外的负载,而且不易于我们后期对服务器的管理,所以根据这个现状呢,ansible就用的it企业很多,而且ansible在它本身的这个配置下就是这么设计的,而且根据这种形态去扩展更多模块和功能,而saltstack,虽然已经支持了这种无代理架构,但是它是后来支持的,有很多功能的还是难于ansible去使用的。
Users就是我们这个管理员用户,也就是我们,我们去批量管理主机,有两种方式,一个是执行命令,例如查看磁盘空间
第二种方式呢,就是playbook去管理比较复杂的任务,例如一个应用的部署
这个ansible引擎有4部分,第一个就是inventory,这个就是管理我们主机的一个清单,你去管理谁,就是在这体现的,包括主机的ip地址,端口,账户密码都是在这个inventory去输写的
第二个就是ansible的Api,它有api来供我们去调用,当我们去开发运维自动化平台的时候,不用去造轮子,就可以直接使用ansible的api去使用来完成你的批量管理。
第三个就是模块modules,ansible是一个自动化引擎,它很多的功能呢都是通过模块去实现的,例如去创建一个用户,那么它就有这个user这个账户,那么去管理一个服务,去启动一个服务那么久有这个service,强调之初呢就是它有非常多的模块。
第四个就是plugins,这个就是插件,这个相当于ansible来完成内部的一些操作,例如ansible怎么去管理这些主机,那么它就有这个contation的一个插件,通过这个插件呢去连接你这个主机,所以这个plugins是ansible的核心功能,而模块是ansible核心之外的扩展功能。
而ploybook可以通过这些模块去编写应用的生命周期,它就相当于一个文本,我们要在里面输写我们要做哪些事
如果要实现一个CMDB的一个功能,配置中心管理数据库,这个功能呢就记录了你的it基础设施中,一些主机的一些信息,通过这些信息呢,以供其他人去使用,供其他的项目去调用,有了ansible的话就能很快去获取这些信息,因为ansible可以在你的目标主机上去获取当前主机所有的一些硬件资源了,一些配置,各个信息都会帮你收集,只需要将你的数据收集到你的CMDB当中就可以了
而且ansible也有很多的模块和插件来对接这个云平台,不管是私有云还是公有云都会帮我们去做一些事,,这个就是一个ansible的一个架构
管理员通过操作ansible,ansible去调用一些模块和插件来读取,inventory的配置主机清单,去操作你操作的主机组。
Ansible的安装
我们可以直接通过yum去安装
[root@ansible ~]# yum -y install ansible
安装之后就是配置ansible,这里就是配置ansible的主机清单,这里可以使用把密码写上去,也可以提前做好免交互登录,就直接写ip也可以
[root@ansible ~]# vim /etc/ansible/hosts
[webservers]
10.4.7.12 ansible_ssh_user=root ansible_ssh_pass=666666
10.4.7.21 ansible_ssh_user=root ansible_ssh_pass=666666
对我们执行的命令添加不需要指纹的交互
[root@ansible ~]# vim /etc/ansible/ansible.cfg
host_key_checking = False
查看我们多主机节点的磁盘状态
[root@ansible ~]# ansible webservers -a "df -h"
10.4.7.12 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.4G 49G 3% /
devtmpfs 858M 0 858M 0% /dev
tmpfs 870M 0 870M 0% /dev/shm
tmpfs 870M 8.4M 861M 1% /run
tmpfs 870M 0 870M 0% /sys/fs/cgroup
/dev/sda2 1014M 179M 836M 18% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 73G 33M 72G 1% /data
tmpfs 174M 0 174M 0% /run/user/0
10.4.7.21 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.4G 49G 3% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 8.4M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 1014M 179M 836M 18% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 73G 33M 72G 1% /data
tmpfs 779M 0 779M 0% /run/user/0
Ansible的使用要求
服务端的要求
Python2.6/2.7/3.x
Redhat,Debian,centos,os x等,不支持windows
因为ansible是python写的所以要有python的环境,ansible是在15年的10月份被redhat收购的,默认centos已经将python安装了
被管理端要求
Openssh,linux发行版一般也使用openssh,也需要python,会使用python的脚本,执行我们使用的模块,最终封装我们使用的脚本,在被管理端执行,结果返回给ansible
Python2.6/2.7/3.x
安装ansible的方式支持yum,也是推荐的方式,像redhat核debian都支持他们本身的软件包去安装ansible
也可以通过pip去安装,其实ansible也是python的一个模块
也可以通过源码包去安装
• https://releases.ansible.com/ansible or https://github.com/ansible/ansible.git
ansible的配置文件
[root@ansible ~]# vim /etc/ansible/ansible.cfg
some basic default values...
#inventory = /etc/ansible/hosts
#library = /usr/share/my_modules/
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#forks = 5
#poll_interval = 15
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
有这几个重要的简单说一下,inventory -/etc/ansible/hosts
这是被管理端的主机清单
Fork是ansible工作进程的并发数,它默认是5个,可以根据自己管理主机的数量调整这个,同时提高这个并发数也会对你的服务器的负载增加消耗
Sudo_user:就是提权,在linux下如果你是普通用户,如果想root方式去执行操作时,那你是不是需要sudo,或者su -切到root用户操作,那这就称为提权。
Remote_port=22,操作目标主机的端口,ssh 默认22,这里也默认22
Host_key_checking=false 这个开启的话就会实现我们第一次登录一个主机时,可以免去敲yes/no,但是开启这个也有不好的,就是当我们的服务端重装系统了,那么这个地方就会失效报错,当然也可以解决,把know_hosts下的历史登录记录清除就可以,不过这个也不影响使用。
Log_path=/var/log/ansible.log 就是记录日志的,记录一些基本操作,可以开启一下
Private_key_file=/root/.ssh/id_rsa,这是指定密钥认证的私钥,连接linux的认证方式就是基于密码的认证,一个是基于密钥对的认证,基于密钥对的认证是相对于比较安全的,进行数字证书的效验,基于ssh的容易被破解,但是满足密码的复杂性也很难破解。
inventory主机清单
[root@ansible ~]# vim /etc/ansible/hosts
像ansible在操作我们基础设施主机的时候,都是通过这个/etc/ansible/hosts去操作的
这个配置中有属于这种未分组的组,它会分配到auto的组中,也就是默认组,我们可以根据IP,或者主机名进行配置,
Ex 1: Ungrouped hosts, specify before any group headers.
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
Ansible的执行命令的使用方法
[root@ansible ~]# ansible --help
Usage: ansible
主机的模式->选项,就是在你的主机清单中匹配
这个all就是匹配你所有的主机组,不加主机组也会匹配上
-m command可以省略,这是默认的
[root@ansible ~]# ansible all -a "free -m"
10.4.7.12 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 1738 121 1475 8 141 1456
Swap: 3839 0 3839
10.4.7.21 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 7785 162 7479 8 143 7403
Swap: 3839 0 3839
10.4.7.22 | SUCCESS | rc=0 >>
total used free shared buff/cache available
Mem: 7785 159 7482 8 144 7406
Swap: 0 0 0
也可以使用直接输入ip同样也可以查看到
[root@ansible ~]# ansible 10.4.7.12 -a "df -h"
10.4.7.12 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 1.4G 49G 3% /
devtmpfs 858M 0 858M 0% /dev
tmpfs 870M 0 870M 0% /dev/shm
tmpfs 870M 8.4M 861M 1% /run
tmpfs 870M 0 870M 0% /sys/fs/cgroup
/dev/sda2 1014M 179M 836M 18% /boot
/dev/sda1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 73G 33M 72G 1% /data
tmpfs 174M 0 174M 0% /run/user/0
然后就是变量,能与用户动态的交互,传参,来让ansible来做指定的事情,这样就能更灵活一些。
Ansible的官方文档是docs.ansible.com
一般经常用的ansible和ploybook,doc
其他的模块也很多,暂时也用不上
比如变量的使用
[webservers]
10.4.7.21 ansible_ssh_user=root ansible_ssh_pass=666666 http_port=80
10.4.7.22 ansible_ssh_user=root ansible_ssh_pass=666666 http_port=80
[root@ansible ~]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
80
10.4.7.21 | SUCCESS | rc=0 >>
80
组变量的使用,定义这个vars,使用的时候就会调用这个变量
[webservers:vars]
http_port=8080
server_name=www.devops.com
[root@ansible ~]# ansible webservers -a "echo {{http_port}}"
10.4.7.21 | SUCCESS | rc=0 >>
8080
10.4.7.22 | SUCCESS | rc=0 >>
8080
[root@ansible ~]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
www.devops.com
10.4.7.21 | SUCCESS | rc=0 >>
www.devops.com
也可以单独写到/etc/ansible/group_vars/webservers.yml下,它默认会读取你哪个组里面的变量,以yml的模式更方便
http_port: 8090
server_name: xiabanle
[root@ansible group_vars]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
8090
10.4.7.21 | SUCCESS | rc=0 >>
8090
[root@ansible group_vars]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
xiabanle
10.4.7.21 | SUCCESS | rc=0 >>
xiabanle
ad-hoc命令
- 命令工具常用选项
- Ssh密码认证
- Ssh 密钥对认证
前面所使用的就是我们使用的ad-hoc命令的方式执行一个命令来使用我们的ansible
这种的特点就是能够快速的执行某个操作,ad-hoc就是我们经常用的批量管理,而ploybook就是我们一个应用的编排
使用shell模块在主机组批量创建文件
[root@ansible ~]# ansible webservers -m shell -a "mkdir /opt/devops"
[WARNING]: Consider using file module with state=directory rather than running mkdir
10.4.7.21 | SUCCESS | rc=0 >>
10.4.7.22 | SUCCESS | rc=0 >>
[root@ansible ~]# ansible webservers -m shell -a "ls /opt/"
10.4.7.22 | SUCCESS | rc=0 >>
devops
test
10.4.7.21 | SUCCESS | rc=0 >>
devops
test
查看本次的操作设计到了哪些主机
[root@ansible ~]# ansible webservers --list-hosts
hosts (2):
10.4.7.21
10.4.7.22
查看输出的命令遇到的详细信息
[root@ansible ~]# ansible webservers -vvv -a "ls /opt/devops"
Ssh密钥对的认证
先创建一对密钥对
[root@ansible ~]# ssh-keygen
这个rsa.pub是公钥,这个放在目标主机上,这个id_rsa是使用这个私钥进行登录认证的
[root@ansible .ssh]# ls
id_rsa id_rsa.pub known_hosts
怎么放过去,有两种方式,第一种查看公钥的内容,将它复制到目标主机认证key中
还有一种方式就是通过ssh-copy-id,这样的话,就能直接传到目标主机的authorized_keys中[root@ansible .ssh]# ssh-copy-id [email protected]
这个就是保存你ansible主机上的公钥
[root@aaa ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRgvupMdkSCz2tP1WOig7h636iqHdFMWVdMoYnmgpe8EUp/Xmuwf66dVv/RrDvs6jyPtlnlQtBVtEYJCwsuumgLXcSp+XwyICLe5cetYGYRa3ByhIiJPxrfkLCnLGHAHKl0dBnxN2286Rsg1D1NgRLFGVS+MF1Hj6CPgHhLc+eTusDv4tZXCFGdJoyT99jJCAwpc1N/pbJhoS/t4g+fxZ7nCrRkLS49i8Mo7KuLjtfwlB4yDbh1bzdG60rzF71k8asJlBj3GcSmtEhqmw7xyv2qcqCq/CvpscUhJ4ZIrz4xs6Jq2IKBhgQiptCnDis15b6Cj6R3mY3XLf4sruX/hyh root@ansible
这样就能实现免交互登录了
这样的话,hosts文件只需要将IP或者域名写上就可以了
Ansible的常用模块
执行shell命令(command和shell)
文件传输(copy和file)可以对文件拷贝和创建目录
管理软件包(yum)
用户和组(user)
从源代码管理系统部署(git)从git仓库拉取源代码
管理服务(service)
收集目标主机信息(setup)
Copy模块将文件拷贝过去
[root@ansible ~]# ansible webservers -m copy -a "src=/root/Dockerfile dest=/tmp"
查看目标已有
[root@ansible ~]# ansible webservers -a "ls /tmp"
File模块在管理端去创建文件
创建目录state=directory
创建文件state=touch
删除目录/文件state=absent[root@ansible ~]# ansible webservers -m file -a "dest=/tmp/xiaoming state=file"
Yum模块在被管理端安装yum的包
Yum命令state=present
卸载命令 State=absent[root@ansible ~]# ansible webservers -m yum -a "name=vim state=present"
User模块,创建用户
[root@ansible ~]# ansible webservers -m user -a "name=foo password=66666"
删除用户 :state=absent
Service模块我们启动一个服务停止一个服务,
测试一个memcache来测试服务的启动和停止
启动state=started
停止state=stopped
开机启动enabled=true
重启state=restarted
启动
[root@ansible ~]# ansible webservers -m yum -a "name=memcached state=present"
[root@ansible ~]# ansible webservers -m service -a "name=memcached "
[root@ansible ~]# ansible webservers -m shell -a "ps -ef |grep memcached"
停止[root@ansible ~]# ansible webservers -m service -a "name=memcached state=stopped"
给memcached加入开机启动[root@ansible ~]# ansible webservers -m service -a "name=memcached enabled=true"
重启就是restarted
Set up模块是收集系统信息的
这个也会写一些变量,当我们使用ploybook时当前的主机变量[root@ansible ~]# ansible webservers -m setup
可以过滤其中的一些信息来过滤一些我们想要的系统信息,比如获得主机名
[root@ansible ~]# ansible webservers -m setup -a "filter=ansible_hostname"
10.4.7.21 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "k8s-node1"
},
"changed": false
}
10.4.7.12 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "k8s-master"
},
"changed": false
}
10.4.7.22 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "k8s-node2"
},
"changed": false
}
查看内存使用情况[root@ansible ~]# ansible webservers -m setup -a "filter=ansible_*_mb"