Ansible的基础使用和快速入门

Ansible其实一个it运维自动化工具,主要是完成it基础设施的配置应用的部署,可以对百十台的主机,上千台的主机进行管理,它一直强调的是:
简单易用,所以我们就能很快的上手它,所以不需要好的基础能力

创新互联建站是一家专注于网站建设、成都做网站与策划设计,铁山网站建设哪家好?创新互联建站做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:铁山等地区。铁山做网站价格咨询:028-86922220

简单-----减少学习的成本:它使用易读的描述语言部署的文件。
无需特殊编码技能:也就是它不需求你会开发,你就能很快的上手使用。
任务按顺序执行: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去使用的。

Ansible的架构
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 [options]
主机的模式->选项,就是在你的主机清单中匹配
这个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命令

  1. 命令工具常用选项
  2. Ssh密码认证
  3. 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 root@10.4.7.21
这个就是保存你ansible主机上的公钥

[root@aaa ~]# cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRgvupMdkSCz2tP1WOig7h736iqHdFMWVdMoYnmgpe8EUp/Xmuwf66dVv/RrDvs6jyPtlnlQtBVtEYJCwsuumgLXcSp+XwyICLe5cetYGYRa3ByhIiJPxrfkLCnLGHAHKl0dBnxN2286Rsg1D1NgRLFGVS+MF1Hj6CPgHhLc+eTusDv4tZXCFGdJoyT99jJCAwpc1N/pbJhoS/t4g+fxZ7nCrRkLS49i8Mo7KuLjtfwlB4yDbh2bzdG60rzF71k8asJlBj3GcSmtEhqmw7xyv2qcqCq/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"


新闻名称:Ansible的基础使用和快速入门
链接分享:http://azwzsj.com/article/pcheoj.html