ansible的作用
-
远程操作主机功能
-
自动化运维(playbook剧本基于yaml格式书写)
ansible是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起
ansible能够批量配置、部署、管理上千台主机。类似于Xshell的一键输入工具。不需要每次都切换主机操作。只要有一台ansible主机,就可以对所有节点操作
ansible不需要agent,客户端。只需要一台主机配置了ansible即可。
ansible基于模块进行工作,只是提供了一种运行的架构。执行操作和辩证的是ansible的模块来实现的。例如:copy模块、service模块
ansible默认是通过ssh的密钥队实现通信(可以自定义,但是一般不更改)
Ansible的特点:所有模块都是幂等性。
所谓幂等性指的是多次操作或者多次执行对系统资源的影响是一致的。
例如:
systemctl stop firewalld之后再执行一次这个命令。只要发现要停止的目标服务已经停止了,后续同样的停止操作,不会改变任何结果。
但是systemctl restart firewalld这样的命令每一次操作都会先停止再启动。所以它不属于幂等性。
http的get这样的命令也属于幂等性
post不属于幂等性。即便多次执行相同的post可以创建多个相同的资源。虽然数据相同,但是也创建了不同的资源。
ansible的幂等性决定了可以重复执行某个任务,绝大多数情况下不会对结果产生任何影响(不绝对)
Ansible的四大组件
1、 lnventory主机清单:又叫主机组。定义ansible可以远程操作的服务器。可以理解为声明哪些机器是ansible可以操作的。
2、 模块:常用的模块有13个。通过这些模块可以实现远程的配置和操作。
3、 Plugins插件
4、 Playbook剧本:可以理解为shell脚本。但是格式是yaml格式。
Ansible的优缺点
优点:
1、 部署很简单,主要在控制主机部署即可。被控制的主机需要有ssh和python2.5以上版本。基本上Linux都是自带的。
2、 ansible只能控制Linux系统,无法控制Windows系统。是专门为Linux系统打造的。
3、基于模块工作。可以使用任意语言开发模块(二次开发,底层架构)
ansible的命令格式
语法:
ansible 组名/ip -m 模块名称 -a '参数列表(执行的命令)'
ansible的模块
1、 command模块
在远程主机上执行Linux的命令,不支持管道符,重定向输出。只能在目标主机上执行一般的Linux命令
ansible 20.0.0.20 -m command -a 'date'
#测试是否可以运行
ansible webservers -m command -a 'ls /opt'
#webservers:针对组。这个组内所有的主机都会执行这个命令
ansible all -m command -a 'ls /opt'
#all:表示所有组内所有主机都会执行这个命令
如果不加-m也就是不声明使用的模块。那么默认就是使用command模块只能执行一般的命令。不支持管道和重定向
ansible 20.0.0.20 -a 'date'
#只能执行一般的命令。不支持管道和重定向
2、 shell模块
在远程主机执行命令,相当于在执行shell命令,支持管道符和重定向
ansible 20.0.0.20 -m shell -a 'useradd test'
#远程创建用户
ansible 20.0.0.20 -m command -a 'cat /etc/password'
ansible 20.0.0.20 -m shell -a 'echo 123456 | passwd --stdin test'
#给test用户创建密码
ansible 20.0.0.20 -m shell -a "echo $(ifconfig ens33 | awk 'NR==2{print $2}')"
ansible无法执行交互的命令
在Ansible当中多个引号之间要做隔离
ansible 20.0.0.30 -m shell -a 'touch /opt/123 && echo 123 > /opt/123 && ls /opt/ && cat /opt/123'
多个命令可以使用&&连接在一起只限于shell模块
这里&&表示逻辑且:前一个命令执行成功才会执行后一个命令
ansible 20.0.0.30 -m shell -a 'touch 456 ; echo zyg > /opt/456 ; cat /opt/456'
这里;表示逻辑或:前一个命令执行成功与否,后面的命令都会执行。
3、 cron模块
远程给主机设置定时任务
两种状态:
present:表示添加(默认就是添加,可以省略)
absent:表示移除。absent在整个ansible的语法中都表示移除
分:minute
时:hour
日:day
月:mounth
周:weekday
job:任务执行的命令
name:任务计划的名称
ansible 20.0.0.20 -m cron -a 'minute="*/5" job="ls /opt/" name="test1"'
ansible 20.0.0.20 -a 'crontab -l'
远程删除定时任务
ansible 20.0.0.20 -a 'crontab -l'
ansible 20.0.0.20 -m cron -a 'name="test1" state=absent'
#state=absent:声明状态为删除
ansible 20.0.0.20 -a 'crontab -l'
ansible 20.0.0.20 -m cron -a 'name="None" state=absent'
#如果名字是None直接删除None
#如果有多个None会都被删除
多个计划任务,如果不给名字都是None,一旦删除None,会全部删除。所以不删除(最好是指定一个不重复的名字)
4、 user模块
用户管理模块
常见参数:
name:指定用户名,必须要有
两种模式state:present absent
创建用户可以不加present,但是删除一定要加absent
system=yes | no:标记用户是否是一个程序用户。如果是yes表示是程序用户
还需要使用shell=yes声明程序用户使用的shell
uid:用户的唯一标识
group:用户的所在组
create_home=yes | no:替换用户的家目录。yes表示替换。如果不需要替换用户家目录可以不写
password:创建用户的密码
comment:用户的注释信息。可有可无
remove=yes | no:当删除用户时,加上rmove=yes表示删除用户的家目录。可以理解为userdel -r 如果不需要删除家目录,可以不写。
ansible 20.0.0.20 -m user -a 'name=zygg system=yes'
ansible 20.0.0.20 -a "cat /etc/passwd"
在创建用户时虽然声明了是一个程序用户,但是默认的登录shell如果没有额外声明,还是默认的/bin/bash。但是uid会按照程序用户指定。
ansible 20.0.0.20 -m user -a 'name=zygg1 shell=/sbin/nologin'
#声明用户的shell
使用ansible的user模块创建用户时,如果创建普通用户,可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash。如果创建的是程序用户,一定要声明system=yes同时声明shell的类型shell=/sbin/nologin。
也可以指定uid的方式给用户分配一个uid
ansible 20.0.0.20 -m user 'name=zygg2 uid=1010 password="123456" home=/opt/test1'
ansible 20.0.0.20 -a 'cat /etc/passwd'
ansible 20.0.0.20 -m user -a 'name=zygg2 home=/home/zygg2 create_home=yes'
#home=/home/zygg2:声明跟新后家目录的位置
#create_home=yes:表示需要更改
删除指定用户
ansible 20.0.0.20 -m user -a 'name=zygg2 remove=yes state=absent'
#声明删除用户且一并删除家目录可以理解为userdel -r
5、 group模块
用户组管理模块
name:指定名称必须要有
gid:设置组id
ansible 20.0.0.30 -m group -a 'name=zyg gid=306 system=yes'
#创建一个组而不是用户
ansible 20.0.0.30 -a 'cat /etc/group'
添加用户时候指定组
ansible 20.0.0.30 -m user -a 'name=zygg uid=1011 group=zyg'
#创建用户并指定组
ansible 20.0.0.30 -a 'cat /etc/passwd'
5、 ping模块
检测主机的连通性
ping
6、 ping模块
远程测试主机的连通性
ping
ansible 20.0.0.20 -m ping
只有在ansible主机内的/etc/ansible/hosts声明过的主机,ansible的服务端才可以远程操作
7、 hostname模块
设定管理远程主机的主机名
ansible 20.0.0.30 -m hostname -a 'name=test3'
8、 copy模块
用于复制指定的主机文件到远程主机的命令
常用的参数:
dest:指出要复制的文件在哪。必须使用绝对路径。如果源目标是目录那么指目标也得是目录。如果目标文件存在会覆盖原有内容
src:复制文件的源。最好使用绝对路径。源目标是目录,那么指目标也得是目录。
owner:指出文件的所有者
group:指定文件的所在组
content:从主机复制指定的内容到目标主机。使用了content就不能使用src了。作用相当于替代了src
mode:指定复制之后的文件权限
ansible 20.0.0.20 -m copy -a 'src=/opt/123 dest=/opt/123.txt owner=zyg mode=655'
#src=/opt/123:原文件
#dest=/opt/123.txt:目标文件
#owner=zyg:所有者
#mode=655:文件权限
复制目录时,还是复制完整的目录,即目录当中不能为空。目录内最终要有一个文件
ansible 20.0.0.20 -m copy -a 'content="hello world" dest=/opt/hello.txt'
#指定内容复制,使用content。可以理解为echo命令
#使用了content就不需要使用src了
ansible 20.0.0.30 -a 'mv /opt/hello.txt /opt/zyg.txt'
#mv使用command模块即可实现
9、 file模块
管理文件属性,属于文件模块,跟目录无关
owner:所有者
group:所在组
mode:权限
state=link:创建连接文件
state=touch:创建文件
state=absent:删除文件
path:声明文件路径
ansible 20.0.0.30 -m file -a 'path=/opt/zyg.txt state=touch'
#path=/opt/zyg.txt:声明客户机的路径和文件名称
#state=touch:类型为创建文件
ansible 20.0.0.30 -m file -a 'owner=zyg group=zyg1 mode=777 path=/opt/zyg.txt'
设置连接文件
ansible 20.0.0.30 -m file -a 'path=/opt/ky32.link src=/opt/ky32.txt state=link'
远程删除文件
ansible 20.0.0.30 -m file -a 'path=/opt/fstab.link state=absent'
10、yum模块
在远程主机上安装、卸载软件包
ansible 20.0.0.20 -m yum -a 'name=httpd'
在目标主机上的操作都是后台运行,不影响其他用户使用
远程卸载软件包
ansible 20.0.0.20 -m yum -a 'name=tree state=absent'
远程开启服务
11、 service/systemd模块
name:设定管理服务的名称
state=started | stopped | restarted:启动、停止和重启。三种管理动作
enabled=true:是否设置开机自启。如果不加默认就是不自动启动
runlevel:配合enabled的。如果设置开机自启,可以设置运行级别。在命令行设置,但是不生效,一般不在命令行操作
ansible 20.0.0.20 -m service -a 'enabled=true name=httpd state=restarted'
安装nginx服务,设置为开机自启,设置访问页面this is nignx
ansible 20.0.0.20 -m shell -a 'echo "this is nginx" > /usr/local/nginx/html/index.html'
#设置nginx服务的页面
ansible 20.0.0.20 -m service -a 'enabled=true name=nginx state=restarted'
#启动nginx服务并设置为开机自启
ansible 20.0.0.20 -a 'curl 20.0.0.20'
#终端访问测试一下
12、 script模块
运行本地脚本,然后把结果输出到i目标主机
vim test1.sh
echo "hello world" > /opt/test2.txt
chmod 777 test1.sh
ansible all -m script -a 'test1.sh'
ansible all -a 'cat test2.txt'
13、 setup模块
setup查看目标主机的环境系统(facts),目标节点的系统信息。
*:表示所有
filter:用于过滤。查看IP地址
ansible 20.0.0.20 -m setup
ansible all -m setup -a 'filter=*ipv4'
ansible all -m setup -a 'filter=model'
ansible all -m setup -a 'filter=ansible_mem*'
#过滤查找包含内存的信息
ansible all -m setup -a 'filter=ansible_proc*'
#过滤查找包含内核的信息
ansible all -m setup -a 'filter=*os*'
#过滤查找os信息底层信息
ansible all -m setup -a 'filter=*system*'
#过滤查找系统信息
ansible all -m setup -a 'filter=*dev*'
#过滤查找查看硬盘
管理主机清单
快速声明多个主机
vim /etc/ansible/hosts
20.0.0.6[1:3]
#声明主机范围。表示声明20.0.0.61-63主机
取消密钥队免密登录
ansible_host:声明连接时的IP地址
ansible_port:声明对方的连接端口。默认是ssh的默认端口
ansible_user:指定连接时使用对方主机的用户名。不指定表示主机执行ansible的用户即为使用目标主机的用户名
ansible_password:指定连接ssh时的密码。这里是目标主机的用户密码
ansible_become:提升用户权限。也可以改变用户的身份
例如:ansible_become root。需要声明用户的密码
ansible_become-password:指定切换用户的密码。基于免密钥登录实现。
vim /etc/ansible/hosts
#声明主机清单管理组当中的变量名
20.0.0.40 ansible_port=22 ansible_user=root ansible_password=123
vim /etc/ansible/ansible.cfg
---71行取消注释---
host_key_checking = False
#表示取消ssh的密钥队验证
ansible 20.0.0.40 -m ping
声明组变量
[webservers:vars]
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22
声明所有的主机都是用相同的用户名密码和端口
[all:vars1]
ansible_user=root
#所有主机用户都是root
ansible_password=123
#所有主机密码都是123
ansible_port=22
#所有主机端口都是22
实现组之间的嵌套
声明一个组可以放入多个组
vim /etc/ansible/hosts
[webs:children]
#:children:变量名称可以自定义,但是不能重复
dbservers
webservers
#表示这两个组都在wes这个组里面
ansible webs -m ping
Ansible部署
实验准备
管理端:20.0.0.10 ansible
被管理端1:20.0.0.20
被管理端2:20.0.0.30
被管理端(备用):20.0.0.40
yum -y install epel-release
#安装ansible必须安装epel源
yum -y install ansible
#安装ansible主程序
cd /etc/ansible
ansible.cfg
#ansible的配置文件。一般无需修改
hosts
#主机组。声明可以被控制的主机
roles
#公共角色目录
vim /etc/ansible/hosts
配置主机有两种方式:
1.直接声明主机的IP地址
2.声明主机名。需要提前在/etc/hosts/里做映射
cd /opt/
ssh-keygen -t rsa
#创建密钥队
ansible 20.0.0.20 -m command -a 'date'
ansible 20.0.0.30 -m command -a 'date'
#先运行ansible的命令
sshpass -p '123' ssh-copy-id root@20.0.0.20
sshpass -p '123' ssh-copy-id root@20.0.0.30
#再将密钥队传给20和30
ansible 20.0.0.20 -m command -a 'date'
#测试是否可以运行
tail -f /var/log/messages
#可以查看记录
ansible webservers -m command -a 'ls /opt'
#webservers:针对组。这个组内所有的主机都会执行这个命令
ansible all -m command -a 'ls /opt'
#all:表示所有组内所有主机都会执行这个命令
配置主机有两种方式:
1、 直接声明主机的IP地址
2、 声明主机名。需要提前在/etc/hosts/里做映射
需要先使用ansible 20.0.0.20 -m command -a 'date'命令建立连接再将密钥队传给备用主机
会执行但是不会显示只能在本地日志查看到
ansible的常用参数
chdir:在远程主机上运行命令,提前进入目录
ansible all -m command -a 'chdir=/home ls'
#表示所有主机先进入home目录在执行ls这个命令
creates:判断指定文件是否存在,如果存在,不执行后续操作
ansible all -m command -a 'creates=/opt/123 ls /opt/'
removes:判断指定文件是否存在,如果存在,执行后续操作
ansible all -m command -a 'removes=/opt/123 ls /opt/'
总结
1、 command模块:只能执行基础命令操作,不支持管道符和重定向。只有command模块可以不加-m
2、 shell模块:支持管道符和重定向,多个命令可以写在一起
&&:逻辑且。前一个命令执行成功才能只能下一个命令
;:逻辑或。前一个命令执行失败,也可以执行下一个命令
3、 cron模块:远程给主机设置定时任务
4、user模块:添加用户
5、 group模块:添加组
6、 ping模块
7、 hostname模块
8、 copy模块
9、 file模块
10、 yum模块
11、 service/systemd模块
12、 script模块
13、 setup模块
管理主机清单