一、什么是Ansible
Ansible是一种开源的自动化工具,用于配置管理、应用程序部署、任务自动化和多台计算机系统之间的协调。它是一种基于Python语言的配置管理和自动化平台。通过SSH管理受控节点,将各种模块小程序推送到受控节点,并完成playbook的任务,完成后受控节点会自动删除这些模块。
Ansible的特点:
1.声明性语法: Ansible使用YAML语言来描述配置文件
2.无需客户端: Ansible不需要在被管理的主机上安装客户端,只需在控制节点上安装即可。这简化了部署和配置过程。
3.模块化: Ansible使用模块执行任务,这些模块可以用于各种操作,如文件操作、软件包管理、服务管理等。
4.可扩展性: Ansible可以轻松地与现有的工具和脚本集成,也可以通过编写自定义模块扩展其功能。
5.剧本和角色: Ansible使用剧本(Playbooks)来定义一系列任务的执行流程,并且这些任务可以组织成角色,方便复用和共享。
6.实时任务执行: Ansible采用SSH协议与远程主机进行通信,实时执行任务,同时可以在执行中收集并输出有关主机状态的信息。
二、Ansible的清单文件(inventory)
1.清单文件的定义:清单文件是Ansible管理主机的集合。这些主机可以分配到组中,以进行集中管理。组也可以包含子组。
2.清单文件可分为两种,一是使用文件定义的静态清单,二是通过外部信息提供程序,使用Ansible插件按需生成动态主机清单。
3.清单文件的文件格式包括INI或YAML,INI格式最为常见。
INI格式:
[web]
web1.example.com
web2.example.com
192.0.2.42
[db-server]
db1.example.com
db2.example.com
[production:children]
web
db-server
INI格式的清单文件中,主机名或IP地址每行一个,[ ]是主机组,通过:children的主机名称来实现嵌套组
重要
两个主机组始终存在:
1. all主机组中含有清单中明确列出的每个主机
2. ungrouped主机组中含有清单中明确列出、但不属于任何其他组的每个主机(即包含未分组的主机)
4.通过范围简化主机清单
[START:END]
范围匹配从START到END(含)的所有值
例如:
[a:c].dns.example.com可匹配名为a.dns.example.com、b.dns.example.com、c.dns.example.com
192.168.[4:7].[0:255]可匹配192.168.4.0到192.168.7.255的所有主机
5.默认清单文件
/etc/ansible/hosts文件被视为系统默认的静态清单文件。但是,一般都不使用该文件,而是指定其他位置的清单文件,在ansible项目的配置文件ansible.cfg中指定清单文件inventory的路径。或者在运行playbook时使用 -i 选项指定清单文件的路径。
注意:
清单文件要创建在Ansible项目目录下,项目目录就是创建在家目录下用于隔离不同ansible项目的目录。
三、Ansible的配置文件
在ansible项目目录下创建名为ansible.cfg的文件用于配置anisble的行为。
Ansible配置文件由几部分组成,每一部分含有以键值对形式定义的设置。部分的标题以方括号括起。对于基本操作,请使用以下两个部分:
[defaults],用于设置Ansible操作的默认值
[privilege_escalation],用于配置Ansible如何在受管主机上执行特权升级。
[defaults]
inventory = ./inventory
remote_user = user
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
inventory指定清单文件的路径
remote_user在ansible连接受管主机的用户名
ask_pass是否输入SSH密码,如果使用SSH公钥身份验证,则为false
当执行任务权限不够时,需要提升权限
become为是否提权
become_method提权的方法
become_user提权成什么用户
become_ask_pass使用sudo进行权限升级时,是否需要输入密码
注意:
在/etc/sudoers中有一行
%wheel ALL=(ALL) NOPASSWD: ALL
这个wheel是支持sudo命令的用户组,这个NOPASSWD: ALL字段是指用户在使用sudo命令时不需要输入自己密码,只有这里配置了NOPASSWD: ALL,become_ask_pass = false才会生效,如果不配置则become_ask_pass配置项则不会生效
四、剧本(playbook)
Playbook由一个或多个任务组成。每个任务定义了一项工作,例如安装软件包、配置文件、启动服务等。任务是由Ansible模块执行的,模块是Ansible的基本执行单元,负责执行特定的功能。
下例是一个具有单个任务的playbook:
---
- name: Configure important user consistently
hosts: servera.lab.example.com
tasks:
- name: Newbie exists with UID 4000
ansible.builtin.user:
name: newbie
uid: 4000
state: present
Playbook是以YAML格式编写的文本文件,通常使用.yml拓展名保存。
Playbook以三个破折号- - -开头,Playbook本身是一个键值对集合。
上面的示例中有三个键值对:name、hosts和tasks。这三个键均按相同方式缩进。
YAML的缩进基本规则:
1.处于层次结构中同一级别的数据元素必须具有相同的缩进量
2.如果项目属于其他项目的子项,其缩进量必须大于父项
注意:使用空格缩进,不要使用制表符(Tab),因为Tab是四个空格。
或者配置vim的配置文件,
在$HOME/.vimrc文件中添加如下内容,将Tab设置为两个空格,并自动缩进。
autocmd FileType yaml setlocal ai ts=2 sw=2 et