运维自动化之ANSIBLE

发布于:2024-06-25 ⋅ 阅读:(133) ⋅ 点赞:(0)

一.ANSIBLE的简要介绍

Ansible 是一个开源的自动化工具,用于配置管理、应用部署、任务自动化以及 IT 编排。它由 Michael DeHaan 于 2012 年创建,并已成为 IT 运维和 DevOps 工具链中的重要组成部分。

1.功能介绍

  1. 配置管理(Configuration Management)

Ansible 能够自动化配置文件的管理和系统设置,确保所有系统具有一致的配置。这包括安装软件包、管理文件和目录、配置网络设置等。

  2. 应用部署(Application Deployment)

Ansible 可以自动化应用程序的部署过程,从代码库中获取代码、编译、打包到最终部署在服务器上。它支持多种语言和框架,可以与 CI/CD 工具集成,实现持续交付。

  3. 编排(Orchestration)

Ansible 可以协调多个节点之间的复杂任务,并确保它们按正确的顺序执行。例如,在多层应用中,可以先部署数据库,再部署应用服务器,最后部署前端。

  4. 任务自动化(Task Automation)

通过剧本(Playbooks),用户可以自动执行重复性的任务,如备份、日志清理、用户管理等。这些任务可以在指定的时间或事件触发时自动运行。

  5. 云管理(Cloud Provisioning)

Ansible 支持多种云平台(如 AWS、Azure、Google Cloud Platform)的资源管理和配置。用户可以使用 Ansible 自动化创建和配置云资源,如虚拟机、存储、网络等。

  6. 网络自动化(Network Automation)

Ansible 提供了专门的网络模块,用于自动化配置网络设备(如路由器、交换机、防火墙)的操作。它支持多种网络供应商和设备类型。

  7. 安全合规(Security and Compliance)

Ansible 可以帮助实施和验证安全策略,确保系统符合企业或法规要求。它可以自动化补丁管理、安全设置和合规检查。

  8. 多租户支持和访问控制(Multi-Tenancy and Access Control)

Ansible Tower(企业版)提供了角色和权限管理功能,支持多租户环境中的细粒度访问控制,确保不同团队或用户只访问他们有权限的资源。

  9. 集成和扩展(Integration and Extensibility)

Ansible 提供了丰富的 API 和插件系统,允许与其他系统和工具集成。用户可以编写自定义模块和插件,以满足特定需求。

  10. 高可用性和弹性(High Availability and Scalability)

Ansible Tower 提供了高可用性和扩展性特性,支持大规模分布式环境中的自动化任务管理。

  11. 报告和审计(Reporting and Auditing)

Ansible Tower 提供了详细的执行报告和审计日志,帮助用户了解每个自动化任务的执行情况和结果,便于问题排查和合规管理。

  12. 可移植性(Portability)

由于 Ansible 使用无代理架构,并通过 SSH 或 WinRM 与目标主机通信,它可以在多种操作系统和环境中工作,包括物理服务器、虚拟机、容器等。

2.ANSIBLE特性

  1. 简单性: Ansible 设计简单直观,使用 YAML 语法描述任务和配置,易于理解和学习。

  2. 无代理: Ansible 不需要在被管理的主机上安装代理,只需通过 SSH 或 PowerShell 远程管理即可,降低了部署和维护的复杂性。

  3. 基于模块: Ansible 使用模块化的方式管理系统,每个任务都是通过调用模块来实现的,支持丰富的模块库。

  4. 声明式语法: 使用 YAML 描述任务和配置的声明式语法,让用户可以清晰地定义系统状态和所需的配置。

  5. 可扩展性: Ansible 可以轻松扩展,支持自定义模块和插件,满足各种复杂环境和特定需求。

  6. 剧本(Playbooks): Ansible 使用 Playbooks 来组织和描述多个任务的执行顺序和条件,支持任务的并行执行和序列化执行。

  7. 强大的社区支持: Ansible 拥有活跃的社区,提供大量的模块和插件,同时有丰富的文档和示例供用户参考。

  8. 多平台支持: Ansible 可以管理多种操作系统和云平台,包括 Linux、Windows、VMware、AWS、Azure 等。

  9. 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对

3.Ansible架构

  1. 库存 (Inventory):

    • 库存文件定义了受控节点的信息,包括它们的分组和连接方式。
    • 库存文件可以是简单的 INI 格式,也可以是复杂的 YAML 格式,还可以从动态库存脚本中生成。
  2. 模块 (Modules):

    • 模块是完成特定任务的独立脚本,如安装软件包、管理服务和配置文件等。
    • Ansible 在运行过程中将模块临时复制到受控节点并执行。
  3. 插件 (Plugins):

    • 插件扩展了 Ansible 的功能,包括连接插件、回调插件、过滤插件等。
    • 插件在 Ansible 的不同操作阶段提供额外的功能和灵活性。
  4. API:供第三方程序调用的应用程序编程接口

二.Ansible安装和入门

1.本地yum安装

########yum源安装###############
[root@node1 yum.repos.d]#vim CentOS-Base.repo 
#加入 epel源
[epel]
name=gn
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
        https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
        https://mirrors.huaweicloud.com/epel/$releasever/x86_64
        https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
gpgcheck=0


[root@node1 yum.repos.d]#yum info  ansible
已加载插件:fastestmirror, langpacks
base                                                                                | 3.6 kB  00:00:00     
epeel                                                                               | 4.7 kB  00:00:00     
extras                                                                              | 2.9 kB  00:00:00     
updates                                                                             | 2.9 kB  00:00:00     
(1/3): epeel/7/group_gz                                                             |  96 kB  00:00:00     
(2/3): epeel/7/updateinfo                                                           | 1.0 MB  00:00:00     
(3/3): epeel/7/primary_db                                                           | 7.0 MB  00:00:04     
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * epeel: mirrors.aliyun.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
可安装的软件包
名称    :ansible
架构    :noarch
版本    :2.9.25
发布    :1.el7
大小    :17 M
源    :epeel/7
简介    : SSH-based configuration management, deployment, and task execution system
网址    :http://ansible.com
协议    : GPLv3+
描述    : Ansible is a radically simple model-driven configuration management,
         : multi-node deployment, and remote task execution system. Ansible works
         : over SSH and does not require any software or daemons to be installed
         : on remote nodes. Extension modules can be written in any language and
         : are transferred to managed machines automatically.



[root@node1 yum.repos.d]#yum install ansible -y
yum install epel-release.noarch  -y
yum install ansible -y

2.编译安装

#############编译安装#########################
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible

###############Git方式#######################
yum install git
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

3.查看基本信息

[root@localhost yum.repos.d]# ansible --version

4.相关文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件

  • /etc/ansible/hosts 主机清单

  • /etc/ansible/roles/ 存放角色的目录

5.ansible主配置文件

Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下

ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg   #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg  #系统默认配置文件

Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改

[defaults]
#inventory     = /etc/ansible/hosts     #主机列表配置文件
#library = /usr/share/my_modules/         #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp         #临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp     #本机的临时命令执行目录
#forks         = 5                       #默认并发数
#sudo_user     = root                     #默认sudo 用户
#ask_sudo_pass = True                     #每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22
#host_key_checking = False                 #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log             #日志文件,建议启用
#module_name = command           、mod        #默认模块,可以修改为shell模块
[privilege_escalation]                     #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

5.inventory主机清单文件

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织

官方文档:How to build your inventory — Ansible Community Documentation

默认的inventory file 位置在:

/etc/ansible/hosts

参数详细说明

ansible_ssh_host 
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port 
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222

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",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

6.示例:

(1)配置远程主机清单

vim  /etc/ansible/hosts
[web]                  #配置组名
192.168.240.12         #组中成员ip
192.168.240.13

(2)设置免密登录

免密登录脚本

#!/bin/bash
PASS=123
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
 
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
 
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait
 
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
 
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

7.ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具

  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字

  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本

  • /usr/bin/ansible-pull 远程执行命令的工具

  • /usr/bin/ansible-vault 文件加密工具

  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具

  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

8.ansible格式和选项

格式:

ansible <host-pattern> [-m module_name] [-a args]
命令     主机或者清单中的组 -m 指定模块      -a  执行的任务

选项

选项 说明
--version #显示版本
-m module  #指定模块,默认为command
-v  #详细过程 -vv -vvv更详细
--list-hosts      #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT  #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER      #执行远程执行的用户,默认root
-b, --become  #代替旧版的sudo 切换
--become-user=USERNAME  #指定sudo的runas用户,默认为root  vim /etc/sudoers 用户权限
-K,  --ask-become-pass  #提示输入sudo时的口令
-f   FORKS, --forks FORKS  #指定并发同时执行ansible任务的主机数
ansible-doc -l #查看所有支持的模块
ansible-doc ping #该模块的详细信息
ansible-doc file #查看file模块的详细信息

示例:

在本地执行,指定模块ping 

9.ansible命令执行过程

1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
#[root@node1 ~]#ansible all -a "sleep 100" -f4
#cd /root/.ansible/tmp
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出

$HOME 为当前用户的家目录

执行返回结果

  • 绿色:执行成功并且不需要做改变的操作

  • 黄色:执行成功并且对目标主机做变更

  • 红色:执行失败

10.ansible-console

ansible-console是 Ansible 提供的一种交互式命令行界面(CLI),允许用户在控制台中直接运行 Ansible 模块和命令。它类似于一个 REPL(Read-Eval-Print Loop)环境,方便用户即时执行和测试 Ansible 命令,而不需要编写和运行完整的 Ansible playbook。

三.Ansible模块

2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块

常用模块帮助文档参考:

https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html ​​https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

1.Command模块

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项

注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现

注意:此模块不具有幂等性

注意:不支持一些重定向等功能

示例:

远程执行在12 ,13上创建ky36.txt文件和查看文件

2.shell 模块

功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >

注意:此模块不具有幂等性

示例:

[root@localhost ~]# ansible web -m shell -a "echo hello > /opt/hello.txt"
#如果没有明确指明文件生成的目录,会默认在家目录下生成
[root@localhost ~]# ansible web -m shell -a "cat /opt/hello.txt"

修改默认模块

vim  /etc/ansible/ansible.cfg

3.Script 模块

功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)

注意:此模块不具有幂等性

示例:

在ansible服务器的/data目录下创建脚本test.sh 

远程执行ansible服务器上的脚本,注意路径为/data目录下,在主目录下应为/root

4.copy模块

功能:从ansible服务器主控端复制文件到远程主机

注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件

关键字

src       代表源文件路径
dest      代表文件落地路径
owner     属主
group     属组
mode      代表权限
backup  如果复制时有同名文件会先备份再复制

示例:

ansible web -m copy -a "src=/etc/passwd dest=/data/ owner=zhangsan mode=700"
#将ansible服务器主控端复制文件/etc/passwd到远程主机/data/下,属主为zhangsan 权限为700

etc      不加      /       连etc  一起复制
etc       加          /           只复制etc下的文件

5.Get_url 模块

功能: 用于将文件从http、https或ftp下载到被管理机节点上

url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force:如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件

checksum:对目标文件在下载后计算摘要,以确保其完整性
url_username:用于HTTP基本认证的用户名。对于允许空密码的站点,此参数可以不使用`url_password'
url_password:用于HTTP基本认证的密码。如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs:如果“no”,SSL证书将不会被验证。适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位

示例:

ansible web -m get_url -a "url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt"

6.Fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

示例:

将远程主机上的/etc/passwd文件 提取到ansible的主控端/data/目录下

ansible  web -m fetch -a "src=/etc/passwd  dest=/data"

将远程主机上的/var/log/messages文件 提取到ansible的主控端/data/目录下

ansible服务器切换到目录/data/下,使用tree命令查看文件

7.File模块

功能:设置文件属性,创建软链接等

关键字:

path       指定文件路径
state      文件状态 有:新建(touch) 删除(absent) 文件夹(directory)  连接文件(link)等
src        源文件
mode       权限
owner      属主
group      属组
recurse    递归

示例:

(1)创建空文件

ansible web -m file -a 'path=/mnt/web.txt state=touch owner=zhangsan group=zhangsan mode=755'

(2)新建目录

ansible web -m file -a 'path=/mnt/web state=directory'

(3)新建软链接

ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name   这三个选项都可以使用

(4)删除文件

ansible web -m file -a 'path=/opt/web-link state=absent'

8.stat 模块

功能:检查文件或文件系统的状态

注意:对于Windows目标,请改用win_stat模块

选项

path:文件/对象的完整路径(必须)

常用的返回值判断:

exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配

示例:

ansible web -m stat -a 'path=/mnt/test.txt'
查看文件是否存在


网站公告

今日签到

点亮在社区的每一天
去签到