[自动化运维工具]ansible简单介绍和常用模块

 ansible 源操作主机功能 自动化运维(playbook剧本yaml)

是基于python开发的一个配置管理和应用部署工具,在自动化运维中,现在还是异军突起

ansible能批量配置,部署,管理上千台主机,类似于xshell的一键输入工具,不需要每次都切换主机进行操作,只要有一台ansible的固定主机,就可以所有节点的操作,他是不需要agent(客户端),只需要一台主机上配置了ansible

Ansible是基于模块进行工作,他只是提供了一种运行的架构,真正执行和变更的是ansible的模块来实现的,如copy模块,service模块

 ansible如何实现通信的

Ansible默认是通过ssh的密钥队实现通信(可以改,但一般不动)

Anible的另一个特点,所有模块都是幂等性

所谓幂等性,指的是多次操作或者多次执行对系统资源的影响是一致的,举例:如关闭防火墙,只要发现要停止的目标服务已经停止,后续同样的停止操作,不会改变任何结果,也就是什么也不做。

举例:重启防火墙,这不是幂等性,每一次操作都会先停再启动。

举例:http 的get 是幂等性

举例:Post多次执行相同的post可能创建多个相同的资源

Ansible的幂等性决定了你可以放心大胆的使用,重复执行某个人物,不会对结果产生任何影响(绝大多数情况)

Ansible的四大组件

1lnventory主机清单(主机组)定义ansible可以远程操控的服务器
2模块,ansible常用的有13个模块,通过模块可以实现远程的配置和操作
3plugins插件
4playbook剧本(shell脚本)是yaml格式

ansible的优点

部署较为简单,只需要控制主机部署即可,被控制主机需要有ssh和python(2.5以上版本),基本上linux都是自带的

Ansible只能控制linux系统,widows不行

基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)

实验环境

1.管理端:192.168.233.11     ansible

2.被管理端:192.168.233.12/13

安装ansible

[root@docker1 ~]# systemctl stop firewalld.service
[root@docker1 ~]# setenforce 0
[root@docker1 ~]# yum -y install epel-release.noarch
[root@docker1 ~]# yum -y install ansible
[root@docker1 ~]# yum -y install tree
[root@docker1 ~]# cd /etc/ansible/
[root@docker1 ansible]# ls
ansible.cfg  hosts  roles
[root@docker1 ansible]# vim hosts
#20取消注释 [webservers] 
#21添加 192.168.233.12
#34取消注释 [dbservers]
#35添加 192.168.233.13
[root@docker1 ansible]# ssh-keygen -t rsa
#配置秘钥队
[root@docker1 ansible]# sshpass -p '123' ssh-copy-id root@192.168.233.13
[root@docker1 ansible]# ansible 192.168.233.13 -m command -a 'date'
[root@docker1 ansible]# sshpass -p '123' ssh-copy-id root@192.168.233.12
[root@docker1 ansible]# ansible 192.168.233.12 -m command -a 'date'
192.168.233.12 | CHANGED | rc=0 >>
2023年 12月 18日 星期一 17:26:47 CST
#可以指定ip地址主机
[root@docker1 ansible]# ansible webservers -m command -a 'date'
192.168.233.12 | CHANGED | rc=0 >>
2023年 12月 18日 星期一 17:29:45 CST
#也可以指定整个主机组
[root@docker1 ansible]# ansible all -m command -a 'date'
192.168.233.12 | CHANGED | rc=0 >>
2023年 12月 18日 星期一 17:29:52 CST
192.168.233.13 | CHANGED | rc=0 >>
2023年 12月 18日 星期一 17:29:52 CST
#指定所有主机

command模块

在远程执行linux的命令,不支持管道符,重定向输出。
[root@docker1 ansible]# ansible 192.168.233.12 -a 'ls /opt'
#不加-m也就是不声明使用的模块,默认就是command模块

常用参数
chdir:在远程主机上运行命令,提前进入目录
creates:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作

[root@docker1 ansible]# ansible all -m command -a 'chdir=/home ls'
192.168.233.12 | CHANGED | rc=0 >>
chen

[root@docker1 ansible]# ansible all -m command -a 'creates=/opt/123 ls /opt'
192.168.233.12 | SUCCESS | rc=0 >>
skipped, since /opt/123 exists
192.168.233.13 | CHANGED | rc=0 >>
containerd
rh
[root@docker1 ansible]# ansible all -m command -a 'removes=/opt/123 ls /opt'
192.168.233.13 | SUCCESS | rc=0 >>
skipped, since /opt/123 does not exist
192.168.233.12 | CHANGED | rc=0 >>
123
containerd
rh


shell模块

shell模块,相当于comand的升级版,在远程主机执行命令,相当于调用远程主机的shell进程,支持管道符和重定向

在Ansible当中,多个引号之间要做隔离,

[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'useradd test'
192.168.233.12 | CHANGED | rc=0 >>
[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'cat /etc/passwd'
[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'echo 123456 | passswd --stdin test'

[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}")'
192.168.233.12 | CHANGED | rc=0 >>
inet 192.168.233.12 netmask 255.255.255.0 broadcast 192.168.233.255
#取出ifconfig ens33中的IP地址
[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a "echo $(ifconfig ens33 | awk 'NR==2{print $2}')"
192.168.233.12 | CHANGED | rc=0 >>
192.168.233.11
#单引号和双引号都可以

[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'touch /opt/123 && echo 456 > 123 && ls /opt && cat /opt/123'
#表示逻辑且,前一个命令成功才会执行后一个命令

[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'touch /opt/456 ; echo "666" > /opt/456 ; cat /opt/456'
#表示逻辑或,前面的成功与否,后面的命令都会执行,分号也可以实现一样的操作

练习
1.指定主机上创建一个脚本,在脚本中写入一个内容 #!/bin/bash ifconfig,然后运行
[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/ip.sh && sh /opt/ip.sh'
#最好加上双引号

2.写一个运算脚本
[root@docker1 ansible]# ansible 192.168.233.12 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/t1.sh && sh /opt/t1.sh'
192.168.233.12 | CHANGED | rc=0 >>
5

cron模块

远程主机定时任务

有两种状态

1.present:表示添加(默认就是添加,可以省略)

2.absent:表示移除,#absent在整个语法中都表示移除的意思(删除)

分 时 日 月 周
分=minute ,时=hour , 日=day , 月=month , 周=weekday
job:表示任务执行的命令
name:任务计划的名称,可以不加,最好写上

练习
1.每5分钟查看一下opt
[root@docker1 ansible]# ansible 192.168.233.12 -m cron -a 'minute="*/5" job="ls /opt" name="t3"'
[root@docker1 ansible]# ansible 192.168.233.12 -a 'crontab -l'

2.9月1号早上8点30分,执行ls /opt 任务名:t22
[root@docker1 ansible]# ansible 192.168.233.12 -m cron -a 'minute=30 hour="8" day=1 month=9 job="ls /opt" name=t22'

3.周三下午14点30分执行,ls /opt 不需要任务名
[root@docker1 ansible]# ansible 192.168.233.12 -m cron -a 'minute=30 hour=14 weekday=3 job="ls /opt"'
[root@docker1 ansible]# ansible 192.168.233.12 -a 'crontab -l'   

删除定时任务
[root@docker1 ansible]# ansible 192.168.233.12 -m cron -a 'name=test2 state=absent'
[root@docker1 ansible]# ansible 192.168.233.12 -a 'crontab -l'    
[root@docker1 ansible]# ansible 192.168.233.12 -m cron -a 'name=None state=absent'
#如果有多个名称为None的定时任务将会被一并删除,不推荐(最好是一个不重复的名称)

user模块

常用的参数用户管理模块
name

指定用户名,必须要有

state present absent

创建用户可以不加present,删除一定要加absent

system=yes 或者on

标记用户是否是一个程序用户

Uid

用户的唯一标识

group

用户的所在组

create_home=yes or no

换用户的家目录 ,不需要替换用户的家目录可以不写

password

给用户创建密码

comment

可以添加用户的注释信息(可有可无)

remove=yes or no

当删除用户时,加上remove=yes,删除用户的家目录相当于userdel -r 如果不删除家目录,可以不写。

[root@docker1 ansible]# ansible 192.168.233.12 -m user -a 'name=g11 system=yes'
[root@docker1 ansible]# ansible 192.168.233.12 -a 'cat /etc/passwd'
g11:x:990:984::/home/g11:/bin/bash
在创建用户时,虽然声明了是一个程序用户,但是默认的登录shell如果没有额外声明,还是默认的/bin/bash,UID会按照程序用户来指定

[root@docker1 ansible]# ansible 192.168.233.12 -m user -a 'name=g11 shell=/sbin/nologin'
[root@docker1 ansible]# ansible 192.168.233.12 -a 'cat /etc/passwd'
g11:x:990:984::/home/g11:/sbin/nologin
#指定为程序用户,/sbin/nologin 不能登陆

使用ansible的user模块创建用户,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash,如果创建的程序用户,一定要声明system=yes,声明shell的类型,shell=/sbin/onlogin,也可以指定uid的方式,给用户分配一个uid

[root@docker1 ~]# ansible 192.168.233.12 -m user -a 'name=g2 home=/home/g2 create_home=yes'
#更改家目录

[root@docker1 ~]# ansible 192.168.233.12 -m user -a 'name=g11 remove=yes state=absent'
#删除用户以及用户的家目录

group模块

用户的管理模块,name必须要有,gid设置组的id,ansible不使用交互命令
[root@docker1 ~]# ansible 192.168.233.12 -m group -a 'name=gq1 gid=306 system=yes'
[root@docker2 ~]# cat /etc/group
gq1:x:306:
[root@docker1 ~]# ansible 192.168.233.12 -m user -a 'name=guoqi uid=1011 group=gq1'
[root@docker1 ~]# ansible 192.168.233.12 -a 'cat /etc/passwd'
#指定他的用户组
[root@docker1 ~]# ansible 192.168.233.12 -m group -a 'name=gq1 state=absent'
#删除组,但必须要先删除组里的用户

ping模块

[root@docker1 ~]# ansible all -m ping
#测试和远程主机的连通性,ping通即结束,而且该主机必须添加在ansible的 /etc/ansible/hosts文件中配置声明的主机,ansible的服务端才可以进行远程操作


hostname模块

管理和设置远程主机的主机名
[root@docker1 ~]# ansible 192.168.233.12 -m hostname -a 'name=docker2'
#改主机名

copy模块

用于复制指定的主机文件到远程主机的模块

复制目录时,还是复制完整的目录,即目录当中不能为空,目录里面最终要有一个文件,需要有文件

常用参数
dest

指出要复制的文件在哪,必须使用绝对路径,如果源目标是目录,指目标也得是目录,如果目标的文件已存在,会覆盖原有的内容

src源目标:src:复制文件的源,最好使用绝对路径,源目标是目录,指目标也得是目录
owner指定文件的所有者
group指定文件的所在组
content从主机复制指定的内容到目标主机,content就不能使用src
mode指定复制之后的文件的权限
1.在目标主机创建一个用户guoqi,system=yes,shell=/sbin/nologin,复制ky32.txt,ky32.txt所有者和所在组都是guoqi,权限时600

[root@docker1 ~]# ansible 192.168.233.12 -m user -a 'name=guoqi system=yes shell=/sbin/nologin
[root@docker1 opt]# ansible 192.168.233.12 -m copy -a 'src=/opt/ky32.txt dest=/opt/ky32.txt owner=guoqi mode=600'

2.复制目录,guoqi 到opt/guoqi1/  mode为777

[root@docker1 test]# ansible 192.168.233.12 -m copy -a 'src=/opt/test dest=/opt/guoqi1 mode=777'
#目录里需要有文件才可以复制过去


[root@docker1 test]# ansible 192.168.233.12 -m copy -a 'content="hello world" dest=/opt/hello.txt'
#这个相当于echo  指定了内容就直接打印过去,不需要使用src了

file模块

File模块 ,文件模块,跟目录无关

owner

指定文件的所有者

group

指定文件的所在组

mode

文件权限

state=link  

创建链接文件

state=touch

创建文件

state=absent

删除文件
[root@docker1 test]# ansible 192.168.233.12 -m file -a 'owner=guoqi group=guoqi1 mode=777 path=/opt/guoqi.txt'

1.file模块创建一个文件,ky32.txt 所有者和所在组过期  权限700
[root@docker1 test]# ansible 192.168.233.12 -m file -a 'owner=guoqi group=guoqi mode=700 path=/opt/ky32.txt'


给ky32.txt创建一个链接
[root@docker1 test]# ansible 192.168.233.12 -m file -a 'path=/opt/ky32.link src=/opt/ky32.txt state=link'
#第一个path是创建一个ky32.link的文件它是src指定ky32.txt的连接文件,state=link表示确认链接文件

创建一个文件fstab.link作为fstab.bak的软连接

[root@docker1 opt]# ansible all -m copy -a 'src=/opt/fstab.bak dest=/opt/fstab.bak'
[root@docker1 opt]# ansible all -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'

删除链接文件
[root@docker1 opt]# ansible all -m file -a 'path=/opt/fstab.link state=absent' 

File模块也可以生成目录,
[root@docker1 opt]# ansible 192.168.233.12 -m file -a 'path=/opt/yyqsg.txt state=directory'
声明后可以生成目录

yum模块

远程主机上安装与卸载软件包

在目标主机上的操作都是后台运行,不影响其他用户的使用

[root@docker1 opt]# ansible all -m yum -a 'name=epel-release.noarch'

[root@docker1 opt]# ansible all -m yum -a 'name=httpd'

删除
[root@docker1 opt]# ansible all -m yum -a 'name=httpd state=absent'

[root@docker1 opt]# ansible all -m yum -a 'name=nginx state=absent'

远程查看http状态
[root@docker1 opt]# ansible all -a 'systemctl start httpd'
[root@docker1 opt]# ansible all -a 'systemctl status httpd'
[root@docker1 opt]# ansible all -m shell -a 'echo 666 > /var/www/html/index.html'
[root@docker1 opt]# ansible all -m shell -a 'curl 192.168.233.12'

 service/systemd模块

Name:设定管理服务的名称

State=started|stopped|restarted

Enabled=yes|no 表示是否设置开机自启,如果不加,默认就是开机不自动启动。

Runlevel:配合enabled,如果是开机自启,可以设置运行级别,在命令行可以设置,但是不生效,必须要在playbook当中使用。

[root@docker1 opt]# ansible all -m service -a 'name=httpd enabled=true state=restarted'

script模块

运行本地脚本,然后把结果输出到目标主机

[root@docker1 opt]# ansible all -m script -a 'll.sh'

写一个脚本 内容touch 123 echo guoqi > 123
[root@docker1 opt]# ansible all -m script -a 'll.sh'
[root@docker1 opt]# ansible all -a 'cat /opt/123'
192.168.233.12 | CHANGED | rc=0 >>
guoqi

setup模块

查看目标主机的环境信息(facts)目标节点的系统信息

主机清单

Ansible可以管理上千台主机

在/etc/ansible/hosts中

192.168.233.6[1:9]    : 61-69

主机清单

Ansible可以管理上千台主机

在/etc/ansible/hosts中

192.168.233.6[1:9]

[root@docker1 opt]# ansible all -m setup


ansible all -m setup -a 'filter=*ipv4'
ansible all -m setup -a 'filter=*processor'
ansible all -m setup -a 'filter=mem'
ansible all -m setup -a 'filter=os' #windows
ansible all -m setup -a 'filter=system'
ansible all -m setup -a 'filter=proc'

如何取消ssh密钥队
vim /etc/ansible/hosts

主机清单管理组当中的变量名
ansble_host                 连接时的ip地址
ansible_port                声明对方的连接断开,默认时ssh的22端口
ansible_user                指定连接时使用对方主机的用户名,不指定主机执行ansible的用户即为使用目标主机的用户名
ansible_password            指定连接sshs时的密码(目标主机的用户密码)
ansible_become              可以提升权限
ansible_become_password     指定切换用户的密码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值