ansible
远程主机功能
自动化运维(playbook 剧本 yaml)
是基于python开发的配置管理应用部署工具,在自动化运维中,现在是异军突袭。
ansible能批量配置、部署、以及管理上上千台主机。类似于xshell的一件输入工具,不需要每次都切换主机进行操作
不需要agent,客户端
只需要一台主机上配置了ansible
ansibile是基于模块进行了工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的
ansible默认是通过ssh的密钥对实现通信,(可以改)
ansible的另一个特点,所有模块都是幂等性
所谓幂等性指的是多次操作或者措辞执行对系统资源的影响是一致的
只要发现要停止的目标服务已经停止,后续同样的停止操作不会改变任何结果,什么也不做。
只要结果不一样就不是幂等
get是幂等性
post不是幂等性:多次执行相同的post可能创建多个相同资源
ansible的幂等性:决定了你可以放心大胆的使用,重复执行某个任务(绝大多数情况下)
Ansible的四大组件:
1、inventory:主机清单(主机组)定义ansible可以远程操作的服务器。
2、常用的模块13个,通过模块可以实现远程的配置和操作
3、plugins插件
4、Playbook剧本(shell脚本)yaml格式
ansible的优缺点
部署较为简单,主要在控制主机部署即可,被控制主句需要由ssh和python2.5以上版本,基本上linux都是自带的
ansible只能控制linux系统,window不行
基于模块功能,可以使用任意语言开发模块(二次开发,底层架构)
环境
1、管理端:20.0.0.77 ansible
被管理端 20.0.0.14 20.0.0.15
/etc/ansible/ ├── ansible.cfg ├── hosts └── roles
ansible.cfg:ansible的主配置文件,一般无需修改
hosts:著剧组,声明可以被控制的主机
roles:公共角色目录
1、直接声明主机的ip地址
2、主机(/etc/hosts做映射)
模块1
只有command模块可以不加-m
command模块:在远程主机执行linux的命令,不支持管道符,以及重定向输出
sshpass -p '123' ssh-copy-id root@20.0.0.14
ansible的命令格式:
ansble组名 /ip -m 模块名称 -a '参数列表'
ansible 20.0.0.15 -m command -a 'date'
指定ip地址,只会在目标主机执行
ansible webservers -m command -a 'ls /opt'
指定执行组,组内所有的声明的主机都会执行
ansible all -m command -a 'ls /opt'
指定所有声明主机都会执行
ansible 20.0.0.14 -a 'ls /opt'
不加-m也就是不声明使用的模块,默认就是command模块,
commind常用参数
chdir:在远程主机上运行命令提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定的文件是否存在,如果存在,执行后续的命令
模块2:
shell模块,都在是远程主机执行命令,相当于远程主机的shell命令,支持管道符和重定向
在ansible当中,多个引号之间要做隔离
表示逻辑且,每个命令,前一个命令成功才会执行后一个命令,
ansible 20.0.0.15 -m shell -a 'touch 456 ; echo "wqb" > /opt/456 ; cat /opt/456'
指定主机上创建一个脚本在脚本当中写入一个 #!/bin/bash ifconfig 然后运行这个脚本
ansble 20.0.0.15 -m shell -a 'ech0 -e "#!/bin/bash\niifconfig" > /opt/
用ansible在shell脚本中实现加法,然后运行脚本
ansible 20.0.0.15 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho $a" > /opt/test1.sh && sh /opt/test1.sh'
表示逻辑或,前面都成与否,后面的命令都会执行
模块3 cron模块
远程给主机设置定时任务
两种状态:present 表示添加(默认就是添加,可以省略)
absent:表示移除定时任务 #ansent在整个ansible的语法中表示移除的意思(删除)
分 时 日 月 周
分=minute
时=hour
日=day
月=month
周= weekday
job:表示任务计划需要执行的命令 name:任务计划的名称,可以不加。
要求九月一号早上八点三分执行ls /opt 任务名:test2
每周三下午14点30 执行 还是ls /opt 不要任务名
多个计划任务不给名字都是None,一旦删除会全部删除(最好时一个不重复的名称)
ansible 20.0.0.14 -a 'crontab -l'
ansible 20.0.0.14 -m cron -a 'name=None state=absent' 删除
ansible 20.0.0.14 -m cron -a 'minute="30" hour="14" weekday="*/3" job="ls /opt"' 添加定时任务
模块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。 如果不需要删除家目录,可以不写
ansible 20.0.0.14 -m user -a 'name=wqb2 system=yes'
在创建用户时虽然声明了是一个程序用户,但是默认的登录shell如果没有额外声明还是默认的登录方式/bin/bash,uid会按照程序用户来指定。
在使用ansible的user模块,创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash
如创建程序用户一定要声明system=yes,声明shell的类型,shell=/sbin/nologin 也可以指定uid的方式给用户分配一个uid
模块5 group
group模块:用户组的管理模块
name必须要有
gid 设置组id
ansible不适合使用交互式命令\
模块5ping 模块
ansible all -m ping