Ansible自动化运维(一)

简介: Ansible自动化运维

   Ansible特点如下:

  1. Ansible基于Python开发,运维工程师对其二次开发相对较容易。
  2. Ansible丰富的内置模块,基本可以满足一切需求。
  3. 管理模式非常简单,一条命令可以影响上千台机器。
  4. 无客户端模式 ,底层通过SSH通信。

案例环境

       Ansible可以使上千台机器受到影响,本次案例环境中只添加连台管理操作即可。

Ansible安装

🍤通过YUM安装Ansible,本次通过配置网络仓库。配置参考文章配置网络源仓库

1. [root@ansible ~]# yum -y install ansible                //yum安装Ansible
2. [root@ansible ~]# ansible --version                 //查看版本,验证安装结果
3. ansible 2.9.27
4.   config file = /etc/ansible/ansible.cfg
5.   configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
6.   ansible python module location = /usr/lib/python2.7/site-packages/ansible
7.   executable location = /usr/bin/ansible
8.   python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

🍤创建SSH免交互登录

       Ansible通过SSH对设备进行管理,而SSH包含两种认证方式:一种是通过密码认证,另一种是通过密钥对认证。前者需要和系统交互,而后者是免交互登录。

1. [root@ansible ~]# ssh-keygen -t rsa             //生成密钥对
2. Generating public/private rsa key pair.
3. Enter file in which to save the key (/root/.ssh/id_rsa):    //密钥对存放路径
4. Created directory '/root/.ssh'.
5. Enter passphrase (empty for no passphrase):         //输入私钥密码,直接按Enter表示无密码
6. Enter same passphrase again: 
7. Your identification has been saved in /root/.ssh/id_rsa.
8. Your public key has been saved in /root/.ssh/id_rsa.pub.
9. The key fingerprint is:
10. 3e:8a:bc:b7:70:9b:f4:a1:21:3f:77:af:54:20:a7:7a root@ansible
11. The key's randomart image is:
12. +--[ RSA 2048]----+
13. |                 |
14. |                 |
15. |        . o      |
16. |         + .     |
17. |        S   .    |
18. |       o   .     |
19. |    o = E .      |
20. |   . BoO.+.      |
21. |    +oB+...o.    |
22. +-----------------+
23. [root@ansible ~]# ssh-copy-id root@192.168.1.20         //通过scp命令复制公钥到远端IP
24. [root@ansible ~]# ssh-copy-id root@192.168.1.30
25. [root@ansible ~]# ssh 192.168.1.20                      //测试查看可以免密码登录
26. Last login: Tue Aug  9 20:09:08 2022
27. [root@localhost ~]# exit                                //查看后退出SSh登录
28. logout
29. Connection to 192.168.1.20 closed.

       经过以上操作,对于Ansible的部署就已经完成了,下面就是通过Ansible对设备进行管理了。

Ansible配置

       inventory是Ansible管理主机信息的配置文件,相对于系统Hosts文件的功能,默认存放在/etc/ansible/hosts。默认情况下,通过访问22端口(SSH)来管理设备,若目标使用非默认的SSH端口,需要在主机IP或域名后添加冒号加端口号标明,以行为单位分隔配置。hosts文件也还支持通配符。

       可以将同一个主机同时归置在多个不同的组中。

1. [root@ansible ~]# vim /etc/ansible/hosts 
2. ......//配置文件内添加下面配置
3. [web]
4. 192.168.1.20
5. 192.168.1.30

       🍤配置完成后,可以针对hosts定义的组进行远程操作,也可以针对组中指定的某一个主机操作。下面介绍如何针对特定的服务器操作。

  • 只对web组中192.168.1.20主机操作。通过--limit参数限定主机的变更。
1. [root@ansible ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.1.20"
2. 192.168.1.20 | FAILED | rc=4 >>                         //因为1.20主机没有安装httpd服务,所以可能会显示红色错误
3. Unit httpd.service could not be found.non-zero return code

       因为没有安装httpd服务,可以用“ansible all -f 5 -m ping”测试是否成功。

  • 只对192.168.1.20主机操作。通过ip限定主机的变更。
1. [root@ansible ~]# ansible 192.168.1.20 -m command -a "systemctl status httpd"
2. 192.168.1.20 | FAILED | rc=4 >>
3. Unit httpd.service could not be found.non-zero return code
  • 只对192.168.1.0网段主机操作。通过配置通配符限定主机的变更。
1. [root@ansible ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
2. 192.168.1.20 | FAILED | rc=4 >>
3. Unit httpd.service could not be found.non-zero return code
4. 192.168.1.30 | FAILED | rc=4 >>
5. Unit httpd.service could not be found.non-zero return code

Ansible命令

       Ansible的维护命令大多以Ansible开头,在中断输入ansible后连续按两次Tab键,会补全所有以ansible字母开头的命令。

1. [root@ansible ~]# ansible
2. ansible               ansible-doc           ansible-playbook-2
3. ansible-2             ansible-doc-2         ansible-playbook-2.7
4. ansible-2.7           ansible-doc-2.7       ansible-pull
5. ansible-config        ansible-galaxy        ansible-pull-2
6. ansible-connection    ansible-galaxy-2      ansible-pull-2.7
7. ansible-console       ansible-galaxy-2.7    ansible-vault
8. ansible-console-2     ansible-inventory     ansible-vault-2
9. ansible-console-2.7   ansible-playbook      ansible-vault-2.7

ansible

       ansible是生产环境中使用非常频繁的命令之一,主要在以下场景使用。

  1. 非固化需求。
  2. 临时一次性操作。
  3. 二次开发接口调用。

🍤语法如下:

ansible <host_pattern> [options]

🍤可用选项如下:

-v(--verbose):输出详细的执行过程信息,可以得到执行过程所有信息。

-i PATH(-inventory=PATH):指定inventory信息,默认为/etc/ansible/hosts。

-f NUM(--forks=NUM):并发线程数,默认为5个线程。

--private-key=PRIVATE_KEY_FILE:指定秘钥文件。

-m NAME,--module-name=NAME:指定执行使用的模块。

-M DIRECTORY(--module-path=DIRECTORY):指定模块存放路径,默认为/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。

-a ARGUMENTS(--args=ARGUMENTS):指定模块参数。

-u USERNAME(--user=USERNAME):指定远程主机以USERNAME运行命令。

-l subset(--limit=SUBSET):限制运行主机。

--list-hosts:列出符合条件的主机列表,不执行任何命令。

🍤检查所有主机是否存活。命令如下:

       执行主机为192.168.1.20和192.168.1.30,SUCCESS表示命令执行成功。“=>{}”表示返回结果,“changed”:false表示没有对主机做出更改,“ping”:“pong”表示执行了ping命令的返回结果。

1. [root@ansible ~]# ansible all -f 5 -m ping
2. 192.168.1.30 | SUCCESS => {
3.    "ansible_facts": {
4.        "discovered_interpreter_python": "/usr/bin/python"
5.     }, 
6.    "changed": false, 
7.    "ping": "pong"
8. }
9. 192.168.1.20 | SUCCESS => {
10.    "ansible_facts": {
11.        "discovered_interpreter_python": "/usr/bin/python"
12.     }, 
13.    "changed": false, 
14.    "ping": "pong"
15. }

🍤列出web组所有的主机列表。命令如下:

       --list选项列出web组所有主机列表信息,web组中包括两台主机192.168.1.20和192.168.1.30。

1. [root@ansible ~]# ansible web --list
2. hosts (2):
3.    192.168.1.20
4.    192.168.1.30

🍤批量显示web组中的磁盘使用空间。命令如下:

1. [root@ansible ~]# ansible web -m command -a "df -hT"
2. 192.168.1.20 | CHANGED | rc=0 >>
3. 文件系统            类型      容量  已用  可用 已用% 挂载点
4. /dev/mapper/cl-root xfs        17G  4.3G   13G   25% /
5. devtmpfs            devtmpfs  473M     0  473M    0% /dev
6. tmpfs               tmpfs     489M  144K  489M    1% /dev/shm
7. tmpfs               tmpfs     489M  7.1M  482M    2% /run
8. tmpfs               tmpfs     489M     0  489M    0% /sys/fs/cgroup
9. /dev/sda1           xfs      1014M  173M  842M   18% /boot
10. tmpfs               tmpfs      98M  8.0K   98M    1% /run/user/0
11. /dev/sr0            iso9660   4.1G  4.1G     0  100% /run/media/root/CentOS 7 x86_64
12. 192.168.1.30 | CHANGED | rc=0 >>
13. 文件系统            类型      容量  已用  可用 已用% 挂载点
14. /dev/mapper/cl-root xfs        17G  4.3G   13G   25% /
15. devtmpfs            devtmpfs  473M     0  473M    0% /dev
16. tmpfs               tmpfs     489M   88K  489M    1% /dev/shm
17. tmpfs               tmpfs     489M  7.1M  482M    2% /run
18. tmpfs               tmpfs     489M     0  489M    0% /sys/fs/cgroup
19. /dev/sda1           xfs      1014M  173M  842M   18% /boot
20. tmpfs               tmpfs      98M  8.0K   98M    1% /run/user/0
21. /dev/sr0            iso9660   4.1G  4.1G     0  100% /run/media/root/CentOS 7 x86_64

       🍤 Ansible的返回结果非常友好,由三种颜色来表示执行结果。红色:表示执行过程有异常;橘黄色:表示命令执行后目标有状态变化;绿色:表示执行成功且没有对目标机器做修改。

Ansible-doc

       Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及案例介绍。

🍤语法如下:

ansible-doc [otions] [module......]

🍤列出支持的模块:

[root@ansible ~]# ansible-doc -l                                 //按q退出

查询ping模块的说明信息。

[root@ansible ~]# ansible-doc ping

Ansible-playbook

       Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。playbook.yml文件需要体现编写好,建议指定playbook.yml的绝对路径。

🍤使用方法如下:

[root@ansible ~]# ansible-playbook playbook.yml

Ansible-console

       Ansible-console是Ansible为用户提供的一款交互式工具,类似于windows的cmd以及Linux中的Shell。exit退出或者快捷键Ctrl+D或Ctrl+C。

🍤命令如下(输入命令后会有一个浅色的字体出现):

1. [root@ansible ~]# ansible-console
2. Welcome to the ansible console.
3. Type help or ? to list commands.
4. 
5. root@all (2)[f:5]$ cd web
6. root@web (2)[f:5]$ list
7. 192.168.1.20
8. 192.168.1.30

Ansible模块

command模块

       command模块在远程主机执行命令,不支持管道、重定向等Shell的特性。

🍤常用参数如下:

chdir:在远程主机上运行命令前要提前进入的目录。

creates:在命令运行时创建一个文件,如果文件已经存在,则不执行创建命令。

removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务。

executeble:指明运行命令的shell程序。

🍤在所有主机上运行“ls ./”命令,运行前切换到/home目录。命令如下:

1. [root@ansible ~]# ansible all -m command -a "chdir=/home ls ./"
2. 192.168.1.20 | CHANGED | rc=0 >>
3. z3
4. 192.168.1.30 | CHANGED | rc=0 >>
5. z3

Shell模块

       Shell模快在远程主机执行命令,相当于调用远程主机的Shell进程,然后在Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shell特性,如管道、重定向等。

1. [root@ansible ~]# ansible web -m shell -a 'echo "hello" >> /tmp/hello.txt'
2. 192.168.1.20 | CHANGED | rc=0 >>
3. 
4. 192.168.1.30 | CHANGED | rc=0 >>
5. 
6. [root@ansible ~]# ssh 192.168.1.20 cat /tmp/hello.txt
7. hello
8. [root@ansible ~]# ssh 192.168.1.30 cat /tmp/hello.txt
9. hello

copy模块

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

🍤常见参数如下:

dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容。

src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录。

mode:指出复制时,目标文件的权限,可选。

owner:指出复制时,目标文件的属主,可选。

group:指出复制时,目标文件的属组,可选。

content:指出复制到目标主机上的内容,不能与src一起使用,相当于复制content致命的数据到目标文件中。

1. [root@ansible ~]# ansible web -m copy -a "src=/etc/hosts dest=/tmp/ mode=777 owner=nobody group=root"
2. 192.168.1.20 | CHANGED => {
3.    "ansible_facts": {
4.        "discovered_interpreter_python": "/usr/bin/python"
5.     }, 
6.    "changed": true, 
7.    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", 
8.    "dest": "/tmp/hosts", 
9.    "gid": 0, 
10.    "group": "root", 
11.    "md5sum": "54fb6627dbaa37721048e4549db3224d", 
12.    "mode": "0777", 
13.    "owner": "nobody", 
14.    "size": 158, 
15.    "src": "/root/.ansible/tmp/ansible-tmp-1660217157.43-4832-6734297780200/source", 
16.    "state": "file", 
17.    "uid": 99
18. }
19. 192.168.1.30 | CHANGED => {
20.    "ansible_facts": {
21.        "discovered_interpreter_python": "/usr/bin/python"
22.     }, 
23.    "changed": true, 
24.    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", 
25.    "dest": "/tmp/hosts", 
26.    "gid": 0, 
27.    "group": "root", 
28.    "md5sum": "54fb6627dbaa37721048e4549db3224d", 
29.    "mode": "0777", 
30.    "owner": "nobody", 
31.    "secontext": "unconfined_u:object_r:admin_home_t:s0", 
32.    "size": 158, 
33.    "src": "/root/.ansible/tmp/ansible-tmp-1660217157.44-4833-6859918093267/source", 
34.    "state": "file", 
35.    "uid": 99
36. }
37. [root@ansible ~]# ssh 192.168.1.20 ls -l /tmp/hosts
38. -rwxrwxrwx 1 nobody root 158 8月  11 19:25 /tmp/hosts
39. [root@ansible ~]# ssh 192.168.1.30 ls -l /tmp/hosts
40. -rwxrwxrwx. 1 nobody root 158 8月  11 19:25 /tmp/hosts


相关文章
|
14天前
|
人工智能 运维 监控
当AI遇上自动化:运维测试终于不“加班”了
当AI遇上自动化:运维测试终于不“加班”了
141 9
|
21天前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
1月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
72 4
|
3月前
|
运维 监控 安全
从实践到自动化:现代运维管理的转型与挑战
本文探讨了现代运维管理从传统人工模式向自动化转型的必要性与路径,分析了传统运维的痛点,如效率低、响应慢、依赖经验等问题,并介绍了自动化运维在提升效率、降低成本、增强系统稳定性与安全性方面的优势。结合技术工具与实践案例,文章展示了企业如何通过自动化实现运维升级,推动数字化转型,提升业务竞争力。
|
7月前
|
机器学习/深度学习 人工智能 运维
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
302 14
|
8月前
|
监控 jenkins 测试技术
Ansible与Jenkins:自动化工具的对比
Ansible和Jenkins是自动化领域的两大巨头。Ansible专注于配置管理和任务自动化,采用无代理架构,使用YAML定义配置,具有幂等性和可扩展性。Jenkins则擅长持续集成和持续交付(CI/CD),支持丰富的插件生态系统,适用于自动化构建、测试和部署。两者各有优势,Ansible适合配置管理与大规模部署,Jenkins则在CI/CD方面表现出色。结合使用可创建更强大的自动化工作流,提升团队生产力和软件质量。选择工具时应根据具体需求决定。
|
9月前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化事件响应:智慧运维新时代
基于AI的自动化事件响应:智慧运维新时代
431 11
|
7月前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化服务器管理:解锁运维的未来
基于AI的自动化服务器管理:解锁运维的未来
705 0
|
10月前
|
运维 Ubuntu 应用服务中间件
自动化运维之路:使用Ansible进行服务器管理
在现代IT基础设施中,自动化运维已成为提高效率和可靠性的关键。本文将引导您通过使用Ansible这一强大的自动化工具来简化日常的服务器管理任务。我们将一起探索如何配置Ansible、编写Playbook以及执行自动化任务,旨在为读者提供一条清晰的路径,从而步入自动化运维的世界。
189 11
|
10月前
|
运维 网络安全 Python
自动化运维:使用Ansible实现批量服务器配置
在快速迭代的IT环境中,高效、可靠的服务器管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具,来简化和加速批量服务器配置过程。我们将从基础开始,逐步深入到更复杂的应用场景,确保即使是新手也能跟上节奏。文章将不包含代码示例,而是通过清晰的步骤和逻辑结构,引导读者理解自动化运维的核心概念及其在实际操作中的应用。

热门文章

最新文章

下一篇
开通oss服务