1、什么是ansible?
ansible是一个自动化运维工具的名称,是基于Python开发,集合了众多运维工具的优点(puppet、fabric、slatstack),实现批量系统配置,程序的部署。
Linux运维:自动化(脚本)、智能化、平台化。由于Linux运维人员,人肉运维不可取–效率慢,如果敲错出事,于是就诞生了一系列的运维工具,ansible就是其中之一。
日常运维:
1、软件安装-查看依赖 漏铜 升级 Debian-apt-get
2、服务的配置-架构搭建-负载均衡(高可用)-等价路由-lvs
3、运行脚本
4、升级
5、备份
6、告警
ansible依赖于:paramiko、PyYam和jinja三个关键组件,基于ssh协议,只要ssh协议,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。
2、ansible的组成
1、host inventory --定义客户机,可以对客户机进行分类:db类、web类等
2、playbook 剧本 让主机按照我给定的剧本去完成一些事情。
3、module 模块 实现一个个功能的程序。
4、pluging 插件 实现一些额外的小功能。
3、ansible环境安装配置以及实例测试
1、实验环境
1、准备三台虚拟机:
A机器:192.168.2.152(ansible)
B机器:192.168.2.132
C机器:192.168.2.137
实验前提,做好免密登录认证,使用ssh服务,详情可见ssh服务免密登录
A---->B, A----->C A可以免密码登录到B机器和C机器上。
首先在A机器上操作(建立免密通道):
先连接到B机器(192.168.2.132)
[root@sc-master ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:YgRssTONWSCv0/JgvN//oI54fJL8bTClAP4oqHjg1Ws root@sc-master The key's randomart image is: +---[RSA 2048]----+ | ..+o. | | .ooB | | . oB o | | ..o.+ . | |. Boo.ooS | |+..B.o+. | |+ooo...o. | |o..o*E.o.. | | ...+==oo.. | +----[SHA256]-----+ [root@sc-master ~]# cd /root/.ssh [root@sc-master .ssh]# ls authorized_keys config id_rsa id_rsa.pub known_hosts
登录测试:看能不能登录到B机器上,第一次登录需要输入密码,第二次登录就不需要密码了。
[root@sc-master .ssh]# ssh-copy-id -p 22 -i id_rsa.pub root@192.168.2.132 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out an are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now to install the new keys root@192.168.2.132's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh -p '22' 'root@192.168.2.132'" and check to make sure that only the key(s) you wanted were added.
这里直接登录,就不需要输入密码。建立成功。
[root@sc-master .ssh]# ssh -p '22' 'root@192.168.2.132' Last login: Sat Aug 20 11:00:50 2022 from 192.168.2.116
然后查看B机器上~/.ssh目录下生成的A机器上生成的authorized_keys 文件。
[root@sc-slave .ssh]# ls authorized_keys id_rsa id_rsa.pub known_hosts [root@sc-slave .ssh]# cat id_rsa.pub
然后就是建立和C机器之间的免密通信。方法同上,直接将A机器上生成的公钥上传到137机器上。
[root@sc-master .ssh]# ssh-copy-id -p 22 -i id_rsa.pub root@192.168.2.137 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out an are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now to install the new keys root@192.168.2.137's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh -p '22' 'root@192.168.2.137'" and check to make sure that only the key(s) you wanted were added.
然后直接登录。
[root@sc-master .ssh]# ssh -p '22' 'root@192.168.2.137' Last login: Sat Aug 20 11:01:11 2022 from 192.168.2.116 [root@nginx-kafka03 ~]# exit 登出 Connection to 192.168.2.137 closed. [root@sc-master .ssh]# ssh -p '22' 'root@192.168.2.137' Last login: Sat Aug 20 11:05:18 2022 from nginx-kafka01 [root@nginx-kafka03 ~]# exit 登出 Connection to 192.168.2.137 closed.
2、在A机器上安装ansible
[root@a .ssh]# yum install epel-release [root@b ansible]# yum install ansible
3、配置:配置目录
/etc/ansible/ansible.cfg :ansible的主配置文件,此文件主要定义了roles_path的路径,主机清单路径,连接清单中的主机方式等等。
**/etc/ansible/hosts:**这个配置文件就是默认的主机清单配置文件, 可以通过ansible.cfg 重新定义。
备份/etc/ansible/hosts:
[root@sc-master ansible]# cp hosts hosts.bak
编辑 /etc/ansible/hosts文件:
[root@b ansible]# cat hosts [webser] 192.168.2.132:22 192.168.2.137:22
[webser]表示将需要管理的主机添加到webser组
如果通过ssh登陆的端口不是22号端口,就需要在配置文件中指明端口号
除了以上两个重要的配置文件还有三个重要的可执行文件分别是:
**ansible 主执行程序,**一般用于命令行下执行。
ansible-playbook 执行playbook中的任务。
ansible-doc 获取各模块的帮助信息。
2、ansible的使用
HOST-PATTERN: 匹配主机模式,如all表示所有主机
-m MOD_NAME: 模块名 如:ping、shell模块
-a MOD_ARGS : 模块执行的参数
-f FORKS : 生成几个子进程进行执行
-C :(不执行,模拟跑)
**-u Username :**某主机的用户名
-c CONNection: 连接方式(default smart)
3、ansible 体验
分组执行:
指定ansible管理的所有主机都执行命令(在tmp目录下创建sc目录)
[root@sc-master ansible]# ansible all -m shell -a "mkdir /tmp/sc" [WARNING]: Consider using the file module with state=directory rather than running 'mkdir'. If you need to use command because file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message. 192.168.2.132 | CHANGED | rc=0 >> 192.168.2.137 | CHANGED | rc=0 >>
rc ==》 return code --为0表示执行成功。
使用pssh服务去批量处理。
[root@sc-master ansible]# pssh -h hosts "mkdir /tmp/sc2" [1] 11:44:55 [FAILURE] [webser] Exited with error code 255 [2] 11:44:56 [SUCCESS] 192.168.2.132:22 [3] 11:44:56 [SUCCESS] 192.168.2.137:22
ansible不是一个守护进程(起来后一直在内存中运行,等待其他人访问),ansible就是一个命令脚本,使用python写的。
[root@sc-master ansible]# ps -ef|grep ansible root 8411 7979 0 11:47 pts/0 00:00:00 grep --color=auto ansible
4、ansible的模块
1、copy模块:从本地copy文件分发到目录主机路径
2、fetch模块:从远程主机拉取文件到本地
3、command模块:在远程主机上执行命令,不进行shell解析。
4、shell模块:需要两台机器上也有能执行的命令
5、file模块:设置文件属性(创建文件)
6、cron模块:对目标主机生成计划任务
7、yum模块:yum安装软件包的模块
8、service模块:服务管理模块
9、script模块:把本地的脚本传到远端执行;前提是到远端可以执行
1、copy模块
从本地copy文件分发到目录主机路径
参数说明:
src=源文件路径
dest=目标路径
注意src=路径后面带/表示里面的所有内容复制到目标目录下**,不带/是目录递归复制过去。content=自行填充的文件内容
owner 属主
group 属组
mode 权限
例如:1、将/lianxi/ansible-copy复制到主机的/lianxi/ansible下,并设置权限为777,属主为sanchuang,属组为sanchuang。
[root@b lianxi]# ansible all -m copy -a "src=/lianxi/ansible-copy dest=/lianxi/ansible mode=777 owner=sanchuang group=sanchuang"
2、指定webser组,将/etc/passwd 复制到主机/tmp目录下,指定权限777
[root@b copy_dir]# ansible webser -m copy -a "src=/etc/passwd dest=/tmp mode=777"
3、指定webser组,将/lianxi下的aa文件拷贝到主机下的/tmp/sc下的aa.txt文件。
[root@sc-master ansible]# ansible webser -m copy -a "src=/lianxi/aa dest=/tmp/sc/aa.txt" 192.168.2.137 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "checksum": "6dbdec21eba690a18d6fada6e33744c34d826b39", "dest": "/tmp/sc/aa.txt", "gid": 0, "group": "root", "md5sum": "dfd35885c2b6d0c25a7ba699b6ced4f7", "mode": "0644", "owner": "root", "size": 452, "src": "/root/.ansible/tmp/ansible-tmp-1660967660.93-8472-73428149734911/source", "state": "file", "uid": 0 }
src目录后面带/和不带/的区别:
① 带/ 表示拷贝目录下的子文件或者子文件夹
② 不带/ 表示拷贝整个目录
① 不带/的例题:/lianxi/copy_dir
将lianxi下的copy_dir整个目录都拷贝到主机的/lianxi/ansible目录下。
[root@b copy_dir]# ansible all -m copy -a "src=/lianxi/copy_dir dest=/lianxi/ansible" 192.168.0.48 | CHANGED => { "changed": true, "dest": "/lianxi/ansible/", "src": "/lianxi/copy_dir" }
测试:将ansible机器上的/lianxi下的myproject的所有目录文件夹传入到主机下的lianxi下的ansible文件夹中。如果对方主机不存在的目录会自动帮助你新建,可以看下面的。
[root@sc-master lianxi]# ansible all -m copy -a "src=/lianxi/myproject dest=/lianxi/ansible"
执行拷贝目录的如果目录文件比较大,反应速度有点慢。需要等待。
被上传文件的主机:B机器
首先查看主机上的/lianxi/ansible文件夹是不存在的。
[root@sc-slave .ssh]# cd /lianxi -bash: cd: /lianxi: 没有那个文件或目录 [root@sc-slave .ssh]# cd / [root@sc-slave /]# cd /lianxi -bash: cd: /lianxi: 没有那个文件或目录
C机器:也是如此。
在执行了上面那条命令之后,就有自动帮助创建了文件夹。
B机器上:
[root@sc-slave /]# ls backup boot dev home lib media opt root sbin sys usr bin data etc lianxi lib64 mnt proc run srv tmp var [root@sc-slave /]# cd /lianxi [root@sc-slave lianxi]# ls ansible [root@sc-slave lianxi]# cd ansible [root@sc-slave ansible]# ls myproject
C机器上:
[root@nginx-kafka03 /]# cd /lianxi [root@nginx-kafka03 lianxi]# ls aa ansible bb cc file_num.sh lianxi tongle xieshan
可以看到被执行了那条命令之后,B、C两机器上都有这个被上传的整个目录,那就说明命令执行成功。
Linux之自动化运维工具ansible、ansible模块(2)+https://developer.aliyun.com/article/1557940