一.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特性
简单性: Ansible 设计简单直观,使用 YAML 语法描述任务和配置,易于理解和学习。
无代理: Ansible 不需要在被管理的主机上安装代理,只需通过 SSH 或 PowerShell 远程管理即可,降低了部署和维护的复杂性。
基于模块: Ansible 使用模块化的方式管理系统,每个任务都是通过调用模块来实现的,支持丰富的模块库。
声明式语法: 使用 YAML 描述任务和配置的声明式语法,让用户可以清晰地定义系统状态和所需的配置。
可扩展性: Ansible 可以轻松扩展,支持自定义模块和插件,满足各种复杂环境和特定需求。
剧本(Playbooks): Ansible 使用 Playbooks 来组织和描述多个任务的执行顺序和条件,支持任务的并行执行和序列化执行。
强大的社区支持: Ansible 拥有活跃的社区,提供大量的模块和插件,同时有丰富的文档和示例供用户参考。
多平台支持: Ansible 可以管理多种操作系统和云平台,包括 Linux、Windows、VMware、AWS、Azure 等。
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
3.Ansible架构
库存 (Inventory):
- 库存文件定义了受控节点的信息,包括它们的分组和连接方式。
- 库存文件可以是简单的 INI 格式,也可以是复杂的 YAML 格式,还可以从动态库存脚本中生成。
模块 (Modules):
- 模块是完成特定任务的独立脚本,如安装软件包、管理服务和配置文件等。
- Ansible 在运行过程中将模块临时复制到受控节点并执行。
插件 (Plugins):
- 插件扩展了 Ansible 的功能,包括连接插件、回调插件、过滤插件等。
- 插件在 Ansible 的不同操作阶段提供额外的功能和灵活性。
- 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:2222ansible_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'
查看文件是否存在