文章目录Ansbile详细的自动化运维理论,内容参考ansible官方文档:https://docs.ansible.com/ansible/latest/index.html
- 一、Ansible概念
- 1.Ansible是什么?
- 2.Ansible设计目标
- 3.怎么实现自动化管理的
- 4.安全性如何
- 5.官方版本更新说明
- 6.总之对于运维的介绍就是
- 二、安装Ansible
- 1.前提条件
- 2.Yum方式安装
- 2.1 执行如下命令安装ansible程序
- 三、配置管理其他机器
- 1.到所有机器做免密
- 2.地址组管理
- 2.1 概念
- 2.2 配置
- 2.3 测试
- 3.地址组进阶玩法
- 3.1给主机定义变量[name:vars]
- 3.2给主机组设置父子关系[name:children]
- 3.3地址的连续性写法
- 3.4 定义主机变量
- 四、目录结构&配置文件
- 1.目录结构
- 1.1 配置文件目录/etc/ansible/
- 1.2 ansible命令执行文件目录/usr/bin/
- 1.3 模块依赖库目录/usr/lib
- 1.4 ansible文档目录/usr/share
- 2.配置文件
- 默认路径/etc/ansible/ansible.cfg
- 五、ansible命令
- 1.ansible命令参数
- 2.ansible命令用例
- 3.ansible-doc命令参数
- 4.ansible-doc命令用例
- 六、ansible模块
- 1.ansible模块简介
- 2.常用模块使用
- 2.1 ping模块(用于测试主机和主机组的连通性)
- 2.2 cron模块(用于增删改查主机和主机组的计划任务)
- 2.3 shell模块(用于执行shell命令&运行shell脚本)
- 2.4 yum模块(用于安装yum)
- *******持续更新中,喜欢的可以点个收藏
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程序
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]命名格式,下面有具体配置
第一种写法:直接写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通测试
带参数的群组,vars底下为群组的公共变量,包括已定义的变量和自定义的变量:
[tomcat:vars] aaa=111 #给tomcat组定义个变量,aaa=1113.2给主机组设置父子关系[name:children]
children底下为父群组test的子群组
[centos7:children] tomcat nginx #将tomcat和nginx组 加入为centos7组的子组织3.3地址的连续性写法
举例(不仅ip,域名也可以):
测试(无192.168.10.53这个地址,所以失败):
对主机组中的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
- ansible命令文件/usr/bin/ansible
- Lib库依赖目录/usr/lib/pythonX.X/site-packages/ansible/
- /usr/share/my_modules/
-
Help文档目录/usr/share/doc/ansible-X.X.X/
-
Man文档目录/usr/share/man/man*
不推荐使用某个配置文件(可能版本不同有些默认配置项不同)
建议翻阅配置文件项的作用后按需添加到你的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制定模块的用法 |
列出可用的模块
ansible-doc -l
查看ping模块的详细信息
ansible-doc ping
六、ansible模块 1.ansible模块简介
- ansible模块可以理解他为ansible的参数,它只能通过ansible命令来运行,可以自己写自定义模块,官方也提供了很多常用模块
- 默认的模块现在应该至少有3000多个
- 使用ansible-doc -l 命令显示所有可用模块,可后接|grep 模块名进行检索
- 使用ansible-doc ping 可以获取yum模块使用帮助,全是英文反正我是看不懂
对主机清单中的所有主机执行ping操作
ansible all -m ping
对nginx主机组的主机进行ping操作
ansible nginx -m ping
对192.168.10.51主机进行ping操作
ansible 192.168.10.51 -m ping2.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"
我们再次手动进入其中一台机器,可以查看到已经删除掉了
| 参数 | 释义 |
|---|---|
| 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"
*******持续更新中,喜欢的可以点个收藏
有问题可以在评论区一起交流



