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

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

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 是基于python开发的一个配置管理和应用部署工具,在自动化运维中,现在还是异军突起 ansible能批量配置,部署,管理上千台主机,类似于xshell的一键输入工具,不需要每次都切换主机进行操作,只要有一台ansible的固定主机,就可以所有节点的操作,他是不需要agent(客户端),只需要一台主机上配置了ansible |
| Ansible是基于模块进行工作,他只是提供了一种运行的架构,真正执行和变更的是ansible的模块来实现的,如copy模块,service模块 |

ansible如何实现通信的

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

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

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 所谓幂等性,指的是多次操作或者多次执行对系统资源的影响是一致的,举例:如关闭防火墙,只要发现要停止的目标服务已经停止,后续同样的停止操作,不会改变任何结果,也就是什么也不做。 举例:重启防火墙,这不是幂等性,每一次操作都会先停再启动。 举例:http 的get 是幂等性 举例:Post多次执行相同的post可能创建多个相同的资源 |
| Ansible的幂等性决定了你可以放心大胆的使用,重复执行某个人物,不会对结果产生任何影响(绝大多数情况) |

Ansible的四大组件

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

ansible的优点

|-------------------------------------------------------------------------------------------------------------------------|
| 部署较为简单,只需要控制主机部署即可,被控制主机需要有ssh和python(2.5以上版本),基本上linux都是自带的 Ansible只能控制linux系统,widows不行 基于模块工作,可以使用任意语言开发模块(二次开发,底层架构) |

实验环境

1.管理端:192.168.233.11 ansible

2.被管理端:192.168.233.12/13

安装ansible

bash 复制代码
[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的命令,不支持管道符,重定向输出。 |

bash 复制代码
[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当中,多个引号之间要做隔离, |

bash 复制代码
[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在整个语法中都表示移除的意思(删除) |

bash 复制代码
分 时 日 月 周
分=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 如果不删除家目录,可以不写。 |

bash 复制代码
[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不使用交互命令 |

bash 复制代码
[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模块

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


hostname模块

|---------------|
| 管理和设置远程主机的主机名 |

bash 复制代码
[root@docker1 ~]# ansible 192.168.233.12 -m hostname -a 'name=docker2'
#改主机名

copy模块

|------------------------------------------------------------------|
| 用于复制指定的主机文件到远程主机的模块 复制目录时,还是复制完整的目录,即目录当中不能为空,目录里面最终要有一个文件,需要有文件 |

|---------|-----------------------------------------------------------|
| 常用参数 | |
| dest | 指出要复制的文件在哪,必须使用绝对路径,如果源目标是目录,指目标也得是目录,如果目标的文件已存在,会覆盖原有的内容 |
| src | 源目标:src:复制文件的源,最好使用绝对路径,源目标是目录,指目标也得是目录 |
| owner | 指定文件的所有者 |
| group | 指定文件的所在组 |
| content | 从主机复制指定的内容到目标主机,content就不能使用src |
| mode | 指定复制之后的文件的权限 |

bash 复制代码
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 | 删除文件 |

bash 复制代码
[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模块

|------------------------------------------|
| 远程主机上安装与卸载软件包 在目标主机上的操作都是后台运行,不影响其他用户的使用 |

bash 复制代码
[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当中使用。 |

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

script模块

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

bash 复制代码
[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] |

bash 复制代码
[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     指定切换用户的密码
相关推荐
阿巴阿巴boer17 分钟前
用wsl搭建远程linux服务器
linux·运维·服务器·ssh
lisanmengmeng1 小时前
docker 方式安装部署禅道zentao(五)
运维·docker·容器
Logic1011 小时前
《告别重复劳动!易语言实现档案数字化录入全自动助手》
自动化·实战项目·档案管理·易语言·办公效率·模拟按键·文字录入
wanhengidc2 小时前
云手机的硬件依赖性如何?
运维·服务器·智能手机·云计算
piaoroumi2 小时前
UVC调试
linux·运维·前端
VekiSon2 小时前
Linux系统编程——标准IO
linux·运维·服务器
Evan芙2 小时前
DNS服务器类型,解析答案,正反解析域,资源记录定义总结
运维·服务器
wanhengidc3 小时前
巨椰 云手机办公便利性高
运维·服务器·安全·智能手机·云计算
Saniffer_SH3 小时前
【每日一题】PCIe答疑 - 接大量 GPU 时主板不认设备或无法启动和MMIO的可能关系?
运维·服务器·网络·人工智能·驱动开发·fpga开发·硬件工程
爱宇阳3 小时前
Linux 安全加固:禁用 IPv4 ICMP 重定向发送
linux·运维·安全