ansible入门讲解

Posted wangjingguan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible入门讲解相关的知识,希望对你有一定的参考价值。

一、Ansible简介

Ansible是什么

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块化开发的,ansible本身没有批量部署的能力。真正具有批量部署能力的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agent,因为ansible是基于ssh来和远程主机通讯的。ansible目前已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且容易上手,学习简单。是每位运维工程师必须掌握的技能之一。

Ansible特点

  • 部署简单:只需要在主控机端部署Ansible环境,被控端无需做任何操作;
  • 默认使用SSH协议对设备进行管理;
  • 有大量常规运维操作模块,可实现日常绝大部分操作;
  • 配置简单、功能强大、扩展性强;
  • 支持API及自定义模块,可通过Python轻松扩展;
  • 通过Playbooks来定制强大的配置、状态管理;
  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  • 提供一个功能强大、操作性强的Web管理界面和REST API接口————AWX平台。

Ansible架构图

技术图片

上图中我们看到的主要模块如下:

  • ansible:Ansible核心程序;
  • HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
  • playbook:剧本yaml格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
  • CoreModule:核心模块,主要操作是通过调用核心模块来完成管理任务。
  • CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
  • Connection Plugins:连接插件,Ansible和Host通信使用

二、Ansible任务执行

Ansible任务执行模式

Ansible系统由控制主机对被管理节点的操作方式可分为两类,即adhocplaybook:

  • ad-hoc模式(点对点模式)
    使用单个模块,支持批量执行单条命令。ad-hoc命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
  • playbook模式(剧本模式)
    是Ansible主要管理模式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如web服务的安装部署、数据库服务器的批量备份等。可以简单的把playbook理解为通过组合多条ad-hoc操作的配置文件。

Ansible执行流程

技术图片
简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果

Ansible命令执行过程

  • 加载自己的配置文件/etc/ansible/ansible.cfg
  • 查找对应的主机配置文件,找到要执行的主机或者组;
  • 加载自己对应的模块文件,如command;
  • 通过ansible将模块或命令生成对应的临时py文件(python脚本),并将该文件传输至远程服务器;
  • 对应执行用户家目录的.ansible/tmp/XXX/XXX.py
  • 给文件 +x 执行权限;
  • 执行并返回结果;
  • 删除临时py文件,sleep 0退出。

三、Ansible配置详解

Ansible安装方式

Ansible安装常用有两种方式,yum安装pip程序安装。下面来介绍下这两种安装方式。

pip安装

首先,需要安装一个python-pip包,安装完成以后,则直接使用pip命令来安装我们的包,具体操作如下:

# yum install python-pip
# yum install ansible

yum安装

yum安装是我们很熟悉的安装方式了。首先需要先安装一个epel-release包,然后再安装我们的ansible即可。

#yum install epel-release -y
#yum install ansible -y

ansible程序结构

安装目录如下(yum安装):

  • 配置问价目录:/etc/ansible
  • 执行文件目录:/usr/bin
  • Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
  • Help文档目录:/usr/share/doc/ansible-X.X.X/
  • Man文档目录:/usr/share/man/man1/

ansible配置文件查找顺序

ansible与我们其它的服务在这一点上有很大不同,这里的配置文件是从很多个地方找的,顺序如下:

  • 1、检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);
  • 2、~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件
  • 3、/etc/ansible.cfg检查etc目录的配置文件

ansible配置文件

ansible的配置文件为/etc/ansible/ansible.cfg,有许多参数,下面我们列出一些常见的参数:

inventory = /etc/ansible/hosts	        #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible	        #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5	                        #并发连接数,默认为5
sudo_user = root		        #设置默认执行命令的用户
remote_port = 22		        #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False	        #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60		                #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log		#指定一个存储ansible日志的文件(默认不记录日志)

ansible主机清单

在配置文件中,我们提到了资源清单,这个清单就是我们的主机清单,里面保存的是一些ansible需要连接管理的主机列表。我们可以来看看他的定义方式:

1、直接指明主机地址或主机名
        ## green.example.com#
	# blue.example.com#
	# 192.168.100.1
	# 192.168.100.10

2、定义一个主机组[组名]把地址或主机名加进去
	[mysql_test]
	192.168.253.159
	192.168.253.160
	192.168.253.153

需要注意的是,这里的组成员可以使用通配符来匹配,这样对于一些标准化的管理来说就很轻松方便了。
我们可以根据实际情况来配置我们的主机列表,具体操作如下:

[root@server ~]# vim /etc/ansible/hosts
	[web]
	192.168.37.122
	192.168.37.133

四、ansible常用命令

ansible命令集

  • /usr/bin/ansible:Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行
  • /usr/bin/ansible-doc:Ansible 模块功能查看工具
  • /usr/bin/ansible-galaxy:下载/上传优秀代码或Roles模块 的官网平台,基于网络的
  • /usr/bin/ansible-playbook:Ansible 定制自动化的任务集编排工具
  • /usr/bin/ansible-pull:Ansible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)
  • /usr/bin/ansible-vault:Ansible 文件加密工具
  • /usr/bin/ansible-console:Ansible基于Linux Consoble界面可与用户交互的命令执行工具
     其中,我们比较常用的是/usr/bin/ansible/usr/bin/ansible-playbook。

ansible-doc命令

ansible-doc 命令常用于获取模块信息及其使用帮助,一般用法如下:

ansible-doc -l			#获取全部模块的信息
ansible-doc -s MOD_NAME		#获取指定模块的使用帮助

我们也可以查看一下ansible-doc的全部用法:

[root@server ~]# ansible-doc
Usage: ansible-doc [options] [module...]

Options:
  -h, --help            show this help message and exit  # 显示命令参数API文档
  -l, --list            List available modules           #列出可用的模块
  -M MODULE_PATH, --module-path=MODULE_PATH              #指定模块的路径
                        specify path(s) to module library (default=None)
  -s, --snippet         Show playbook snippet for specified module(s)  #显示playbook制定模块的用法
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable   # 显示ansible-doc的版本号查看模块列表:
                        connection debugging)
  --version             show program‘s version number and exit

我们可以来看一下,以mysql相关的为例:

[root@server ~]# ansible-doc -l |grep mysql
mysql_db                           Add or remove MySQL databases from a remote...
mysql_replication                  Manage MySQL replication                   
mysql_user                         Adds or removes a user from a MySQL databas...
mysql_variables                    Manage MySQL global variables      
[root@server ~]# ansible-doc -s mysql_user

技术图片

ansible命令详解

命令的具体格式如下:

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

也可以通过ansible -h来查看帮助,下面我们列出一些比较常用的选项,并解释其含义:

-a MODULE_ARGS          #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
-k,--ask-pass	        #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass	        #ask for su password。su切换密码
-K,--ask-sudo-pass	#ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass	#ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS	#后台运行超时时间
-C	        #模拟运行环境并进行预运行,可以进行查错测试
-c CONNECTION	#连接类型使用
-f FORKS	#并行任务数,默认为5
-i INVENTORY	#指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts	#查看有哪些主机组
-m MODULE_NAME	#执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-o	        #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S	        #用 su 命令
-R SU_USER	#指定 su 的用户,默认为 root 用户
-s	        #用 sudo 命令
-U SUDO_USER	#指定 sudo 到哪个用户,默认为 root 用户
-T TIMEOUT	#指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER	#远程用户,默认为 root 用户
-v	        #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息

ansible配置工私钥

上面我们已经提到过ansible是基于ssh协议实现的,所以其配置公私钥的方式与ssh协议的方式相同,具体操作步骤如下:

#1.生成私钥
[root@server ~]# ssh-keygen 

#2.向主机分发私钥
[root@server ~]# ssh-copy-id root@192.168.37.122
[root@server ~]# ssh-copy-id root@192.168.37.133

这样的话,就可以实现无密码登录,我们的实验过程也会顺畅很多。
注意,如果出现报错:-bash: ssh-copy-id: command not found,那么就证明我们需要安装一个包:

那么就证明我们需要安装一个包:

五、ansible常用模块

1) 主机连通性测试

我们使用ansible web -m ping命令来进行主机连通性测试,效果如下:

[root@server ~]# ansible web -m ping
192.168.37.122 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.37.133 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

这样就说明我们的主机是连通状态的。接下来的操作才可以正常进行。

2) command模块

这个模块可以直接在远程主机上执行命令,并将结果返回本主机。
举例如下:

[root@server ~]# ansible web -m command -a ‘ss -ntl‘
192.168.37.122 | SUCCESS | rc=0 >>
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128          *:111                      *:*                  
LISTEN     0      5      192.168.122.1:53                       *:*                  
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      128    127.0.0.1:631                      *:*                  
LISTEN     0      128          *:23000                    *:*                  
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128         :::111                     :::*                  
LISTEN     0      128         :::22                      :::*                  
LISTEN     0      128        ::1:631                     :::*                  
LISTEN     0      100        ::1:25                      :::*                  

192.168.37.133 | SUCCESS | rc=0 >>
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128          *:111                      *:*                  
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      128    127.0.0.1:631                      *:*                  
LISTEN     0      128          *:23000                    *:*                  
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128         :::111                     :::*                  
LISTEN     0      128         :::22                      :::*                  
LISTEN     0      128        ::1:631                     :::*                  
LISTEN     0      100        ::1:25                      :::* 

命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作"<",">","|",";","&"工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持|管道命令。下面来看看该模块下常用的几个命令:

chdir       # 在执行命令之前,先切换到该目录
executable       # 切换shell来执行命令,需要使用命令的绝对路径
free_form       # 要执行的Linux指令,一般使用Ansible的-a参数代替。
creates         # 一个文件名,当这个文件存在,则该命令不执行,可以
用来做判断
removes          # 一个文件名,这个文件不存在,则该命令不执行

接着来看看这些命令执行的效果

[root@server ~]# ansible web -m command -a ‘chdir=/data/ ls‘  #先切换到 /data/ 目录,再执行"ls"命令
192.168.37.122 | SUCCESS | rc=0 >>
aaa.jpg
fastdfs
mogdata
tmp
web
wKgleloeYoCAMLtZAAAWEekAtkc497.jpg

192.168.37.133 | SUCCESS | rc=0 >>
aaa.jpg
fastdfs
mogdata
tmp
web
wKgleloeYoCAMLtZAAAWEekAtkc497.jpg
[root@server ~]# ansible web -m command -a ‘creates=/data/aaa.jpg ls‘ #如果/data/aaa.jpg存在,则不执行“ls”命令
192.168.37.122 | SUCCESS | rc=0 >>
skipped, since /data/aaa.jpg exists

192.168.37.133 | SUCCESS | rc=0 >>
skipped, since /data/aaa.jpg exists
[root@server ~]# ansible web -m command -a ‘removes=/data/aaa.jpg cat /data/a‘		#如果/data/aaa.jpg存在,则执行“cat /data/a”命令
192.168.37.122 | SUCCESS | rc=0 >>
hello

192.168.37.133 | SUCCESS | rc=0 >>
hello

3) shell模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。

[root@server ~]# ansible web -m shell -a ‘cat /etc/passwd |grep "keer"‘
192.168.37.122 | SUCCESS | rc=0 >>
keer:x:10001:1000:keer:/home/keer:/bin/sh

192.168.37.133 | SUCCESS | rc=0 >>
keer:x:10001:10001::/home/keer:/bin/sh

只要是我们的shell命令,都可以通过这个模块在远程主机上运行,这里就不一一举例了。

4) copy模块

这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。
其相关选项如下:

src             #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content          #用于替换"src",可以直接指定文件的值
dest            #必选项,将源文件复制到的远程主机的绝对路径
backup           #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode     #递归设定目录的权限,默认为系统默认权限
force           #当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others             #所有的 file 模块中的选项可以在这里使用

5) file模块

6) fetch模块

7) cron模块

8) yum模块

9) service模块

10) user模块

11) group模块

12) script模块

13) setup模块









以上是关于ansible入门讲解的主要内容,如果未能解决你的问题,请参考以下文章

16 张图带你快速入门 Ansible

CentOS 7安装Ansible

ansible plugins简介

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

Ansible 学习总结—— Ansible 常用模块与 playbook 实例讲解