Ansible架构、主机清单以及配置文件介绍

ansible介绍:

ansible是基于python语言实现,配置简单、扩展性很强的一款开源的自动化运维工具,能够实现批量系统配置、批量程序部署、批量运行命令等功能;它是基于模块工作的,本身没有批量部署能力,真正具有批量部署的是ansible所运行的模块;

ansible基本架构:

Ansible :核心程序

Host Inventory(主机清单):记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。

Playbooks(剧本):YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

Core Modules(核心模块):Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Module(自定义模块):完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

plugins (插件):完成较小型的任务,辅助模块来完成某个功能

Connection Plugins(连接插件):ansible基于连接插件连接到各个主机上,默认是基于SSH连接到目标机器上执行操作的,但是它还支持其他的连接方法,所以需要有连接插件,管理端支持local 、ssh、paramiko三种方式连接被管理端。

ansible用到的python的三个模块:

 paramiko   模拟ssh协议批量管理主机

 jinja2  模板语言,主要用来传递变量

 yaml  相当于是一种编程语言

ansible工作原理

    Ansible在执行任务前,首先与管理主机建立连接,创建$HOME/.ansible/tmp/临时文件夹/,并生成以模块命名的Python文件,调用subprocess.popen()方法执行python脚本,返回任务执行结果,最终删除$HOME/.ansible/tmp/临时文件夹/。不同的是链接是local方式则是在ansible本端生成临时文件夹及其python脚本(如synchronize模块),而建立的连接是ssh方式则是在ansible管理端生成(如copy模块)。

Inventory文件:

记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等, 默认的文件路径为 /etc/ansible/hosts,ansible 可同时操作属于一个组的多台主机,组和主机之间的关系也通过 inventory 文件配置;除了默认的文件外,还可以自定义创建inventory,也可以使用动态inventory。动态的inventory文件是能动态的输出被管理主机,动态inventory文件的原理就是一个脚本,大部分都是python的脚本。动态inventory文件能连接到某个管理系统节点的信息数据库,并将节点信息以特定格式输出(绝大多数都是josn格式),也就是说动态inventory文件输出的主机信息是管理节点信息数据库的内容,当管理节点数据库的内容发生变化时,动态的inventory文件也会发生变化。

/etc/ansible/hosts文件格式

[webservers]                        
alpha.example.org             
beta.example.org     
192.168.1.100                    
192.168.1.110

[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57

方括号[]中是组名,用于对系统进行分类,便于对不同系统进行个别的管理;每个组后面可以跟IP,也可以跟主机名。

端口号不是默认设置时,可明确的表示为:

[webservers]

beta.example.org :3456

如果有主机的SSH端口不是标准的22端口,可在主机名之后加上端口号,用冒号分隔。

 如果有一组有连续的IP或者主机名也可像下面这样写:

[testhost]
192.168.131.[1:100]            #代表IP地址为192.168.131.1-192.168.131.100的主机
192.168.[1:100].[100:200]   #跟上面差不多一个意思
[testhost1]   
server[a:e]                         #主机名为servera - servere的主机

ansible的主机清单配置除了配置主机到文件中外,还可以配置其它信息,如连接被管理端的用户,密码,端口等,例如:

[group1]
test1 ansible_user=root ansible_pass=123456 ansible_host=192.168.5.1 ansible_port=22  
test2 ansible_user=root ansible_pass=123456 ansible_host=192.168.5.2 ansible_port=22

不仅仅可以主机的变量,也可以定义组的变量,例如:

[webservers]
192.168.1.100
192.168.1.110

[webservers:vars]
ssh_port=22
ansible_ssh_user=lizf
ansible_ssh_pass=JDHObnfa131@

嵌套组:

[apache]
http1.example.org
http2.example.org

[nginx]
ngx1.example.org
ngx2.example.org

[webservers:children]        #嵌套组必须要有:children
apache
nginx

webservers这个组包含apache和nginx这两个组的所有主机

inventory变量参数:

ansible_ssh_host : 将要连接的远程主机名,与你想要设定的主机的别名不同的话可通过此变量设置。

ansible_ssh_port  :ssh端口号,如果不是默认的端口号,通过此变量设置。

ansible_ssh_user :默认的 ssh 用户名

ansible_ssh_pass:ssh 密码(这种方式并不安全,强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass:sudo 密码(这种方式并不安全,强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8): sudo 命令路径(适用于1.8及以上版本)

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

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

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

ansible_python_interpreter:目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python"、

ansible配置文件

ansible的配置文件不是全局的,任何用户都可以有自己的配置文件,如果不想使用ansible自带的配置文件,可以自己创建。

如何查看你当前正在使用的ansible配置文件

[root@localhost ~]# ansible --version | grep 'config file'
config file = /etc/ansible/ansible.cfg

ansible的配置文件有4种形式可以指定,4种指定方式优先级是不同的

1、如果没有任何的其他ansible配置文件,默认会使用/etc/ansible/ansible.cfg。

2、家目录下的.ansible.cfg优先级高于/etc/ansible/ansible.cfg

[lizf@localhost ~]$ ansible --version | grep 'config file'
config file = /home/lizf/.ansible.cfg

3、当前目录下的ansible.cfg优先级高于家目录下的.ansible.cfg  #使用频率最高

[root@localhost home]# touch ansible.cfg
[root@localhost home]# ansible --version | grep 'config file'
config file = /home/ansible.cfg

 4、ANSIBLE_CONFIG变量指定的配置文件优先级最高

[root@localhost home]# touch /tmp/ansible.cfg
[root@localhost home]# export ANSIBLE_CONFIG=/tmp/ansible.cfg
[root@localhost home]# ansible --version | grep 'config file'
config file = /tmp/ansible.cfg

Ansible 将会按以上顺序逐个查询这些文件,直到找到一个为止,并且使用优先找到的配置文件中的配置,而且这些配置将不会被叠加。

下面介绍一下配置文件的参数:

[defaults]

#inventory = /etc/ansible/hosts               #表示配置文件默认使用的inventory清单是/etc/ansible/hosts文件
#library = /usr/share/my_modules/          #ansible操作的动作,无论是本地或者远程,都使用一小段代码来执行,这小段代码称之为模块,这个library就是用来存放这些模块的路径
#forks = 5                                                #ansible默认操作主机的并发数
#sudo_user = root                                   #这是默认的执行命令的用户,也可以在playbook中重新设置这个参数
#ask_sudo_pass = True                          #用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no

#remote_user = ergou                             #表示该配置文件用ergou这个用户去ssh连接

#ask_pass = True                                    #表示用ergou这个用户去ssh连接时提示输入密码,如果将True改为False则不提示输入密码

#remote_port = 22                                   #这个指定连接被管理节点的端口,默认是22,除非设置了特殊的ssh端口
#module_lang = C                                    #默认模块和系统之间通信的计算机语言,默认为’C’语言
#module_set_locale = False
#host_key_checking = False                    #这是设置是否检查ssh秘钥,可以设置为False和True #重点
#timeout = 10                                             #ssh连接超时时间
#log_path = /var/log/ansible.log ansible     #默认是不记录日志的,如果想把ansible系统输出的日志存放到文件中可以开启这个选项
#private_key_file = /path/to/file                  #使用ssh公钥私钥登录系统的时候,使用的秘钥路径

[privilege_escalation]                                 #如果你remote_user是root,就不需要提权设置,如果是普通用户,就需要提权操作
become=True                                             #True表示需要提权,False表示不需要提权
become_method=sudo                              #表示提权的方式为sudo提权
become_user=root                                    #表示提权到root用户
become_ask_pass=true                             #True表示提权的时候需要输入密码,False表示不需要输入密码

注:作为remote_user,想要提权首先要在被管理主机里面配置sudoers,使被提权用户在被管理主机上有sudo权限才可以提权;sudoers文件中也可以设置sudo命令不使用密码提权。

posted @   李志锋  阅读(612)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示