Ansible是自动化运维工具,能实现跨主机对应用编排管理部署。
Ansible能批量配置、部署、管理上千台主机,是应用级别的跨主机编排工具。
比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起
远程操控主机功能
自动化运维(playbook剧本yaml格式)
Ansible能批量的配置、部署、管理上千台主机。类似于xshell的一键输入的工具,不需要每次都切换主机进程操作,只要有一台Ansible的固定主机,就可以实现所有节点的操作
不需要agent(客户端)的概念,只需要一台主机上配置了Ansible即可
Ansible是基于模块来进行工作的,只是提供了一种运行的架构,真正执行操作和变更的是Ansible的模块来实现的。
Ansible默认是通过ssh的密钥对实现通信。(可以改)
所谓幂等性,指的是多次操作和多次执行对系统资源的影响是一致的
systemctl stop firewalld 是幂等性
systemctl restart firewalld不是幂等性
http的get是幂等性
http的post不是幂等性
Ansible的幂等性,决定了你可以放心大胆的使用,重复执行摸个任务不会对结果产生任何影响(绝大多数情况)
部署较为简单,只要在控制主机部署即可。被控制主机需要有ssh和python2.5以上版本。基本上Linux虚拟机都能满足这两个
Ansible只能控制Linux系统,Windows不行
基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)
????????管理端:20.0.0.21 Ansible
????????被管理端:20.0.0.22、20.0.0.23
基于epel源安装
先安装 epel 源
yum install -y epel-release
yum安装ansible
yum install -y ansible
/etc/ansible/
ansible.cfg:ansible的主配置文件,一般无需修改
hosts:主机组,声明可以被控制的主机
roles:公共角色目录
修改hosts文件:
vim hosts
配置主机有两种方式:1、直接声明主机的IP地址 2、主机名(要在/etc/hosts中做映射)
主机上生成密钥对并且传给被控制主机:
ssh-keygen -t rsa
配置密钥对验证
ssh-keygen -t rsa #一路回车,使用免密登录
sshpass -p '123' ssh-copy-id root@20.0.0.22
sshpass -p '123' ssh-copy-id root@20.0.0.23
若发送密钥对不成功,先到目标主机上执行一个命令,然后再传
ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'
ansible 组名/IP地址 -m 模块名称 -a '参数列表(执行的命令)'
ansible 20.0.0.23 -m shell -a 'touch /opt/123 && echo 123 > /opt/123 && cat /opt/123'
&& 逻辑且,前一个命令成功才会执行下一个命令
ansible 20.0.0.23 -m shell -a 'touch /opt/456 ; ehco 456 > /opt/456 ; cat /opt/456'
;分号表示逻辑或,前面不管成功与否,后面的命令都会执行
ansible不适用交互式的命令
在远程主机执行Linux命令,不支持管道符,重定向输出
指定IP地址:
ansible 20.0.0.23 -m command -a 'date'
ansible 20.0.0.22 -m command -a 'date'
指定组,组内所有的声明主机都会执行:
ansible webserver -m command -a 'date'
ansible dbservers -m command -a 'date'
所有声明的主机全都执行:
ansible all -m command -a 'date'
不加-m,不声明使用的模块,默认就是command模块:
ansible 20.0.0.23 ?-a 'date'
command的一些常用参数:
chdir:在远程主机上运行命令,提前进入目录
先进home目录,然后再执行命令
ansible all -m command -a 'chdir=/opt ls'
creates:判断指定文件是否存在,若存在,不执行后续的操作
ansible all -m command -a 'creates=/opt/123 ls/opt'
removes:ansible all -m command -a 'chdir=/opt ls'
ansible 20.0.0.22 -m command -a 'removes=/opt/123 ls/opt'
在远程主机上执行命令,相当于远程主机
ansible 20.0.0.22 -m shell -a 'useradd test'
#创建用户test
ansible 20.0.0.22 -m shell -a 'echo 123456 | passwd --stdin test'
#给test用户创建密码
举个例子:将IP地址切片出来:
ansible 20.0.0.22 -m shell -a "echo $(ifconfig ens33 | awk ?'NR==2{print $2}')"
在ansible当中,多个引号之间要做隔离
创建脚本,再写入内容,最后执行
举个例子:写一个脚本
ansible 20.0.0.22 -m shell -a 'echo -e "#/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'
远程给主机设置定时任务
两种状态: present表示添加(默认就是添加,可以省略)
absent:表示移除。在ansible中absent都可以表示移除的意思(删除)
* * * * * 分时日月周
分=minute
时=hour
日=day
月=month
周=weekday
job:任务计划需要执行的命令或者脚本
name:任务计划的名称,可以不加
ansible 20.0.0.22 -m cron -a 'minute="*/5" job="ls /opt" name=test1'
举个例子:
写一个9月1号8点30分,执行ls /opt 任务名:test2
30 8 1 9 *
ansible 20.0.0.22 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'
查看定时任务:
ansible 20.0.0.22 -m command -a 'crontab -l'
删除定时任务:
ansible 20.0.0.22 -m cron -a 'name=test1 state=absent'
删除未命名的定时任务(所有的None都会删除):
多个定时任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)
ansible 20.0.0.22 -m cron -a 'name=None state=absent'
模块4:USER模块
用户管理模块
常用的参数:
name 指定用户名,必须要有
state present:创建用户,可以不加,默认
absent :删除一定要加absent
system=yes|no。标记用户使用是一个程序用户
uid:用户的唯一标识
group:指定用户的所在组
create_home=yes|no:替换用户的家目录,不替换可以不写,可省略
password:给用户创建密码
comment:添加用户的注释信息,可有可无
remove=yes|no,当删除用户时,加上remove=yes,删除用户的家目录,相当于userdel -r。如果不需要删除用户家目录,可省略这一项
ansible 20.0.0.22 -m user -a 'name=koeda system=yes '
在创建用户时,虽然我声明了是一个程序用户,但是默认的登录shell如果没有额外的声明,还是默认的/bin/bash,UID会按照程序用户来指定
创建程序用户:
ansible 20.0.0.22 -m user -a 'name=koeda1 system=yes shell=/sbin/nologin'
使用ansible的USER模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash
如果创建程序用户,一定要声明system=yes,声明shell的类型 shell=/sbin/nologin
也可以指定uid的方式,给用户分配一个uid
创建用户,选择uid,创建密码,指定家目录:
ansible 20.0.0.22 -m user -a 'name=koeda3 uid=1010 password=123456 home=/opt/test1'
更改用户家目录:
ansible 20.0.0.22 -m user -a 'name=koeda3 home=/home/koeda3 create_home=yes'
删除用户及其家目录:
ansible 20.0.0.22 -m user -a 'name=koeda remove=yes state=absent'
模块5:group模块(了解)
用户组的管理模块
gid 设置组的id
name必须要有
创建用户组:
ansible 20.0.0.22 -m group -a 'name=test1 gid=306 system=yes'
创建用户时添加到指定的组:
ansible 20.0.0.22 -m user -a 'name=test uid=1011 group=test1 '
删除用户组:
ansible 20.0.0.22 -m group -a 'name=test1 state=absent'
模块6:ping模块
ansible all -m ping