ansible功能:
1、远程造作主机功能
2、自动化运维(playbook剧本 yaml)
ansible概念:是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起
ansible能批量配置、部署、管理上千台主机。类似于xshell,的一键输入的工具,不需要每次切换主机进行操作
只要有一台ansible的固定主机,就可以所有节点的操作
不需要agent,客户端。
只需要一台主机上配置了ansible
ansible是基于模块进行工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的
copy
service
ansible默认是通过ssh的密钥队实现通信(可以改,但是一般不动)
ansible的另一个特点:所有模块都是幂等性
幂等性:指的是多次操作或者多次执行对系统资源的影响是一致的
例:
systemctl stop firewalld ×n次,只要发现要停止的目标服务已经停止了,不会改变任何结果,什么也不做。所以是幂等性
systemctl start firewalld ×n次,每一次的操作都会先停再起,所以不是幂等性
http get 是幂等性
post 多次执行相同的post,可能创建多个相同的资源。所以不是幂等性
ansible的幂等性决定了你可以放心大胆的使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况)
ansible的四大组件:
1、Inventory(大写i) ?主机清单(主机组)。定义ansible可以远程操作的服务器
2、模块(13个常用的) ?通过模块可以实现远程的配置和操作
3、Plugins ?插件
4、Playbook剧本(shell脚本) ?yaml格式
ansible的优缺点:
优点:
①部署较简单。主要在控制主机部署即可,被控制主机需要有ssh和python2.5以上版本。基本linux都是自带的
②ansible只能控制linux系统,windows不行
③基于模块工作,可以使用任意语言开发模块(二次开发。底层架构)
管理端:192.168.233.10 ansible
被管理端:20
??????????30
备用: ???40
10上操作
yum -y install epel-release.noarch
yum -y install ansible
yum -y install tree
[root@10 ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles
ansible.cfg: ansible的主配置文件,一般无需修改
hosts: 主机组,声明可以被控制的主机
roles: 公共角色目录
配置主机有两种方式
1、直接声明主机的ip地址
2、主机名 (/etc/hosts做映射)
cd /etc/ansible/
vim hosts
把30下面的##删掉
ssh-keygen -t?rsa
sshpass -p?'123' ssh-copy-id root@192.168.233.20
模块1:command模块
在远程主机执行linux命令,不支持管道符,重定向输出
ansible 的命令格式:
ansible 组名/ip -m 模块名称 -a ‘参数列表(执行的命令)’
sshpass -p?'123' ssh-copy-id root@192.168.233.30
ansible 192.168.233.30 -m command -a ‘date’
sshpass -p?'123' ssh-copy-id root@192.168.233.20
ansible 192.168.233.20 -m command -a ‘date’
20上操作
tail -f /var/log/messages
ansible 192.168.233.20 -m command a 'date’
指定IP地址,只会目标主机执行
ansible webservers -m command -a ‘ls /opt’
指定组,组内所有的声明的主机都会执行
ansible all -m command -a 'ls /opt’
所有声明的主机都会执行
ansible 192.168.233.20 -a ‘ls /opt’
不加-m也就是不声明使用的模块,默认就是command模块
command常用参数:
1、chdir ?在远程主机上运行命令,提前进入目录
2、creates ?判断指定的文件是否存在,如果存在,不指定后面的操作
3、removes ?判断指定的文件是否存在,如果存在,执行后续的命令
模块2:shell模块
shell模块,在远程主机执行命令,相当于调用远程主机的shell禁止,支持管道符和重定向。在Ansible当中,多个引号之间要做隔离
ansible 192.168.233.30 -m shell -a touch /opt/123 && echo 456 > /opt/123 && s /opt && cat /opt/123'
&&表示逻辑且,前一个命令成功才会执行后一个命令。
ansible 192.168.233.30 -m shell -a 'touch /opt/123 ; echo 456 > /opt/123 ; s /opt ; cat /opt/123'
;表示逻辑或,前面都成功与否,后面的命令都会执行。
将192.168.233.20的ens33提取出来:
ansible 192.168.233.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}")| cut -d " " -f2'
ansible 192.168.233.20 -m shell -a "echo $(ifconfig ens33 | awk 'NR==2{print $2}')"
&&符
ansible 192.168.233.30 -m shell -a 'touch /opt/123 && echo 456 > /opt/123 && ls /opt && cat /opt/123'
;符
ansible 192.168.233.30 -m shell -a 'touch 456 ; echo "520" > /opt/456 ; cat /opt/456'
ansible 192.168.233.20 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/a.sh && sh /opt/a.sh'
在脚本中执行用位置变量,实现加法,然后运行脚本
ansible 192.168.233.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test1.sh && sh /opt/test1.sh'
模块3:cron模块 ?远程设置定时任务
两种状态:present表示添加(默认就是添加,可以省略);absent表示移除(整个ansible语法中,都表示移除的意思(删除))
分 时 日 月 周
分=minute
时=hour
日=day
月=month
周=weekday
job:任务计划需要执行的命令或脚本(必须要有)
name:计划任务的名称(可以不加)
多个计划任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)
模块4:user模块 ?用户管理模块
常用的参数:
name:指定用户名(必须要有)
state:present ?absent
system=yes/no ?标记用户是否是一个程序用户
uid ?用户的唯一标识
group ?用户的所在组
create_home=yes/no ?替换用户的家目录,不需要替换用户的家目录可以不写
password ?创建用户的密码
command ?用户的注释信息(可有可无)
remove=yes/no ?当删除用户时,加上remove=yes,删除用户的家目录,相当于userdel -r。如果不需要删除家目录,可以不写
ansible 192.168.233.20 -m user -a 'name=i system=yes’
在创建用户时,虽然声明了是一个程序用户,但是默认的登录shell如果没有额外的声明,还是默认的/bin/bash,UID会按照程序用户来指定
使用ansible的user模块创建用户时,如果创建普通用户,可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash
如果创建的是程序用户,一定要声明system=yes,声明shell的类型shell=/sbin/nologin
也可以指定uid的方式给用户分配一个uid
模块5:group模块 ?用户组的管理模块
gid ?设置组的id
name ?必须要有
ansible不适用交互式的命令
模块6:ping模块 ?检测主机的