Ansible-基础配置及常用模块

泪湿孤枕 提交于 2020-01-06 15:28:49

一、Ansible介绍

1.1、什么是ansible?

Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有saltstack 等批量管理软件.

1.2、软件特点

1)ansible不需要单独安装客户端,SSH相当于ansible客户端。

2)ansible不需要启动任何服务,仅需安装对应工具即可。

3)ansible依赖大量的python模块来实现批量管理。

4)ansible配置文件/etc/ansible/ansible.cfg

5)Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。Ansible的两个特性:

  • 模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块;
  • playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务;

1.3、架构特点

15365930348150

1)连接插件(connectior plugins) :用于连接主机 用来连接被管理端。

2)核心模块(core modules) :连接主机实现操作, 它依赖于具体的模块来做具体的事情。

3)自定义模块(custom modules): 根据自己的需求编写具体的模块。

4)插件(plugins): 完成模块功能的补充。

5)剧本(playbooks):ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。

6)主机清单(host inventory):定义ansible需要操作主机的范围。

1.4、任务执行模式

1.4.1、ad-hoc模式(点对点模式)

使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell

1.4.2、playbook模式(剧本模式)

是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件

1.5、命令执行流程

  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安装配置

2.1、ansible安装

1)yum安装

yum install epel-release -y
yum install ansible –y

2)pip安装

yum install python-pip
pip install ansible

2.2、程序结构及配置文件

2.2.1、安装目录

配置文件目录:/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/

2.2.2、配置文件:/etc/ansible/ansible.cfg

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

补充如下:

host_key_checking  
host_key_checking=False 禁用验证host_key_checking
 
inventory 
定义库文件位置,脚本,或者存放可通信主机的目录
inventory = /etc/ansible/hosts
 
library
ansible默认搜寻模块的位置
library = /usr/share/ansible
Ansible知道如何搜寻多个用冒号隔开的路径,同时也会搜索在playbook中的"./library"。
 
log_path
日志存放位置
默认不开启,ansible将会吧模块加载纪录在系统日志系统中.不包含用密码.
log_path=/var/log/ansible.log
 
module_name
这个是/usr/bin/ansible的默认模块名(-m). 默认是'command'模块。command模块不支持shell变量,管道,配额。所以最好把这个参数改为'shell'。
module_name = command
 
nocolor
默认ansible会为输出结果加上颜色,用来更好的区分状态信息和失败信息。如果你想关闭这一功能,可以把'nocolor'设置为'1'。
nocolor=0
 
nocows 
默认ansible可以调用一些cowsay的特性,使得/usr/bin/ansible-playbook运行起来更加愉快。
如果不喜欢cows,可以通通过将'nocows'设置为'1'来禁用这一选项:
nocows=0
 
poll_interval
对于Ansible中的异步任务,这个是设置定义,当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是一个折中选择15秒钟.这个时间是个回查频率和任务完成叫回频率和当任务完成时的回转频率的这种:
poll_interval=15
 
private_key_file
如果你是用pem密钥文件而不是SSH客户端或秘密啊认证的话, 你可以设置这里的默认值, 来避免每一次提醒设置密钥文件位置"--ansible-private-keyfile":
private_key_file=/path/to/file.pem
 
remote_port
这个设置是你系统默认的远程SSH端口, 如果不指定,默认为22号端口:(建议修改成别的端口)
remote_port = 22
 
remote_user
这是个ansible使用/usr/bin/ansible-playbook连接的默认用户名。注意如果不指定, /usr/bin/ansible默认使用当前用户名称:
remote_user = root
 
timeout
这个事默认SSH链接尝试超市时间:
timeout = 10
 
transport
如果"-c <transport_name>" 选项没有在使用/usr/bin/ansible 或者 /usr/bin/ansible-playbook 特指的话, 这个参数提供了默认通信机制。默认值为'smart'。
如果本地系统支持ControlPersist技术的话, 将会使用(基于OpenSSH)'ssh', 如果不支持该技术,将使用'paramiko'库,其他传输选项包括'local', 'chroot','jail'等等。
用户通常可以这个设置为'smart',让playbook在需要的条件自己选择'connectin:'参数.
 
record_host_keys
默认设置会记录并验证通过在用户hostfile中新发现的的主机(如果host key checking 被激活的话)。这个选项在有很多主机的时候将会性能很差!!
在这种情况下,建议使用SSH传输代替。当设置为False时, 性能将会提升,在hostkey checking 被禁用时候, 建议使用!!!
record_host_keys=True
 
scp_if_ssh
又是用户操控一个一个没有开启SFTP协议的远程系统.如果这个设置为True, scp将代替用来为远程主机传输文件:
scp_if_ssh=False   
如果没有遇到这样的问题没有必要来修改这个设置。当然修改这个设置也没有什么明显的弊端。大部分的系统环境都默认支持SFTP, 通常情况下不需要修改。
 
pipelining
在不通过实际文件传输的情况下执行ansible模块来使用管道特性, 从而减少执行远程模块SSH操作次数。如果开启这个设置,将显著提高性能!!
然而当使用"sudo:"操作的时候, 你必须在所有管理的主机的/etc/sudoers中禁用'requiretty'。
默认这个选项为了保证与sudoers requiretty的设置(在很多发行版中时默认的设置)的兼容性是禁用的。但是为了提高性能强烈建议开启这个设置。
pipelining=False
 
accelerate_port
在急速模式下使用的端口。
accelerate_port = 5099
 
accelerate_timeout
这个设置时用来控制从客户机获取数据的超时时间.如果在这段时间内没有数据传输,套接字连接会被关闭. 一个保持连接(keepalive)数据包通常每15秒回发回给控制台,所以这个超时时间不应该低于15秒(默认值为30秒):
accelerate_timeout = 30
 
accelerate_connect_timeout
这个设置空着套接字调用的超时时间。这个应该设置相对比较短。
这个和'accelerate_port'连接在回滚到ssh或者paramiko(受限于你默认的连接设置)连接方式之前会尝试三次开始远程加速daemon守护进程。默认设置为1.0秒!
accelerate_connect_timeout = 1.0
需要注意: 这个选项值可以设置为小于1秒钟,但是除非你拥有一个速度很快而且很可靠的网络,否则也许这样并不是一个很好的选择。
如果你使用英特网访问你的系统,最好提高这个值!!!
 
accelerate_daemon_timeout
这个控制加速daemon守护进程的超时时间,用分钟来衡量.默认为30分钟!
accelerate_daemon_timeout = 30
注意, 在1.6版本之前,daemon发起的超时时间是硬编码的.对于1.6以后的版本,超时时间是根据daemon上一次活动信息和这个可设置的选项。
 
accelerate_multi_key
如果这个选项开启,这个设置将允许多个私钥被加载到daemon。任何客户端要想连接daemon都需要开启这个选项!!!
accelerate_multi_key = yes
通过本地套接字文件连接的通过SSH上传密钥文件到目标节点的新客户端, 必须在登陆daemon时使用原始的登陆密钥登陆。

2.2.3、主机清单:/etc/ansible/hosts

/etc/ansible/hosts是ansible默认主机资产清单文件,用于定义被管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息

1)基于密码连接

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

#方式一、主机+端口+密码
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'

#方式二、主机+端口+密码
[webservers]
web[1:2].oldboy.com ansible_ssh_pass='123456'

#方式三、主机+端口+密码
[webservers]
web[1:2].oldboy.com
[webservers:vars]
ansible_ssh_pass='123456'

2)基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端

[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31

#方式一、主机+端口+密钥
[group_name]
10.0.0.31:22
10.0.0.41

#方式二、别名+主机+端口+密钥
[group_name]
nfs-node1 ansible_ssh_host=10.0.0.31 ansible_ssh_port=22

3)主机组使用方式

#方式一、主机组变量+主机+密码
[group_name1]
10.0.0.31
10.0.0.41
[group_name1:vars]
ansible_ssh_pass='123456'

#方式二、主机组变量+主机+密钥
[group_name2]
10.0.0.7
10.0.0.8

#定义多组,多组汇总整合
# webservers组包括两个子组[apache,nginx]
[webservers:children]
[group_name1]
[group_name2]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!