0


自动化运维工具-ansible详解

一、ansible简介

ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据配置、批量设备部署以及批量命令执行。

ansible大致模块工作原理见下图:

大致工作原理就是ansible程序调用读取/etc/ansible/ansible.cfg配置文件获取主机列表清单/etc/ansible/hosts文件,获取所要处理的主机列表,然后查看剧本任务,在根据剧本中一系列任务生成一个临时的脚本文件,然后将该脚本文件发送给所管理的主机,脚本文件在远程主机上执行完成后返回结果,然后删除本地临时文件

二、ansible的安装部署及免密设置

ansible安装比较简单,只要安装第三方源后,使用包管理工具dnf一键安装即可,步骤如下:

  1. dnf install -y epel-release
  2. dnf install -y ansible

安装完成后,为了方便管理可以配置ssh免密,命令如下:

  1. ssh-keygen -t rsa //在/root/.ssh/目录下生产公钥(id_rsa.pub)和私钥(id_rsa)两个文件
  2. ssh-copy-id root@<ip> //分发秘钥至需要免密登录的目标设备

三、ansible工作模式

ansible分为两种工作模式:

一是adhoc(点对点模式):此模式相当于对管理主机执行单个的shell命令

二是playbook(剧本模式):该模式应用较多,该模式是指将一系列任务整合形成一个剧本,以此来达成某种功能(譬如部署某个服务,数据库备份等)的目的。

上述两种模式可类比于一个是执行单个shell命令,一个是shell脚本。

四、ansible配置文件关键配置介绍

4.1、ansible.cfg配置文件

inventory :管理的主机清单文件路径

library:ansible的模块存放的目录

remote_tmp:上述工作原理中提到的将脚本发送至对端的临时目录

local_tmp:上述工作原理中提到本地生成脚本存放的临时目录

forks:并发连接数,默认为5

sudo_user :命令执行用户

remote_port :访问管理主机的端口

host_key_checking:设置是否检查SSH主机的密钥,默认为false

timeout :ssh连接被管理主机的超时时间

log_path:ansilbe日志文件路径

4.2、hosts配置文件

hosts配置文件是ansible管理的主机列表文件,里面记载着管理主机的ip、端口等信息

其有两种方式:

一是单个主机名或主机ip记录

二是将某一类主机分组记录,譬如数据库主句:

[dbserver]

192.168.1.1

192.168.1.2

192.168.1.3

........

当需要对该类主机进行操作时,只要调用dbserver即可调用该分组内所有主机,且此处可支持通配符

五、 ansible常用参数

  1. ansible-doc -l :列出所有模块
  2. ansible-doc -s <模块名> :查看模块的参数信息
  3. ansible --version :查看ansible版本
  4. ansible -v :输出详细详细;-vv:输出更详细的信息
  5. ansible -m :指定调用的模块名称
  6. ansible -a :调用模块的参数
  7. ansilbe -c :测试命令执行结果,不实际执行
  8. ansible -k :提示输入ssh的秘密,而不是基于ssh认证
  9. ansible -u :指定执行命令的用户
  10. ansilbe -i :指定访问的主机列表文件
  11. ansilbe -f :指定并发进程数

六、ansible常用模块

以下模块举例主机组为client

1、ping模块连通性测试

  1. [root@server ~]# ansible client -m ping //检测主机组主机连通性
  2. 192.168.91.128 | SUCCESS => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": false,
  7. "ping": "pong"
  8. }

2、command模块

  1. [root@server ~]# ansible client -m command -a 'df -h' //执行某个命令,不会通过shell进行处理,不支持管道
  2. 192.168.91.128 | CHANGED | rc=0 >>
  3. Filesystem Size Used Avail Use% Mounted on
  4. devtmpfs 362M 0 362M 0% /dev
  5. tmpfs 392M 0 392M 0% /dev/shm
  6. tmpfs 392M 26M 366M 7% /run
  7. tmpfs 392M 0 392M 0% /sys/fs/cgroup
  8. /dev/mapper/cl-root 17G 8.8G 8.3G 52% /
  9. /dev/sda1 1014M 255M 760M 26% /boot
  10. tmpfs 79M 24K 79M 1% /run/user/1000
  11. /dev/sr0 723M 723M 0 100% /run/media/wujw/CentOS-8-4-2105-x86_64-dvd
  12. tmpfs 79M 0 79M 0% /run/user/0

3、shell模块

  1. ansible client -m shell -a 'df -h|grep dev' //万能模块,支持所有shell命令
  2. 192.168.91.128 | CHANGED | rc=0 >>
  3. devtmpfs 362M 0 362M 0% /dev
  4. tmpfs 392M 0 392M 0% /dev/shm
  5. /dev/mapper/cl-root 17G 8.8G 8.3G 52% /
  6. /dev/sda1 1014M 255M 760M 26% /boot
  7. /dev/sr0 723M 723M 0 100% /run/media/wujw/CentOS-8-4-2105-x86_64-dvd

4、copy模块

支持的参数:

  1. src

    被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径

  1. content

  用于替换"src",可以直接指定文件的内容

  1. dest

    将源文件复制到的远程主机的绝对路径

  1. backup

   当文件内容发生改变后,在覆盖之前把源文件备份

  1. force

   当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设 为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"

  1. [root@server ~]# ansible client -m copy -a 'src=mem.txt dest=/root' //从当前设备拷贝文件至对端
  2. 192.168.91.128 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": true,
  7. "checksum": "321b4039b2d0805781db9c38df6ab75cc1a4fe32",
  8. "dest": "/root/mem.txt/192.168.91.128",
  9. "gid": 0,
  10. "group": "root",
  11. "md5sum": "fb3a8f8cafdeccd3312e69eb18b5c205",
  12. "mode": "0644",
  13. "owner": "root",
  14. "secontext": "system_u:object_r:admin_home_t:s0",
  15. "size": 333,
  16. "src": "/root/.ansible/tmp/ansible-tmp-1653312782.0254133-7348-72341069223651/source",
  17. "state": "file",
  18. "uid": 0
  19. }
  20. [root@server ~]# ansible client -m shell -a 'ls -l /root' //查看文件已发送过来
  21. 192.168.91.128 | CHANGED | rc=0 >>
  22. total 24
  23. -rw-r--r--. 1 root root 142 May 18 10:27 1.sh
  24. drwxr-xr-x. 2 root root 6 May 8 04:15 123
  25. -rw-------. 1 root root 1429 Aug 20 2021 anaconda-ks.cfg
  26. -rw-r--r--. 1 root root 1721 Aug 21 2021 initial-setup-ks.cfg
  27. drwxr-xr-x. 2 root root 28 May 23 09:33 mem.txt
  28. -rw-r--r--. 1 root root 53 May 18 10:54 temp.txt
  29. drwxr-xr-x. 2 root root 79 May 8 04:04 test
  30. -rw-r--r--. 1 root root 142 May 18 10:54 test.sh
  31. -rw-r--r--. 1 tcpdump tcpdump 39 May 18 10:34 test.txt

五、 file模块

支持的参数:

  1. group

  定义文件/目录的所属组

  1. owner

  定义文件/目录的所属用户。后面必须跟上

  1. path

:定义文件/目录的路径

  1. dest

   被链接到的路径,只应用于

  1. state=link

的情况

  1. state

  状态,有以下选项:

  1. directory

:如果目录不存在,就创建目录

  1. file

:即使文件不存在,也不会被创建

  1. link

:创建软链接

  1. hard

:创建硬链接

  1. touch

:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其 最后修改时间

  1. absent

:删除目录、文件或者取消链接文件

  1. [root@server ~]# ansible client -m file -a 'path='/root/mem.txt' state=absent'
  2. //删除文件/root/mem.txt
  3. 192.168.91.128 | CHANGED => {
  4. "ansible_facts": {
  5. "discovered_interpreter_python": "/usr/libexec/platform-python"
  6. },
  7. "changed": true,
  8. "path": "/root/mem.txt",
  9. "state": "absent"
  10. }
  11. [root@server ~]# ansible client -m shell -a 'ls -l /root'
  12. //查看文件/root/mem.txt已被删除
  13. 192.168.91.128 | CHANGED | rc=0 >>
  14. total 24
  15. -rw-r--r--. 1 root root 142 May 18 10:27 1.sh
  16. drwxr-xr-x. 2 root root 6 May 8 04:15 123
  17. -rw-------. 1 root root 1429 Aug 20 2021 anaconda-ks.cfg
  18. -rw-r--r--. 1 root root 1721 Aug 21 2021 initial-setup-ks.cfg
  19. -rw-r--r--. 1 root root 53 May 18 10:54 temp.txt
  20. drwxr-xr-x. 2 root root 79 May 8 04:04 test
  21. -rw-r--r--. 1 root root 142 May 18 10:54 test.sh
  22. -rw-r--r--. 1 tcpdump tcpdump 39 May 18 10:34 test.txt

六、fetch模块

  1. dest

:用来存放文件的目录

  1. src

:在远程拉取的文件,并且必须是一个file,不能是目录

  1. [root@server ~]# ansible client -m fetch -a 'src=/root/test.sh dest=/root'
  2. 192.168.91.128 | SUCCESS => {
  3. "changed": false,
  4. "checksum": "061375bc913062287ccd658347e8575d38dfa857",
  5. "dest": "/root/192.168.91.128/root/test.sh",
  6. "file": "/root/test.sh",
  7. "md5sum": "35dcd724c02d10850a560df9129a1cf2"
  8. }

七、cron模块

  1. day

每天应该运行的工作( 1-31)

  1. hour

每小时 ( 0-23 )

  1. minute

每分钟( 0-59 )

  1. month

每月( 1-12 )

  1. weekday

每周 ( 0-6 for Sunda y-Saturday,, )

  1. job

指明运行的命令

  1. name

定时任务描述

  1. reboot

:任务在重启时运行,不建议使用,建议使用special_time

  1. special_time

:特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)

  1. state

指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务

  1. user

:以哪个用户的身份执行

  1. [root@server ~]# ansible client -m cron -a 'name="restart httpd" hour=*/5 job="systemctl restart httpd"'
  2. //每5小时重启httpd模块
  3. 192.168.91.128 | CHANGED => {
  4. "ansible_facts": {
  5. "discovered_interpreter_python": "/usr/libexec/platform-python"
  6. },
  7. "changed": true,
  8. "envs": [],
  9. "jobs": [
  10. "restart httpd"
  11. ]
  12. }
  13. [root@server ~]# ansible client -m shell -a 'crontab -l'
  14. 192.168.91.128 | CHANGED | rc=0 >>
  15. #Ansible: restart httpd
  16. * */5 * * * systemctl restart httpd

八 、yum模块

支持的参数:

  1. name

安装包名称

  1. state
  1. present

安装

  1. latest

安装最新的

  1. absent

卸载软件

  1. ansible client -m yum -a 'name=httpd state=present'

九、service模块

支持的参数:

  1. enabled

:设置开机启动。

  1. name :

务名称

  1. state

:四种状态

  1. started

:启动服务

  1. stopped

:停止服务

  1. restarted

:重启服务

  1. reloaded

:重载配置

  1. [root@server ~]# ansible client -m service -a 'name=httpd state=restarted' //重启httpd服务
  2. 192.168.91.128 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": true,
  7. "name": "httpd",
  8. "state": "started",
  9. "status": {
  10. "ActiveEnterTimestamp": "Mon 2022-05-23 10:16:02 EDT",
  11. "ActiveEnterTimestampMonotonic": "134284476109",
  12. "ActiveExitTimestamp": "Mon 2022-05-23 10:16:01 EDT",
  13. "ActiveExitTimestampMonotonic": "134283332327",
  14. "ActiveState": "active",
  15. ........
  16. }
  17. }

十、user模块

支持的参数:

  1. name

指定用户名

  1. group

指定基本组

  1. state

设置帐号状态,不指定为创建,指定值为absent表示删除

  1. system

当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户

  1. uid

指定用户的uid

  1. password

指定用户密码

  1. [root@server ~]# ansible client -m user -a 'name=test uid=23' //创建用户test,uid为23
  2. 192.168.91.128 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": true,
  7. "comment": "",
  8. "create_home": true,
  9. "group": 1001,
  10. "home": "/home/test",
  11. "name": "test",
  12. "shell": "/bin/bash",
  13. "state": "present",
  14. "system": false,
  15. "uid": 23
  16. }
  17. 删除用户state=absent

十一、group模块

支持的参数:

  1. gid

设置组ID

  1. name

组的名称

  1. state

组的状态,默认为创建,设置值为

  1. absent

为删除

  1. system

值为

  1. yes

,表示创建为系统组

  1. [root@server ~]# ansible client -m group -a 'name=test1 gid=233' //创建组test1,gid为233
  2. 192.168.91.128 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/libexec/platform-python"
  5. },
  6. "changed": true,
  7. "gid": 233,
  8. "name": "test1",
  9. "state": "present",
  10. "system": false
  11. }

十二、script模块

该模块用于将本地的一个脚本文件在管理设备上执行,脚本文件需有可执行权限

  1. ansible client -m script -a '/root/192.168.91.128/test.sh'

十二、 setup模块

该模块用于采集被管理设备信息并返回给服务端,后面跟--tree <目录>,可以将采集信息以ip为文件名保存至指定目录下

  1. ansible client -m setup //输出所有设备信息
  2. 输出内容较多,可通过过滤采集我们需要的设备信息,譬如只要内存信息
  3. [root@server root]# ansible client -m setup -a 'filter=*mem*'
  4. 192.168.91.128 | SUCCESS => {
  5. "ansible_facts": {
  6. "ansible_memfree_mb": 55,
  7. "ansible_memory_mb": {
  8. "nocache": {
  9. "free": 216,
  10. "used": 566
  11. },
  12. "real": {
  13. "free": 55,
  14. "total": 782,
  15. "used": 727
  16. },
  17. "swap": {
  18. "cached": 56,
  19. "free": 1175,
  20. "total": 2047,
  21. "used": 872
  22. }
  23. },
  24. "ansible_memtotal_mb": 782,
  25. "discovered_interpreter_python": "/usr/libexec/platform-python"
  26. },
  27. "changed": false
  28. }
  29. 再或者仅要ipv4地址:
  30. [root@server root]# ansible client -m setup -a 'filter=*all_ipv4*'
  31. 192.168.91.128 | SUCCESS => {
  32. "ansible_facts": {
  33. "ansible_all_ipv4_addresses": [
  34. "192.168.122.1",
  35. "192.168.91.128"
  36. ],
  37. "discovered_interpreter_python": "/usr/libexec/platform-python"
  38. },
  39. "changed": false
  40. }

七、ansible的剧本模式(playbook)

后续补充

标签: 运维 自动化 centos

本文转载自: https://blog.csdn.net/m0_64496909/article/details/124913290
版权归原作者 言一日记 所有, 如有侵权,请联系我们删除。

“自动化运维工具-ansible详解”的评论:

还没有评论