Ansbile详细的自动化运维理论,内容参考ansible官方文档:https://docs.ansible.com/ansible/latest/index.html
一、Ansible概念
1.Ansible是什么?
Ansible 是一种 IT 自动化工具。它可以配置系统、部署软件并协调更高级的 IT 任务,例如持续部署或零停机滚动更新。
2.Ansible设计目标
Ansible 的主要目标是简单易用。它还非常注重安全性和可靠性,具有最少的移动部件。适用于开发人员、系统管理员、发布工程师、IT 经理以及介于两者之间的每个人。Ansible 适用于管理所有环境,从具有少量实例的小型设置到具有数千个实例的企业环境。
3.怎么实现自动化管理的
通过OpenSSH协议进行传输,基于Python语言,由paramiko和PyYAML两个关键模块构建。
4.安全性如何
Ansible 以无代理的方式管理机器。从来不存在如何升级远程守护进程的问题,也不存在因为守护进程被卸载而无法管理系统的问题。由于 OpenSSH 是最受同行评审的开源组件之一,因此大大减少了安全风险。Ansible 是去中心化的——它依赖于您现有的操作系统凭据来控制对远程机器的访问。如果需要,Ansible 可以轻松连接 Kerberos、LDAP 和其他集中式身份验证管理系统。这个是官方说辞,看懂看不懂的对于非精通者来说不是很重要,知道安全性达标就ok了。
5.官方版本更新说明
Ansible 大约每年发布两次新的主要版本。核心应用程序的发展有些保守,重视语言设计和设置的简单性。贡献者开发和更改模块和插件,从 2.10 版开始,以更快的速度托管在集合中。
6.总之对于运维的介绍就是
nice!
二、安装Ansible
本文采用CentOS7操作系统安装
1.前提条件
1.1 需要确保python版本在2.6以上,执行python -V
即可查看,CentOS7一般都在2.7及以上
1.2 如果Python版本在2.6以下,请先按照下文方式升级Python版本,否则,请忽略此步骤
安装依赖
yum -y install gcc gcc-c++
下载
wget https://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz
解压
tar -zxvf Python-2.7.5.tgz
配置
./configure
编译
make
安装
make install
备份旧版本
mv /usr/bin/python /usr/bin/python_old_旧版本号
关联新版本,这步如有报错,cd到/usr/local/bin/看下phthon2.7.5的名称,有可能是python2.7
ln -s /usr/local/bin/python2.7.5 /usr/bin/python
验证
python -V
附加说明:
如需更新到其他版本,直接把上面的所有2.7.5换成对应版本即可,3.0以上的话推荐3.5.2吧。
升级到3.0以上版本需要额外执行以下命令,否则会导致Yum不可用。
sed -i '1s/$/2/' /usr/bin/yum
sed -i '1s/$/2/' /usr/libexec/urlgrabber-ext-down
2.Yum方式安装
2.1 执行如下命令安装ansible程序
#添加epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install epel-release -y
yum install ansible -y
默认日志保存路径/var/log/ansible.log
默认配置文件路径/etc/ansible/ansible.cfg
默认主机清单路径/etc/ansible/hosts
ansible是窗口化的,装完无需启动,直接配置操作即可。
yum安装就两条命令,安装完直接配置操作了,是不是很简单呢!
三、配置管理其他机器
1.到所有机器做免密
(1)部署ansible的机器执行该命令,一路回车跳板机产生秘钥文件id_rsa.pub
ssh-keygen
(2)机器少的情况下,将产生的id_rsa.pub文件逐个拷贝到其他机器
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.51
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.52
(3)机器多的情况下,批量分发id_rsa.pub文件
第一种情况(分发到192.168.10.51-192.168.10.79):
for i in `seq 51 79`;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.$i;done
第二种情况(分发到一个文件的ip地址):
for i in `cat /root/ip.txt`;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i;done
2.地址组管理
2.1 概念
地址组是ansible管理的地址组,地址组配置文件是/etc/ansible/hosts
,方便的是可以让一个地址组内的所有机器执行某个自定义的命令,比如:我设定了一个地址组为全部机器,设定了一个地址组为centos7操作系统的机器。这里我就可以通过ansible管理这些机器组:所有的centos7机器执行systemctl stop firewalld;全部机器执行mkdir /opt/backup/;等等
可以在配置文件最后添加地址组信息,地址组格式一般为2种:
其一:在配置文件里写ip、端口、用户、密码。
其二:在配置文件里写ip
ip每行写一个,可以设置地址组,地址组以[name]命名格式,下面有具体配置
2.2 配置
第一种写法:直接写ip、端口、用户名、密码。
(1)测试可以这么玩,生产环境没这么玩的
(2)因为直接配置密码的话明文存储密码信息是不安全的,,而且一般都有定期改密策略,密码方式也不方便维护一般
(3)配置秘钥的话更麻烦,不如做免密然后写ip(第二种方式)
参数 | 释义 |
---|---|
ansible_ssh_port=22 | 远程主机登录端口ssh |
ansible_ssh_user=root | 远程主机登录用户名 |
ansible_ssh_pass=Abc@123 | 远程主机登录用户名的密码 |
ansible_ssh_private_key_file=/etc/ansible/hosts | 指定管理主机群列表文件密码 |
host_key_checking=False | 跳过第一次链接检测询问是否登录的提示(YES/NO) |
第二种写法:直接写ip+配置好地址组
(1)切记需要做免密
(2)[自定义名称] 是自定义地址组名字的意思,为了方便管理,推荐多列出一些类别地址组。
我这里定义了所有机器: [alt] ,这个其实ansible有all参数也能实现清单中所有机器的
根据操作系统定义了[centos7]
根据淘宝app业务定义了[taobaoapp]
根据部署中间件定义了[nginx]和[tomcat]
2.3 测试
使用ansible ip地址 -m ping
可针对某个ip进行ping通测试
使用ansible 模块名 -m ping
可针对某个模块进行ping通测试
使用ansible all -m ping
可对文件中所有主机进行ping通测试
3.地址组进阶玩法
3.1给主机定义变量[name:vars]
带参数的群组,vars底下为群组的公共变量,包括已定义的变量和自定义的变量:
[tomcat:vars]
aaa=111
#给tomcat组定义个变量,aaa=111
3.2给主机组设置父子关系[name:children]
children底下为父群组test的子群组
[centos7:children]
tomcat
nginx
#将tomcat和nginx组 加入为centos7组的子组织
3.3地址的连续性写法
举例(不仅ip,域名也可以):
测试(无192.168.10.53这个地址,所以失败):
3.4 定义主机变量
对主机组中的192.168.10.52主机单独定义变量, 优先级高于公共变量。
vi /etc/ansible/hosts
[tomcat]
192.168.10.52 aaa=111
对主机组中的所有主机定义统一变量, 优先级低于对单独主机定义的变量。
[tomcat:vars]
aaa=222
四、目录结构&配置文件
1.目录结构
1.1 配置文件目录/etc/ansible/
- 主配置文件/etc/ansible/ansible.cfg
- 主机清单主机组文件/etc/ansible/hosts
- 角色目录/etc/ansible/roles
1.2 ansible命令执行文件目录/usr/bin/
- ansible命令文件/usr/bin/ansible
1.3 模块依赖库目录/usr/lib
- Lib库依赖目录/usr/lib/pythonX.X/site-packages/ansible/
- /usr/share/my_modules/
1.4 ansible文档目录/usr/share
-
Help文档目录/usr/share/doc/ansible-X.X.X/
-
Man文档目录/usr/share/man/man*
2.配置文件
默认路径/etc/ansible/ansible.cfg
不推荐使用某个配置文件(可能版本不同有些默认配置项不同)
建议翻阅配置文件项的作用后按需添加到你的ansible.cfg
[defaults]
#Ansible主机清单hosts文件路径,默认/etc/ansible/hosts
inventory = /etc/ansible/hosts
#ansible role存放路径,默认/etc/ansible/roles
roles_path = /etc/ansible/roles
#Ansible日志路径,默认/var/log/ansible.log
log_path = /var/log/ansible.log
#SSH连接超时时间,默认10s
timeout = 10
#ansible第一次连接客户端是是否要检查ssh密钥
host_key_checking = False
#ansible执行并发数,默认5
forks = 5
#异步执行任务时查询间隔,默认15s
poll_interval = 15
#执行ansible命令时使用的用户,默认root
sudo_user = root
#远程主机SSH端口,默认22
remote_port = 22
#ansible执行playbook时远程认证用户,默认root
remote_user = root
#关闭运行ansible时系统的提示信息,一般为提示升级
system_warnings = False
#ansible模块运行语言环境,默认C
module_lang = C
module_set_locale = False
#ansible使用模块,默认command
module_name=command
五、ansible命令
1.ansible命令参数
参数 | 释义 |
---|---|
-a | 后接命令行命令 |
-m | NAME, —module-name=NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数 |
-i PATH | —inventory=PATH 指定库存主机文件的路径,默认为/etc/ansible/hosts. |
-u Username | —user=Username 执行用户,使用这个远程用户名而不是当前用户 |
-U | —sud-user=SUDO_User sudo到哪个用户,默认为 root |
-k | —ask-pass 登录密码,提示输入SSH密码而不是假设基于密钥的验证 |
-K | —ask-sudo-pass 提示密码使用sudo |
-s | —sudo sudo运行 |
-S | —su 用 su 命令 |
-l --list | 显示所支持的所有模块 |
-s | —snippet 指定模块显示剧本片段 |
-f | —forks=NUM 并行任务数。NUM被指定为一个整数,默认是5。 #ansible testhosts -a “/sbin/reboot” -f 10 重启testhosts组的所有机器,每次重启10台 |
- - private-key=PRIVATE_KEY_FILE | 私钥路径,使用这个文件来验证连接 |
-v | —verbose 详细信息 |
all | 针对hosts 定义的所有主机执行 |
-M | —module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/ |
- -list-hosts | 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件 |
-o --one-line | 压缩输出,摘要输出.尝试一切都在一行上输出。 |
-t Directory | —tree=Directory 将内容保存在该输出目录,结果保存在一个文件中在每台主机上。 |
-B | 后台运行超时时间 |
-P | 调查后台程序时间 |
-T Seconds | —timeout=Seconds 时间,单位秒s |
-P NUM | —poll=NUM 调查背景工作每隔数秒。需要- b |
-c Connection | —connection=Connection 连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动 |
—tags=TAGS | 只执行指定标签的任务 例子:ansible-playbook test.yml –tags=copy 只执行标签为copy的那个任务 |
—list-tasks | 列出所有将被执行的任务 |
-C | —check 只是测试一下会改变什么内容,不会真正去执行;相反,试图预测一些可能发生的变化 |
- -syntax-check | 执行语法检查的剧本,但不执行它 |
-l SUBSET | –imit=SUBSET 进一步限制所选主机/组模式 –limit=192.168.0.15 只对这个ip执行 |
- -skip-tags=SKIP_TAGS | 只运行戏剧和任务不匹配这些值的标签 —skip-tags=copy_start |
-e EXTRA_VARS | —extra-vars=EXTRA_VARS 额外的变量设置为键=值或YAML / JSON |
-l --limit | 对指定的 主机/组 执行任务 —limit=192.168.0.10,192.168.0.11 或 -l 192.168.0.10,192.168.0.11 只对这个2个ip执行任务 |
ansible参数原文链接:https://blog.csdn.net/asd1992498/article/details/53884276
2.ansible命令用例
查看ansible版本
ansible --version
对主机清单中的所有主机执行ping操作(-m ping是调用ping模块)
ansible all -m ping
对nginx主机组的主机进行ping操作
ansible nginx -m ping
对192.168.10.51主机执行uptime命令(-a是使用命令行命令哦)
ansible 192.168.10.51 -a 'uptime'
对192.168.10.51主机执行df -h命令(-m command是指定command模块)
ansible 192.168.10.51 -m command -a 'df -h'
3.ansible-doc命令参数
参数 | 释义 |
---|---|
-h | 显示命令参数API文档 |
-l | 列出可用的模块 |
-M | 后接模块路径,指定模块的路径 |
-s | 显示playbook制定模块的用法 |
4.ansible-doc命令用例
列出可用的模块
ansible-doc -l
查看ping模块的详细信息
ansible-doc ping
六、ansible模块
1.ansible模块简介
- ansible模块可以理解他为ansible的参数,它只能通过
ansible
命令来运行,可以自己写自定义模块,官方也提供了很多常用模块 - 默认的模块现在应该至少有3000多个
- 使用
ansible-doc -l
命令显示所有可用模块,可后接|grep 模块名
进行检索 - 使用
ansible-doc ping
可以获取yum模块使用帮助,全是英文反正我是看不懂
2.常用模块使用
2.1 ping模块(用于测试主机和主机组的连通性)
对主机清单中的所有主机执行ping操作
ansible all -m ping
对nginx主机组的主机进行ping操作
ansible nginx -m ping
对192.168.10.51主机进行ping操作
ansible 192.168.10.51 -m ping
2.2 cron模块(用于增删改查主机和主机组的计划任务)
- cron参数
值 | 作用 |
---|---|
name | 任务计划名称 |
cron_file | 替换客户端该用户的任务计划的文件 |
minute | 分(0-59, * ,*/2) |
hour | 时(0-23, * ,*/2) |
day | 日(1-31, * ,*/2) |
month | 月(1-12, * , */2) |
weekday | 周(0-6或1-7, *) |
job | 任何计划执行的命令,state要等于present |
backup | 是否备份之前的任务计划 |
user | 新建任务计划的用户 |
state | 指定任务计划present(创建)、absent(删除) |
- 创建计划任务用例
(1)给所有主机创建计划任务名为“clear tomcat log”,每天23:50分,执行清理tomcat日志
ansible all -m cron -a "minute=50 hour=23 day=* month=* weekday=* name='clear log' job='echo a >/opt/tomcat7/logs/catalina.out'"
手动登录其中一台主机crontab -l查
看执行效果
(2)查看192.168.10.51的计划任务(这里直接使用shell模块更方便哈)
ansible 192.168.10.51 -m shell -a 'crontab -l'
(3)将所有主机刚才创建的计划任务删除
ansible all -m cron -a "name='clear log' state=absent"
我们再次手动进入其中一台机器,可以查看到已经删除掉了
2.3 shell模块(用于执行shell命令&运行shell脚本)
参数 | 释义 |
---|---|
chdir | 执行命令前,切换到该目录 |
creates | 当该文件存在时,不执行该步骤 |
executable | 使用shell环境执行脚本 |
free_from | 需要执行的脚本 |
removes | 当该文件不存在时,不执行该步骤 |
warn | 如果在ansible.cfg中存在告警,如果设定了false,不会告警此行 |
执行192.168.10.51的shell脚本
ansible 192.168.10.51 -m shell -a "/bin/sh /opt/clear_tomcat_log.sh >/dev/null 2>&1"
执行shell命令,输出所有主机的内存使用情况
ansible all -m shell -a "free -m"
2.4 yum模块(用于安装yum)
参数 | 释义 |
---|---|
name | 必选 指定安装包名 |
state | 执行命令 present installed removed latest absent ,其中installed and present等效 latest标志安装yum中最新版本,absent and removed 等效 表示删除安装包 |
disable_gpg_check | 用于禁用rmp包的公钥gpg验证,默认值no 表示不做验证 |
enablerepo | 用于指定安装软件包是临时启用的yum元 |
disablerepo | 用于指定安装软件包是临时禁止用的yum元 |
给所有主机通过yum安装wget
ansible all -m yum -a "state=installed name=wget"
给所有主机通过yum卸载wget
ansible 192.168.10.51 -m yum -a "state=removed name=wget"
*******持续更新中,喜欢的可以点个收藏
有问题可以在评论区一起交流