Ansible 自动化运维工具

本文详细介绍了Ansible这一自动化运维工具,包括其无代理架构、简单易学的特点,以及SSH连接方式。文章讨论了Ansible的优点,如幂等性和模块化设计,同时也指出其对Windows支持不足的缺点。讲解了Ansible的安装、Inventory配置,特别是秘钥连接的设置。此外,还深入探讨了Ansible的常用模块,如command、shell、file、copy、user等,以及它们在自动化运维中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 简介

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppetcfenginecheffuncfabric)的优点。实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架

Ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一

Ansible的优缺点

优点

1、Agentless:去中心化
2、Stupied Simple ,上手简单,学习曲线平滑
3、SSH by default ,安全,无需安装客户端
4、配置简单、功能强大、扩展性强
5、支持API及自定义模块,可通过Python轻松扩展
6、通过Playbooks来定制强大的配置、状态管理
7、提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台
8、幂等性:一种操作重复多次结果相同

缺点

1、windows系统的排斥(服务端无法安装在windows
2、运行效率较低(task任务是串行运行;多台设备同时运行一个task,有并发数限制)

Ansible的架构

架构说明
Ansible Ansible的核心程序
Host Lnventory 记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载
Playbooks YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能
Core Modules Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机
Custom Modules 自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写
Connection Plugins 连接插件,AnsibleHost通信使用

一、Ansible的安装及使用

 准备环境

系统 IP 主机名称 角色
CentOS 7.4 192.168.2.10 Ansible 管理节点
CentOS 7.4 192.168.2.11 node1 节点1
CentOS 7.4 192.168.2.12 node2 节点2

1、安装Ansible

下载ansible源码包:Ansible.rar

下载完成后先在自己电脑里面解压在上传

                 
[root@Ansible ~]# vim /etc/yum.repos.d/centOS7.repo     修改yum源
.......
...

[ansibe]                        #添加内容
baseurl=file:///root/ansible
enabled=1
gpgcheck=0

保存


[root@Ansible ~]# yum -y install ansible            
................
.....
..

 2、lnventory内置参数


   ansible_ssh_host:               #定义hosts ssh地址

   ansible_ssh_port:               #定义hosts ssh端口

   ansible_ssh_user:               #定义hosts ssh认证用户

   ansible_ssh_pass:               #定义hosts ssh认证密码

   ansible_sudo:                   #定义hosts sudo用户

   ansible_sudo_pass:              #定义hosts sudo密码

   ansible_sudo_exe:               #定义host sudo路径;sudo 命令路径(适用于1.8及以上版本)

   ansible_connection:             #定义hosts连接方式
                                   #与主机的连接类型(比如:local, ssh 或者 paramiko):
                                   #Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart'
                                   #'smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行

  ansible_ssh_private_key_file:    #定义hosts私钥
 
  ansible_shell_type:              #定义hosts shell类型
                                   #目标系统的shell类型.默认情况下,
                                   #命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'

  ansible_python_interpreter:      #定义hosts 任务执行python路径

  ansible_*_interpreter:           #定义hosts其他语言解析路径

  ansible_ssh_private_key_file:   #ssh 使用的私钥文件;适用于有多个密钥,而不使用 SSH 代理的情况

  ansible_python_interpreter       #目标主机的 python 路径
                                   #适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python"
                                   #比如  \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python
                                   #不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确
                                   #且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26). 
                                   #与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....                                                                             

3、ansible的常用参数

参数 说明
-m 要执行的模块,默认为command
-a 指定模块的参数
-u ssh连接的用户名,默认用rootansible.cfg中可以配置
-b --become:变成那个用户身份,不提示密码
-k 提示输入ssh登录密码,当使用密码验证的时候用
-s sudo运行
-U sudo到哪个用户,默认为root
-K 提示输入sudo密码,当不是NOPASSWD模式时使用
-C 只是测试一下会改变什么内容,不会真正去执行
-c 连接类型(default=smart)
-f fork多少进程并发处理,默认为5
-i 指定hosts文件路径,默认default=/etc/ansible/hosts
-I 指定pattern,对已匹配的主机中再过滤一次
-list-host 只打印有哪些主机会执行这个命令,不会实际执行
-M 要执行的模块路径,默认为/usr/share/ansible
-o 压缩输出,摘要输出
--private-key 私钥路径
-T ssh连接超时时间,默认是10
-t 日志输出到该目录,日志文件名以主机命名
-v 显示详细日志

4、lnventory文件的配置

 4.1、密码连接

            第一次连接需要输入yes,执行以下操作,如不操作会报错
[root@Ansible ~]# vi /etc/ansible/ansible.cfg                 
............
     62 host_key_checking = False                #让该命令生效删除#号
............

保存

   方式一:
[root@Ansible ~]# vim /etc/ansible/hosts            
..............
........... 
[node1]          
192.168.2.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com             

[node2]                
192.168.2.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com                   

保存


   方式二:

[node]
192.168.2.11 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com        
192.168.2.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com         


   方式三:

[node]
192.168.2.[11:12] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123.com        

   方式四:  需要配置秘钥才能实现

[node1]
192.168.2.11

[node2]
192.168.2.12
[node:children]      #[名称:children(固定的)]
node1
node2
[root@Ansible ~]# ansible node1 -m ping
192.168.2.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

 4.2、秘钥连接

 生成秘钥并传输给node1,node2

[root@Ansible ~]# ssh-keygen            
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:qfRxoDOzgmuHxg9WHPGAMcSCrzgJM6uQJaB5kiTlIeI root@Ansible
The key's randomart image is:
+---[RSA 2048]----+
|++*oo            |
|B+oo +           |
|=E. . . .        |
|X +. . . o       |
|o%  o * S .      |
|O  o . B o       |
|oo+.. o .        |
|..=o..           |
| o.o.            |
+----[SHA256]-----+

[root@Ansible ~]# ssh-copy-id -i 192.168.2.11
...........
[root@Ansible ~]# ssh-copy-id -i 192.168.2.12
...........

 4.3、输出的颜色进行判断

 Ansible执行的时候根据结果会显示颜色
蓝色(或绿色 执行成功并且不需要做改变的操作
黄色 执行成功并且对目标主机做变更
红色 执行失败
紫色 警告消息

颜色的显示与changed的状态相关联,并可以在ansible.cfg中进行定制颜色的设定

其他颜色可以参考官网配置文件介绍

 ansible.cfg配置文件官方详介:Ansible Configuration Settings — Ansible Documentation


[root@Ansible ~]# vi /etc/ansible/ansible.cfg
................
........
[colors]
#highlight = white
#verbose = blue             #详细消息
#warn = bright purple       #警告消息
#error = red                #错误消息
#debug = dark gray          #调试消息
#deprecate = purple         #弃用消息
#skip = cyan                #已跳过任务状态
#unreachable = red          #无法到达
#ok = green                 #正常任务状态
#changed = yellow           #已更改任务状态
#diff_add = green
#diff_remove = red
#diff_lines = cyan
..............
.....

——————————————————————————————

           可以自定义设置颜色 官方已经给很多的颜色可以选择 ;修改完后去掉注释

 5、Ansible命令格式

 命令语法:ansible < host-pattern > [-m module_name] [-a args]

说明
< host-pattern> 

尖括号表示不可省

1、在资产文件中的组名

2、资产文件中的IP或主机名

3、all文件资产文件中的所有主机

[-m module_name] 

中括号表示此选项可省

此参数为模块名

[-a args] 模块对应的参数,有些模块没有参数

5.1、主机与组的格式 

单台主机或组


   -----组
[root@Ansible ~]# ansible node1 -m ping             
192.168.2.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

  -------主机
[root@Ansible ~]# ansible 192.168.2.11 -m ping           
192.168.2.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

多台主机或组


   -----组
[root@Ansible ~]# ansible node1,node2 -m ping                
192.168.2.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.2.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

   -----主机
[root@Ansible ~]# ansible 192.168.2.11,192.168.2.12 -m ping               
192.168.2.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.2.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

所有目标


[root@Ansible ~]# ansible all -m ping                
192.168.2.11 | SUCCESS => { 
    "changed": false, 
    "ping": "pong"
}
192.168.2.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

5.2、组匹配

查看组信息


  --------查询单个组的主机
[root@Ansible ~]# ansible node1 --list
  hosts (1):
    192.168.2.11

  --------查询全部组的主机
[root@Ansible ~]# ansible all --list
  hosts (2):
    192.168.2.12
    192.168.2.11

匹配node1组中有的,但是node2组中没有的所有主机


[root@Ansible ~]# vim /etc/ansible/hosts              
.............
[node1]
192.168.2.11
[node2]
192.168.2.12

保存

[root@Ansible ~]# ansible 'node1:!node2' -m ping -o            
192.168.2.11 | SUCCESS => {"changed": false, "ping": "pong"}

 匹配node1组和node2组都有的主机(交集)


[root@Ansible ~]# vim /etc/ansible/hosts                  
...........
.....
[node1]
192.168.2.11
192.168.2.12
[node2]
192.168.2.12

保存

[root@Ansible ~]# ansible 'node1:&node2' -m ping -o              
192.168.2.12 | SUCCESS => {"changed": false, "ping": "pong"}

 匹配node1node2两个组的所有主机(并集)


[root@Ansible ~]# ansible 'node1:node2' -m ping -o            
192.168.2.11 | SUCCESS => {"changed": false, "ping": "pong"}
192.168.2.12 | SUCCESS => {"changed": false, "ping": "pong"}

  ——————————     同

[root@Ansible ~]# ansible node1,node2 -m ping                
192.168.2.12 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.2.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

二、Ansible 的常用模块

1、Ansible-doc命令

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

格式:ansible-doc [options] [module……]


[root@Ansible ~]# ansible-doc -l         #列出支持的模块
.........
....

[root@Ansible ~]# ansible-doc -l| wc -l          
1852

[root@Ansible ~]# ansible-doc ping      #查询ping模块的说明信息
....
....           # q 退出

2、执行命令相关模块

 2.1、command模块

command模块是默认的,用于在给的的节点上运行系统命令,比如echo hello
它不会通过shell处理命令,因此不支持像$HOME这样的变量和,以及<、>、|、;、& 等都是无效的。也就是在command模块中无法使用特殊符号

参数 必选 说明
chdir no 运行command命令前先cd到这个目录
creates no 如果这个参数对应的文件存在,就不运行command
free_form yes 需要执行的脚本(没有真正的参数为free_form
executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径
removes no 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘浪初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值