Loading... ## 前言 **运维工程师的核心职能** - 平台架构组件 - 日常运营保障 - 性能、效率优化 **运维工作** > 系统安装 --> 程序包安装、配置、服务启动 --> 批量操作 --> 程序发布 --> 监控 <div class="tip inlineBlock warning"> 程序发布的注意事项:  不能影响用户体验;  系统不能停机;  不能导致系统故障或造成系统完全不可用;  一般都是 灰度发布 程序,影响的只是一小部分的用户。 </div> **ansible的特性** - 模块化 - 基于Python语言开发,`Parmike`,`PtYAML`,`Jinja2`三个关键模块 - 部署简单,agentless(无代理) - 支持主从模式 - 支持自定义模块 - 支持Palybook(剧本) - 基于SSH(安全) - 幂等性 @> 幂等性:假设cp一个文件到/data目录下,再次执行同一条指令,ansible检测到文件,将不会进行修改。也就是允许多次执行同一条命令,但是他们结果一样。 **ansible的配置文件** /etc/ansible/ansible.cfg #主配置文件 /etc/ansible/hosts #主机清单 /etc/snsible/roles/ #角色清单,Palybook ## 一、ansible的基础使用 !> ansible基于ssh控制其他主机,需要进行密钥认证。而不是密码认证,否则每次都将输入密码。 **安装ansibe** > yum install ansible -y **基本语法** > ansible 主机 -m 模块 -a 'ages' **主控主机生成key** <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.beijixs.cn/archives/380/" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.beijixs.cn/usr/uploads/2019/10/1577530417.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">SSH基于密钥认证,免密码登陆</p> <div class="inster-summary text-muted"> 一、生成一个密钥 ~]# ssh-keygen -t rsa 一直回车即可,也可以为key加密。二、复制公钥到目标... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 把公钥复制受控主机上 **添加主机清单** > vim /etc/ansible/hosts [websrvs] 172.16.10.10 172.16.10.20 [dbsrvs] 172.16.200.52 172.16.10.10 #代表定义主机组 **主机调用方法** ~]# ansible 172.16.10.10 -m ping 表示只对`172.16.10.10`发`ping` ~]# ansible websrvs -m ping 表示只对`websrvs`中的主机发`ping` ~]# ansible 'websrvs:dbsrvs' -m ping 逻辑与,表示对两个组都发出`ping` ~]# ansible 'websrvs:&dbsrvs' -m ping 逻辑与,表示两个组中都包含的主机 ~]# ansible 'websrvs:!dbsrvs' -m ping 逻辑非,表示websrvs中有,但不能出现再dbservs中 @> 绿色结果为成功且没有对系统做修改 黄色结果为成功且做了对应的修改 红色为错误 ## 二、模块使用  默认模块是`command` ### 1. ping 测试主机连通性 ~]# ansible all -m ping #测试主机清单中所有主机的连通性 ![](https://blog.beijixs.cn/usr/uploads/2019/10/2393599404.png) ### 2. comamnd 用于批量执行命令,`-m command`可省 ~]# ansible all -a 'hostname' #获取所有主机的hostnmae 直接将命令指明 `-a 'COMMAND'` ![](https://blog.beijixs.cn/usr/uploads/2019/10/4178012217.png) **removes** 文件不存在就不进行在一步 ~]# ansible 172.16.10.10 -a 'removes=/data/file touch /data/f2' #表示file不存在就不执行touch命令 **creates** 文件不存在就进行下一步 ~]# ansible 172.16.10.10 -a 'creates=/data/file touch /data/f3' #表示/data/file不存在就执行touch **chdir** 切换至指定文件夹执行命令 ~]# ansible 172.16.10.10 -a 'chdir=/data ./test.sh' #表示再data目录执行 ./test.sh !> command模块不支持一些特殊字符,如“*”,“|”等等 ### 3. shell 同样也是用于执行命令的模块,它支持特殊字符,建议使用直接使用shell模块,同样支持command的参数。 ~]# ansible 172.16.10.10 -m shell -a 'rm -f /data/*' #该命令是comman不能实现的,因为含有"*"特殊字符 用法和`command`相似 ### 4. script 将本地脚本推送至所有主机运行 例如:在/opt下有一个脚本,`test.sh` #!/bin/bash # hostname 此时推送到所有主机运行 ~]# ansible all -m script -a '/opt/test.sh' 支持参数和`command`相似 ### 5. copy 复制文件到受控主机 backup=yes #表示原有文件备份 src=/path/to/file #本地源文件 dest=/path/to/file #存放受控主机的位置 mode=# #设置文件权限 owner=user #设置文件所有者 group=groupNAME #设置文件的属组 content="Text" #不指定本地文件,直接生成文件,这里就是定义文件的内容 例如:拷贝/data/test文件到受控主机的/tmp/下 ~]# ansible all -m copy -a 'src=/data/test dest=/tmp/test backup=yes owner=admin group=admin' #如果文件存在需要备份,属组和属主为admin 例如:创建新文件,内容为`Hello \n Hi \n`,保存在受控端的tmp目录下,名为`new` ~]# ansible all -m copy -a 'content="Hello\nHi\n" dest=/tmp/new' ### 6. fetch 抓取受控主机的文件,**缺点是一次只能抓取一个文件**。对于多个文件需要打包再抓取 src=/path/to/file #远程目标文件 dest=/path/to/file #本地存放路径 例如:抓取所有主机的`messages`文件到本地`/data`目录 ~]# ansible all -m fetch -a 'src=/var/log/messages dest=/data' ### 7. file 文件管理模块 path=/path/to/file #文件/文件夹 存放位置 mode=# #设置文件权限 owner= #文件属主 state=touch|adsent|directory|link #分别是新建,删除,建立文件夹,创建软连接 示例:所有受控主机新建文件`file-test`,其他用户不可读写 ~]# ansible all -m file -a 'path=/data/file-test state=touch mode=660' 删除文件 ~]# ansible all -m file -a 'path=/data/file-test state=absent' 新建目录 ~]# ansible all -m file -a 'path=/data/dir1 state=directory' 删除目录 ~]# ansible all -m file -a 'path=/data/dir1 state=absent' 创建软连接 ~]# ansible all -m file -a 'src=/etc/fstab dest=/data/fstab-link state=link' 删除软连接 ~]# ansible all -m file -a 'dest=/data/fstab-link state=absent' 删除一个文件夹下的全部文件 ~]# ansible all -m shell -a 'rm -f /data/*' ### 8. hostname 设置受控主机的主机名,注意这样只能一个一个设置,全部设置主机名将相同。且设置的主机名是永久有效的。 示例:设置`172.16.10.10`的主机名为`node3` ~]# ansible 172.16.10.10 -m hostname -a 'name='node3' ### 9. cron 计划任务的创建 minute= #分钟,范围0-59,*表示每分钟 hour= #小时,范围0-23, *表示每小时 day= #天,范围1-31,*表示每天 weekday= #星期,范围0-6,*表示每tian month= #月,范围1-12,*表示每个月 jod #执行任务 name #计划任务的名称 创建计划任务 ~]# ansible all -m cron -a 'mintue=* jod="/usr/bin/wall Wrning" name="Wrning"' #没分钟发出一次广播,内容为"Wrning" 禁用计划任务 ~]# ansible all -m cron -a 'disabled=yes jod="/usr/bin/wall Wrning" name="Wrning"' #jod和name必须指明,不然不能正常禁用,启用直接把yes改为no 删除计划任务 ~]# ansible all -m cron -a 'jod="/usr/bin/wall Wrning" name="Wrning" state=absent' ### 10. yum 软件包的管理(安装/卸载/升级/查看) 查看包 ~]# ansible all -m yum -a 'list=httpd' #查看是否安装httpd ~]# ansible all -m yum -a 'list=installed' #查看已经安装的包 安装包 ~]# ansible all -m yum -a 'name=vsftpd,httpd' #表示同时安装vsftpd和httpd 卸载包 ~]# ansible all -m yum -a 'name=vsftpd,httpd state=removed' #删除这两个包 安装rpm本地包 ~]# ansible all -m copy -a 'src=/data/rpm包名 dest=/tmp/rpm包名' #先将rpm包推送到受控主机 ~]# ansible all -m yum -a 'name=/tmp/rpm包名' #安装rpm包 忽略key的检查 ~]# ansible all -m yum -a 'name=/tmp/rpm包名 disable_gpg_check=yes' 更新缓存 ~]# ansible all -m yum -a 'name=dstat update_cache=yes' #只能在安装软件时进行更新 ### 11. service 服务管理(启动/停止/重载/开机自启) name= #服务名 enabled=yes|no #是否开机启动 state= started #启动 stopped #停止 restarted #重启 reloaded #重载 启动服务,允许开机启动 ~]# ansible websrvs -m service -a 'name=httpd enabled=yes state=started' #启动服务,开机自启 ### 12. user 用户管理(增/删/改) name= #用户名 shell= #指定shell home= #指定家目录 system=yes|no #是否为系统用户 uid= #指明uid groups= #附加组,多个逗号隔开 group= #主组 remove=yes #删除家目录 添加用户 ~]# ansible all -m user -a 'name=nginx shell=/sbin/nologin home=/var/nginx system=yes groups=admin,root' #添加用户nginx,指明shell,home和附加组 修改用户 ~]# ansible all -m user -a 'name=nginx shell=/sbin/nologin home=/var/nginx system=no groups=admin,root' #改为不是系统用户 删除用户 ~]# ansible all -m user -a 'name=nginx state=absent remove=yes' 同时删除家目录 ### 13. group 组管理((增/删/改)) 添加组 ~]# ansible all -m group -a 'name=admin system=yes gid=102' 添加组为系统组,名称为`admin`,gid为102 修改组 ~]# ansible all -m group -a 'name=admin system=no id=1002' 删除组 ~]# ansible all -m group -a 'name=admin state=absent ### 3. setup 显示受控端的状态信息,包括ip,架构等等 ~]# ansible websrvs -m setup ~]# ansible 172.16.10.10 -m setup -a 'filter=ansible_fqdn' #过滤,只显示fqdn(全名) ~]# ansible 172.16.10.10 -m setup -a 'filter=ansible_hostname' #过滤,只显示hostname ------------ 以上都是常用的模块 ------------ <center>END</center> 最后修改:2019 年 11 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏