ansible
(一)ansible
1、ansible:是基于Python开发的配置管理和应用部署工具,在自动化运维中,现在是异军突起
2、ansible能批量配置、部署、管理上千台主机,类似于xshell的一键输入的工具,不需要每次都切换主机进行操作
3、只要一台ansible的固定主机,就可以统一所有节点的操作,不需要agent客户端,只需要一台主机上配置了ansible
4、ansible是基于模块进行工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的(copy、service)
5、ansible默认是通过ssh的密钥队实现通信(可以改)
(二)ansible的功能
1、远程操作主机功能
2、自动化运维(playbook剧本,yaml)
3、所有模块都是幂等性,ansible的幂等性决定了可以放心大胆的使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况)
①幂等性:多次操作或者多次执行对系统资源的影响是一致的,只要发现要停止的目标服务已经停止,后续同样的停止操作不会改变任何结果,什么也不做
②systemctl restart firewalld:每一次操作都会先停再启动(不是幂等性)
③http的get就是幂等性,post不是幂等性,多次执行相同的post可能创建多个相同的资源
(三)ansible的四大组件
inventory | 主机清单(主机组),定义ansible可以远程操作的服务器 |
模块 | 13个模块(常用的),通过模块可以实现远程的配置和操作 |
plugins | 插件 |
playbook | 剧本(shell脚本),yaml格式 |
(四)ansible的优缺点
1、部署较为简单,只要在控制主机部署即可,被控制主机需要有ssh和Python2.5以上版本,基本上Linux都是自带的
2、ansible只能控制Linux系统,window不行
3、基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)
(五)ansible部署
管理端 | 20.0.0.10、ansible |
被管理端 | 20.0.0.20 |
20.0.0.30 | |
备用被管理端 | 20.0.0.70 |
1、安装epel源
ansible.cfg | ansible的主配置文件,一般无需修改 |
hosts | 主机组,声明可以被控制的主机 |
roles | 公共角色目录 |
2、修改配置文件
(1)配置主机有两种方式
①直接声明主机的IP地址
②主机名(/etc/hosts做映射)
(2)配置ssh密钥登录
ssh-keygen -t rsa
sshpass -p '123' ssh-copy-id root@20.0.0.20
sshpass -p '123' ssh-copy-id root@20.0.0.30
第一次传不过去,重新执行发送密钥对
(六)ansible的模块操作
ansible的模块操作 | |||||||
模块一:command模块,在远程主机执行Linux命令,不支持管道符和重定向输出 | |||||||
ansible的命令格式 | ansible 组名/ip -m 模块名称 -a ‘参数列表(执行的命令)’ | ||||||
ansible 20.0.0.20?-m command -a 'date' | 指定IP地址,只有目标主机会执行 | ||||||
ansible?webservers?-m command -a 'date' | 指定组,组内所有声明的主机都会执行 | ||||||
ansible?all?-m command -a 'date' | 所有声明的主机都会执行 | ||||||
ansible 20.0.0.20 -a 'date' | 不加-m也就是不声明使用的模块,默认就是command模块 | ||||||
command模块的常用参数 | |||||||
chdir | 在远程主机上运行命令,提前进入目录 | ||||||
creates | 判断指定文件是否存在,如果存在,不执行后面的操作 | ||||||
removes | 判断指定的文件是否存在,如果存在,执行后续的命令 | ||||||
ansible all -m command -a 'chdir=/home ls' | |||||||
ansible all -m command -a 'creates=/opt/123 ls /opt' | |||||||
ansible 20.0.0.20 -m command -a 'remove=/opt/123 ls /opt' | |||||||
模块二:shell模块,在远程执行命令,相当于调用远程主机的shell进程,支持管道符和重定向 | |||||||
&& | 表示逻辑且,前一个命令成功,才会执行后一个命令 | ||||||
; | 表示逻辑或,前面的命令成功与否,后面的命令都会执行 | ||||||
多个命令执行 | ansible 20.0.0.20 -m shell -a ‘touch /opt/123 && echo 123 > /opt/123 && cat /opt/123’ | ||||||
给用户设置密码: ansible 20.0.0.30 -m shell -a ‘echo 123456 | passwd --stdin hyde’ | |||||||
过滤ifconfig命令中的第二行: ansible 20.0.0.20 -m shell -a "ifconfig | awk 'NR==2{print $2}'" | |||||||
过滤ifconfig命令中的ip地址: ansible 20.0.0.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d " " -f2' | |||||||
指定主机上创建一个脚本,在脚本中写入一个内容#!/bin/bash,换一行写ifconfig,然后运行这个脚本 ansible 20.0.0.30 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/hyde.sh && sh /opt/hyde.sh' | |||||||
在脚本中执行用位置变量,输入两个数,实现加法,运行结果,运行脚本 ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test.sh && sh /opt/test.sh' | |||||||
模块三:cron模块,远程主机设置定时任务 | |||||||
两种状态 | present | 表示添加(默认就是添加,可以省略) | |||||
absent | 表示移除,absent在整个ansible的语法中都表示移除的意思(删除) | ||||||
分 | minute | ||||||
时 | hour | ||||||
日 | day | ||||||
月 | month | ||||||
周 | weekday | ||||||
job | 任务执行的命令 | ||||||
name | 任务计划的名称,可以不加 多个计划任务如果不给名字,都是none,一旦删除none,全部删除(不推荐,最好指定不重复的名称) | ||||||
9月1号早上8点三十分,执行ls ?/opt,任务名:test2 ansible 20.0.0.20 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"' | |||||||
每周三下午14:30分执行ls ?/opt ansible 20.0.0.20 -m cron -a 'minute="30" hour="14" weekday="3" job="ls /opt"' | |||||||
删除定时任务 | ansible 20.0.0.20 -m cron -a 'name=None state=absent' | ||||||
模块四:user模块,用户管理模块 | |||||||
格式 | ansible 20.0.0.30 -m user -a 'name=hyde system=yes' | ||||||
user模块的常用选项 | |||||||
name | 指定用户名,必须要有 | ||||||
state | present:表示添加(默认就是添加,可以省略) | ||||||
absent:创建用户时,可以不加absent,但是删除一定要加absent | |||||||
system=yes/no | 标记用户是否是一个程序用户 | ||||||
uid | 用户的唯一标识 | ||||||
group | 用户的所在组 | ||||||
create_home=yes/no | 替换用户的家目录,不需要替换家目录,可以不写 | ||||||
password | 创建用户密码 | ||||||
comment | 用户的注释信息(可有可无) | ||||||
remove=yes/no | 当删除用户时,加上remove=yes,删除用户的家目录(相当于userdel -r),如果不需要删除家目录,可以不写 | ||||||
注意事项 | 在创建用户时,虽然声明了是一个程序用户,但是默认的登录shell如果没有额外的生命,还是默认/bin/bash,uid会按照程序用户 | ||||||
使用ansible的user模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash,如果创建的是程序用户,一定要生命system=yes,声明shell的类型shell=/sbin/nologin,也可以指定uid的方式,给用户分配一个uid | |||||||
创建用户,指定uid号和密码,以及家目录: ansible 20.0.0.30 -m user -a 'name=hyde2 uid=1012 password=123 home=/opt/test1' | |||||||
修改家目录: ansible 20.0.0.30 -m user -a 'name=hyde2 home=/home/hyde2 create_home=yes' | |||||||
删除用户、家目录: ansible 20.0.0.30 -m user -a 'name=hyde2 remove=yes state=absent' | |||||||
模块五:group模块,用户组管理模块 | |||||||
gid | 设置组的id | ||||||
name | 必须要有 | ||||||
创建用户组:ansible 20.0.0.20 -m group -a ‘name=haide gid=306 system=yes’ 创建用户,添加到已有的组里 ansible 20.0.0.20 -m user -a ‘name=haide1 uid=1202 group=haide’ | |||||||
注意:ansible不适合交互式的命名 | |||||||
删除组 | ansible 20.0.0.20 -m group -a 'name=zzz gid=310 system=yes' 删除组:ansible 20.0.0.20 -m group -a 'name=zzz state=absent' | ||||||
模块六:ping模块,测试主机之间的连通性 | |||||||
格式 | ansible all -m ping | ||||||
ansible 20.0.0.20 -m ping |
1、模块一:command模块,在远程主机执行Linux的命令,不支持管道符和重定向输出
①ansible的命令格式:ansible 组名/ip -m 模块名称 -a ‘参数列表(执行的命令)’
ansible 20.0.0.20 -m command -a 'date' | 指定IP地址,只有目标主机会执行 | |
ansible?webservers -m command -a 'date' | 指定组,组内所有声明的主机都会执行 | |
ansible?all -m command -a 'date' | 所有声明的主机都会执行 | |
ansible 20.0.0.20 -a 'date' | 不加-m也就是不声明使用的模块,默认就是command模块 | |
常用参数 | ||
chdir | 在远程主机上运行命令,提前进入目录 | |
creates | 判断指定文件是否存在,如果存在,不执行后面的操作 | |
removes | 判断指定的文件是否存在,如果存在,执行后续的命令 | |
ansible all -m command -a 'chdir=/home ls' | ||
ansible all -m command -a 'creates=/opt/123 ls /opt' | ||
ansible 20.0.0.20 -m command -a 'remove=/opt/123 ls /opt' |
2、模块二:shell模块,在远程执行命令,相当于调用远程主机的shell进程,支持管道符和重定向
&& | 表示逻辑且,前一个命令成功,才会执行后一个命令 |
; | 表示逻辑或,前面的命令成功与否,后面的命令都会执行 |
(1)在ansible当中,多个引号要做隔离
ansible 20.0.0.20 -m shell -a "ifconfig | awk 'NR==2{print $2}'"
ansible 20.0.0.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d " " -f2'
(2)多个命令执行
(3)指定主机上创建一个脚本,在脚本中写入一个内容#!/bin/bash ,换一行写ifconfig,然后运行这个脚本
ansible 20.0.0.30 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/hyde.sh && sh /opt/hyde.sh'
(4)在脚本中执行用位置变量,输入两个数,实现加法,运行结果,运行脚本
ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test.sh && sh /opt/test.sh'
3、模块三:cron模块,远程主机设置定时任务
(1)两种状态
①present,表示添加(默认就是添加,可以省略)
②absent,表示移除,absent在整个ansible的语法中都表示移除的意思(删除)
分 | minute |
时 | hour |
日 | day |
月 | month |
周 | weekday |
job | 任务执行的命令 |
name | 任务计划的名称,可以不加 |
多个计划任务如果不给名字,都是none,一旦删除none,全部删除(不推荐,最好指定不重复的名称) |
(2)9月1号早上8点三十分,执行ls ?/opt,任务名:test2
ansible 20.0.0.20 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'
(3)每周三下午14:30分执行ls ?/opt
ansible 20.0.0.20 -m cron -a 'minute="30" hour="14" weekday="3" job="ls /opt"'
(4)删除定时任务:ansible 20.0.0.20 -m cron -a 'name=None state=absent'
①多个计划任务如果不给名字,都是none,一旦删除none,全部删除(不推荐,最好指定不重复的名称)
4、模块四:user模块,用户管理模块
常用的参数 | |
name | 指定用户名,必须要有 |
state | present: |
absent:创建用户时,可以不加absent,但是删除一定要加absent | |
system=yes/no | 标记用户是否是一个程序用户 |
uid | 用户的唯一标识 |
group | 用户的所在组 |
create_home=yes/no | 替换用户的家目录,不需要替换家目录,可以不写 |
password | 创建用户密码 |
comment | 用户的注释信息(可有可无) |
remove=yes/no | 当删除用户时,加上remove=yes,删除用户的家目录(相当于userdel -r),如果不需要删除家目录,可以不写 |
(1)ansible 20.0.0.30 -m user -a 'name=hyde system=yes'
①在创建用户时,虽然声明了是一个程序用户,但是默认的登录shell如果没有额外的生命,还是默认/bin/bash,uid会按照程序用户
②使用ansible的user模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash,如果创建的是程序用户,一定要生命system=yes,声明shell的类型shell=/sbin/nologin,也可以指定uid的方式,给用户分配一个uid
(2)ansible 20.0.0.30 -m user -a 'name=hyde2 uid=1012 password=123 home=/opt/test1'
(3)修改家目录:ansible 20.0.0.30 -m user -a 'name=hyde2 home=/home/hyde2 create_home=yes'
(4)删除用户、家目录:ansible 20.0.0.30 -m user -a 'name=hyde2 remove=yes state=absent'
5、模块五:group模块,用户组管理模块
gid | 设置组的id |
name | 必须要有 |
(1)创建用户,添加到已有的组里
(2)删除组(先删组用户,再删组)
6、模块六:ping模块,测试主机之间的连通性
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!