新站提交
  • 网站:49052
  • 待审:1013
  • 文章:97407
  • 会员:113

ansible 简介

ansible 是什么?

  ansible是新呈现的自动化运维东西,依据Python开发,调集了众多运维东西(puppet、chef、func、fabric)的长处,完结了批量体系装备、批量程序布置、批量运转指令等功用。
  ansible是依据 paramiko 开发的,而且依据模块化作业,自身没有批量布置的才能。真实具有批量布置的是ansible所运转的模块,ansible仅仅供给一种结构。ansible不需求在长途主机上装置client/agents,由于它们是依据ssh来和远
程主机通讯的。ansible现在现已现已被红帽官方收买,是自动化运维东西中咱们认可度最高的,而且上手简略,学习简略。是每位运维工程师有必要把握的技术之一。

ansible 特色

  1. 布置简略,只需在主控端布置Ansible环境,被控端无需做任何操作;
  2. 默许运用SSH协议对设备进行办理;
  3. 有许多惯例运维操作模块,可完结日常绝大部分操作;
  4. 装备简略、功用强壮、扩展性强;
  5. 支撑API及自界说模块,可经过Python轻松扩展;
  6. 经过Playbooks来定制强壮的装备、状况办理;
  7. 轻量级,无需在客户端装置agent,更新时,只需在操作机上进行一次更新即可;
  8. 供给一个功用强壮、操作性强的Web办理界面和REST API接口——AWX渠道。

ansible 架构图

  

上图中咱们看到的首要模块如下:

Ansible:Ansible中心程序。
HostInventory:记载由Ansible办理的主机信息,包括端口、暗码、ip等。
Playbooks:“剧本”YAML格局文件,多个使命界说在一个文件中,界说主机需求调用哪些模块来完结的功用。
CoreModules:中心模块,首要操作是经过调用中心模块来完结办理使命。
CustomModules:自界说模块,完结中心模块无法完结的功用,支撑多种语言。
ConnectionPlugins:衔接插件,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 指令履行进程

  1. 加载自己的装备文件,默许/etc/ansible/ansible.cfg;
  2. 查找对应的主机装备文件,找到要履行的主机或许组;
  3. 加载自己对应的模块文件,如 command;
  4. 经过ansible将模块或指令生成对应的暂时py文件(python脚本), 并将该文件传输至长途服务器;
  5. 对应履行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 履行权限;
  7. 履行并回来成果;
  8. 删去暂时py文件,sleep 0退出;

ansible 装备详解

ansible 装置方法

  ansible装置常用两种方法,yum装置pip程序装置。下面咱们来详细介绍一下这两种装置方法。

运用 pip(python的包办理模块)装置

  首要,咱们需求装置一个python-pip包,装置完结今后,则直接运用pip指令来装置咱们的包,详细操作进程如下:

yum install python-pip
	pip 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与咱们其他的服务在这一点上有很大不同,这儿的装备文件查找是从多个当地找的,次序如下:

检查环境变量ANSIBLE_CONFIG指向的途径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);~/.ansible.cfg,检查当时目录下的ansible.cfg装备文件;/etc/ansible.cfg检查etc目录的装备文件。

ansible装备文件

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

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日志的文件(默许不记载日志)

ansuble主机清单

  在装备文件中,咱们提到了资源清单,这个清单便是咱们的主机清单,里边保存的是一些 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

  那么就证明咱们需求装置一个包:

yum -y install openssh-clientsansible

  把包装置上即可。

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 模块中的选项能够在这儿运用

用法举例如下:
① 仿制文件:

[root@server ~]# ansible web -m copy -a 'src=~/hello dest=/data/hello' 
192.168.37.122 | SUCCESS => {
    "changed": true, 
    "checksum": "22596363b3de40b06f981fb85d82312e8c0ed511", 
    "dest": "/data/hello", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "6f5902ac237024bdd0c176cb93063dc4", 
    "mode": "0644", 
    "owner": "root", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1512437093.55-228281064292921/source", 
    "state": "file", 
    "uid": 0
}
192.168.37.133 | SUCCESS => {
    "changed": true, 
    "checksum": "22596363b3de40b06f981fb85d82312e8c0ed511", 
    "dest": "/data/hello", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "6f5902ac237024bdd0c176cb93063dc4", 
    "mode": "0644", 
    "owner": "root", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1512437093.74-44694985235189/source", 
    "state": "file", 
    "uid": 0
}

② 给定内容生成文件,并拟定权限

[root@server ~]# ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666'
192.168.37.122 | SUCCESS => {
    "changed": true, 
    "checksum": "0421570938940ea784f9d8598dab87f07685b968", 
    "dest": "/data/name", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "497fa8386590a5fc89090725b07f175c", 
    "mode": "0666", 
    "owner": "root", 
    "size": 10, 
    "src": "/root/.ansible/tmp/ansible-tmp-1512437327.37-199512601767687/source", 
    "state": "file", 
    "uid": 0
}
192.168.37.133 | SUCCESS => {
    "changed": true, 
    "checksum": "0421570938940ea784f9d8598dab87f07685b968", 
    "dest": "/data/name", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "497fa8386590a5fc89090725b07f175c", 
    "mode": "0666", 
    "owner": "root", 
    "size": 10, 
	    "src": "/root/.ansible/tmp/ansible-tmp-1512437327.55-218104039503110/source", 
    "state": "file", 
    "uid": 0
}

  咱们现在能够去检查一下咱们生成的文件及其权限:

[root@server ~]# ansible web -m shell -a 'ls -l /data/'
192.168.37.122 | SUCCESS | rc=0 >>
total 28
-rw-rw-rw-   1 root root   12 Dec  6 09:45 name

192.168.37.133 | SUCCESS | rc=0 >>
total 40
-rw-rw-rw- 1 root     root       12 Dec  5 09:45 name

  能够看出咱们的name文件现已生成,而且权限为666。
③ 关于掩盖
  咱们把文件的内容修正一下,然后挑选掩盖备份:

[root@server ~]# ansible web -m copy -a 'content="I am keerya\n" backup=yes dest=/data/name mode=666'
192.168.37.122 | SUCCESS => {
    "backup_file": "/data/name.4394.2017-12-06@09:46:25~", 
    "changed": true, 
    "checksum": "064a68908ab9971ee85dbc08ea038387598e3778", 
    "dest": "/data/name", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "8ca7c11385856155af52e560f608891c", 
    "mode": "0666", 
    "owner": "root", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1512438383.78-228128616784888/source", 
    "state": "file", 
    "uid": 0
}
192.168.37.133 | SUCCESS => {
    "backup_file": "/data/name.5962.2017-12-05@09:46:24~", 
    "changed": true, 
    "checksum": "064a68908ab9971ee85dbc08ea038387598e3778", 
    "dest": "/data/name", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "8ca7c11385856155af52e560f608891c", 
    "mode": "0666", 
    "owner": "root", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1512438384.0-170718946740009/source", 
    "state": "file", 
    "uid": 0
}

  现在咱们能够去检查一下:

[root@server ~]# ansible web -m shell -a 'ls -l /data/'
192.168.37.122 | SUCCESS | rc=0 >>
total 28
-rw-rw-rw-   1 root root   12 Dec  6 09:46 name
-rw-rw-rw-   1 root root   10 Dec  6 09:45 name.4394.2017-12-06@09:46:25~

192.168.37.133 | SUCCESS | rc=0 >>
total 40
-rw-rw-rw- 1 root     root       12 Dec  5 09:46 name
-rw-rw-rw- 1 root     root       10 Dec  5 09:45 name.5962.2017-12-05@09:46:24~

  能够看出,咱们的源文件现已被备份,咱们还能够检查一下name文件的内容:

[root@server ~]# ansible web -m shell -a 'cat /data/name'
192.168.37.122 | SUCCESS | rc=0 >>
I am keerya

192.168.37.133 | SUCCESS | rc=0 >>
I am keerya

  证明,这正是咱们新导入的文件的内容。

5)file 模块

  该模块首要用于设置文件的特点,比方创立文件、创立链接文件、删去文件等。
  下面是一些常见的指令:

force  #需求在两种状况下强制创立软链接,一种是源文件不存在,但之后会树立的状况下;另一种是方针软链接已存在,需求先撤销之前的软链,然后创立新的软链,有两个选项:yes|no
group  #界说文件/目录的属组。后边能够加上mode:界说文件/目录的权限
owner  #界说文件/目录的属主。后边有必要跟上path:界说文件/目录的途径
recurse  #递归设置文件的特点,只对目录有用,后边跟上src:被链接的源文件途径,只应用于state=link的状况
dest  #被链接到的途径,只应用于state=link的状况
state  #状况,有以下选项:

directory:假如目录不存在,就创立目录
file:即便文件不存在,也不会被创立
<

  • 49052

    网站

  • 0

    小程序

  • 97407

    文章

  • 113

    会员

赶快注册账号,推广您的网站吧!