在那些免费网站做宣传效果好,网站色彩的应用,wordpress插件密钥实现,广州网站制作公司排名一、Ansible概述
1.1 什么是Ansible
Ansible 是一个开源的自动化工具#xff0c;用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件#xff08;剧本#xff0c;Playbooks#xff09;#xff0c;轻松管理和配置多个服务器。Ansible 的特点是无…一、Ansible概述
1.1 什么是Ansible
Ansible 是一个开源的自动化工具用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件剧本Playbooks轻松管理和配置多个服务器。Ansible 的特点是无代理架构它通过 SSH 连接到远程主机不需要在目标服务器上安装任何软件。
除了 Ansible常用的 IT 自动化和配置管理工具还有很多如Chef、Puppet、SaltStack 1.2 Ansible 的特性 批量管理与部署 Ansible 能够轻松管理数以千计的主机。管理员不再需要逐一登录每个主机执行操作而只需在控制节点上执行命令Ansible 会自动将这些命令应用于所有目标主机。这极大提高了运维效率尤其在处理大规模基础设施时。 模块化架构 Ansible 采用基于模块的工作机制。Ansible 本身并不执行任务而是通过调用各种模块来完成具体操作。例如 每个模块都是功能独立的可以针对不同的任务进行调用使得 Ansible 的功能非常强大和灵活。 copy 模块用于将文件从控制节点复制到远程主机。service 模块用于管理服务的启动、停止和重启。 无代理特性AgentlessAnsible 的一大亮点是其无代理的架构。用户只需在控制节点上安装 Ansible而不需要在被管理的每个主机上安装任何额外的服务或代理。Ansible 通过 SSH 连接到远程主机执行命令并返回结果。这使得 Ansible 的部署和使用变得异常简单。 幂等性IdempotenceAnsible 的许多模块具有幂等性这意味着多次执行同一操作不会改变系统的最终状态。例如如果一个服务已经在运行执行启动服务的命令不会产生任何副作用。这使得 Ansible 在自动化管理时更加安全可靠。
1.3 Ansible 的工作流程 解析 Playbook:Ansible 首先解析 Playbook 文件读取其中的 hosts、tasks、variables 等信息。选择目标主机:根据 Inventory 文件选择符合条件的目标主机。建立 SSH 连接:通过 SSH 与目标主机建立连接使用提供的用户凭证(如密钥或密码)执行任务:Ansible 按照 Playbook 中的顺序执行任务每个任务会在目标主机上执行相应的模块(如 apt、yum、copy 等)。处理结果:每个任务执行完后Ansible 会收集返回的结果并进行处理包括成功、失败或改变的状态。 1.4 Ansible 特点 简单部署 Ansible 的部署过程非常简单只需在控制节点上安装 Ansible远程主机无需做任何操作。 基于 SSH 的管理 默认情况下Ansible 使用 SSH 协议连接和管理远程设备这种方式安全可靠。 集中化管理 Ansible 提供主从架构用户可以集中管理多个节点降低了运维复杂性。 功能强大与扩展性 Ansible 的配置简单同时功能强大支持用户自定义模块和插件能够满足各种复杂的自动化需求。 通过 API 和自定义模块扩展 用户可以通过 API 和 Python 自定义模块轻松扩展 Ansible 的功能以适应特定的业务需求。 使用 Playbooks Playbooks 允许用户定制复杂的配置和状态管理支持更灵活的自动化方案。 支持云计算和大数据环境 Ansible 对云计算平台如 AWS、Azure 等和大数据框架如 Hadoop、Spark 等有很好的支持能够有效管理云基础设施。 二、Ansible
在进行 Ansible 的使用之前我们需要在管理端安装 Ansible。假设我们的管理端 IP 为 192.168.10.23被管理端 IP 分别为 192.168.10.14 和 192.168.10.15。
2.1 管理端安装 Ansible
首先安装 EPELExtra Packages for Enterprise Linux源然后安装 Ansible
# 安装 EPEL 源
yum install -y epel-release# 安装 Ansible
yum install -y ansible
2.2 Ansible 目录结构
安装完成后Ansible 的主要目录结构如下 2.3 配置主机清单
在 /etc/ansible 目录中配置主机清单 hosts定义需要管理的主机
cd /etc/ansible
vim hosts# 配置组名和被管理主机
[webservers]
192.168.10.14[dbservers]
192.168.10.152.4 配置密钥对验证
为了实现免密登录我们需要生成 SSH 密钥对并将公钥复制到被管理的主机上
# 生成 SSH 密钥对
ssh-keygen -t rsa # 一路回车# 将公钥复制到被管理主机
sshpass -p your_password ssh-copy-id root192.168.10.14
sshpass -p your_password ssh-copy-id root192.168.10.15三、Ansible 命令行模块
Ansible 的命令行格式如下
ansible 组名 -m 模块 -a 参数列表使用 ansible-doc
可以使用 ansible-doc 命令列出所有已安装的模块
ansible-doc -l # 列出所有模块3.1 command 模块
command 模块用于在远程主机执行命令不支持管道和重定向等 shell 特性。
# 查看 command 模块的描述
ansible-doc -s command# 在指定 IP 执行命令
ansible 192.168.10.14 -m command -a date
ansible webservers -m command -a date常用参数
chdir在远程主机上运行命令前切换到指定目录。creates判断指定文件是否存在如果存在则不执行后续操作。removes判断指定文件是否存在如果存在则执行后续操作。
ansible all -m command -a chdir/home ls ./3.2 shell 模块
shell 模块用于在远程主机执行命令支持管道等 shell 特性。
# 查看 shell 模块的描述
ansible-doc -s shell# 使用 shell 模块执行命令
ansible dbservers -m shell -a echo 123456 | passwd --stdin test
ansible dbservers -m shell -a echo $(ifconfig ens33 | awk NR2 {print $2})3.3 cron 模块
cron 模块用于在远程主机定义任务计划。
# 查看 cron 模块的描述
ansible-doc -s cron# 添加计划任务
ansible webservers -m cron -a minute*/1 job/bin/echo helloworld namejqg crontab# 列出计划任务
ansible webservers -a crontab -l# 移除计划任务
ansible webservers -m cron -a namejqg crontab stateabsent3.4 user模块 用户管理
常用参数
name: 用户名必选state: 创建或删除账号 (present 创建absent 删除)system: 是否为系统账号 (yes|no)uid: 用户IDgroup: 用户基本组shell: 默认使用的shellmove_home: 移动现有的家目录 (yes|no)password: 用户密码建议加密comment: 用户注释信息remove: 删除账号时是否删除家目录 (yes|no)
ansible dbservers -m user -a nametest01 # 创建用户test01
ansible dbservers -m user -a nametest01 stateabsent # 删除用户test013.5 group模块 用户组管理
常用参数
name: 组名gid: 组IDsystem: 是否为系统组 (yes|no)
ansible dbservers -m group -a namekgc gid1111 systemyes # 创建kgc组
ansible dbservers -m user -a namejqg uid1111 systemyes groupkgc # 将jqg用户添加到kgc组3.6 copy模块
文件复制
常用参数
dest: 目标路径绝对路径src: 源文件路径mode: 文件权限owner: 文件属主group: 文件属组content: 复制的内容不能与src一起使用
ansible dbservers -m copy -a src/home/cs.txt dest/home/cs.txt ownerroot mode640
ansible dbservers -m copy -a contenthelloworld dest/home/hello.txt3.7 file模块 文件属性设置
常用参数
path: 文件路径owner: 文件属主group: 文件属组mode: 文件权限state: 文件状态 (present/absent/link)
ansible dbservers -m file -a ownerjqg groupkgc mode644 path/home/hello.txt # 修改文件权限
ansible dbservers -m file -a path/home/hello.link src/home/hello.txt statelink # 创建链接文件
ansible dbservers -m file -a path/home/abc.txt statetouch #创建文件
ansible dbservers -m file -a path/home/abc.txt stateabsent #删除文件 3.8 hostname 模块
用于管理远程主机上的主机名
ansible dbservers -m hostname -a namehost-jqg #设置主机名 3.9 ping模块
用于检测远程主机的连通性
ansible all -m ping #测试连通性 3.10 yum模块
用于在远程主机上安装与卸载软件包
ansible webservers -m yum -a nametree #安装软件包
ansible webservers -m yum -a nametree stateabsent #卸载软件包 3.11 service/systemd 模块
用于管理远程主机上的服务运行状态
name: 被管理的服务名称state: 服务的状态started启动、stopped停止、restarted重启enabled: 是否设置为开机自启yes 或 norunlevel: 如果设定了 enabled则定义在哪些运行目标下自启动例如runlevel5
ansible webservers -a systemctl status nginx #查看服务状态
ansible webservers -m service -a enabledtrue namenginx statestarted #启动服务并设置开机自启 3.12 script 模块
用于在远程主机上执行本地脚本
使用步骤
创建名为 test.sh 的 shell 脚本
#!/bin/bash
echo hello ansible from script /home/script.txt赋予脚本执行权限
chmod x test.sh使用 ansible 命令运行脚本针对 webservers 主机组。
ansible webservers -m script -a test.sh检查远程主机上的输出文件
ansible webservers -a cat /home/script.txt3.13 setup 模块
用于收集远程主机的事实信息系统详细信息
使用步骤
从 webservers 组的所有主机收集事实。
ansible webservers -m setup使用 filter 选项获取 dbservers 组中主机的 IPv4 地址
ansible dbservers -m setup -a filter*ipv4四、Ansible Inventory 主机清单
在日常的运维管理中Ansible 是一个非常强大的自动化运维工具能简化大量的配置管理、部署和维护工作。而在 Ansible 中Inventory主机清单是其核心组成部分之一负责管理主机及其变量。本文将带你深入了解 Ansible 的 Inventory 文件如何使用如何通过分组和变量来管理主机。
4.1 Ansible Inventory 的基本概念
Ansible 的 Inventory 是一个包含你要管理的主机和相关配置信息的文件。它允许你将主机分成不同的组并为每个主机和组定义特定的属性和变量。 4.1.1 主机分组
在 Inventory 中你可以将主机分组使得同一组的主机可以共享相同的配置。这样就能对不同的主机集群进行精细化管理。
例如以下配置定义了两个主机组
[webservers]
192.168.192.70:2222 # 这里指定了连接端口
192.168.192.[5:7]0[dbservers]
db-[a:f].host # 匹配主机名为 db-a.host 到 db-f.host4.1.2 使用主机列表
当你有多个相似的主机时可以使用列表的方式来简化配置。
[webservers]
192.168.192.[5:7]0上面的例子表示 192.168.10.12 到 192.168.10.15 的四台主机都属于 webservers 组。 4.2 定义 Inventory 变量
在 Ansible 中除了对主机进行分组外你还可以为主机或者主机组定义变量这些变量可以控制远程连接的各种参数如 IP、端口、用户、密码等。
4.2.1 主机变量
可以为每台主机指定连接的相关信息。
[webservers]
192.168.192.60 ansible_port22 ansible_userroot ansible_password123456配置表示主机 192.168.192.60 使用 root 用户和 123456 密码通过 SSH 的 22 端口连接。 4.2.2 组变量
还可以为整个组中的所有主机定义统一的变量。
[webservers:vars]
ansible_userroot
ansible_password123456这样配置后webservers 组中的所有主机都会使用相同的用户名和密码 4.2.3 全局变量
为所有主机定义一些通用的变量可以使用 [all:vars],这会为所有主机默认使用 22 端口。
[all:vars]
ansible_port224.3组嵌套
在实际应用中可能需要通过子组来组织主机。比如有 nginx 组和 apache 组然后将这两个组放在一个大的组 webs 下面。
[nginx]
192.168.192.50
192.168.192.60
192.168.192.70[apache]
192.168.192.[8:9]0[webs:children] # webs 组包含了 nginx 组和 apache 组的所有主机
nginx
apache在这个配置中webs 组是 nginx 和 apache 两个组的父组表示 webs 组下的所有主机即是这两个子组的所有主机。 总结 主机分组将主机分为不同的组方便管理。主机与组变量为不同的主机和主机组定义连接信息和其他配置变量。组嵌套通过 children 关键词将多个子组放在一个父组下实现更细致的分组管理。变量的应用可以为所有主机定义全局变量也可以为单个主机或主机组指定特定变量。 五、ansible playbook 剧本
5.1 什么是 ansible playnook
Playbook 是一个 YAML 格式的脚本用来描述一系列的任务Tasks这些任务会按顺序在被管理的主机上执行。通过 Playbook用户可以轻松地定义基础设施配置或应用程序部署的步骤。 5.2 playbook 基本组成部分
Playbook 主要由以下部分组成
Tasks任务是通过调用 Ansible 模块来执行的操作。Variables变量可以让 Playbook 更加灵活。Templates模板用来动态生成配置文件等内容。Handlers处理器在某些任务发生变更后触发。Roles角色用来将任务、变量、模板等按角色进行模块化组织。
示例创建一个playbook
---
- name: first play # Play 的名称gather_facts: false # 是否收集 facts默认为 truehosts: webservers # 指定目标主机组remote_user: root # 在远程主机上执行任务的用户tasks: # 任务列表- name: test connection # 自定义任务名称ping: # 使用 ping 模块检查连接- name: disable selinuxcommand: /sbin/setenforce 0 # 禁用 SELinuxignore_errors: True # 忽略错误- name: disable firewalldservice: namefirewalld statestopped # 停止 firewalld 服务- name: install httpdyum: namehttpd statelatest # 安装 httpd- name: install configuration file for httpdcopy: src/opt/httpd.conf dest/etc/httpd/conf/httpd.conf # 复制配置文件notify: restart httpd # 通知处理器重新启动 httpd- name: start httpd serviceservice: enabledtrue namehttpd statestarted # 启动 httpd 服务handlers: # 处理器定义- name: restart httpdservice: namehttpd staterestarted # 重新启动 httpd运行playbook
使用 ansible-playbook 命令运行 Playbook
ansible-playbook test1.yaml常用选项
-k交互输入 SSH 密码。-K交互输入 sudo 密码。-u指定远程执行的用户。--syntax-check检查 Playbook 语法是否正确。--list-task列出 Playbook 中的任务。--list-hosts列出 Playbook 的目标主机。--start-at-task从指定任务开始执行。
示例下载httpd并启动 5.3 定义、引用变量
定义与引用变量
在 Playbook 中可以使用 vars 来定义变量并在任务中引用它们。 在命令行定义变量
你可以通过命令行传递变量 可以通过 -e 传递一个简单的变量 需要将原先用户的uid替换掉否则报错 5.4条件判断与循环
When 条件判断
通过 when 指令可以实现条件执行任务
- name: shutdown hostcommand: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address 192.168.192.60 # 判断主机 IP循环 (Loop)
可以使用 with_items 或 loop 来实现任务的循环执行
tasks:- name: create directoriesfile:path: {{item}}state: directorywith_items:- /home/test1- /home/test2或者更复杂的循环
- name: add usersuser: name{{item.name}} statepresent groups{{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root5.5 Templates 模块
Jinja2 是基于 Python 的模板引擎它允许通过引用变量来动态生成配置文件。在 Ansible 中template 模块用于将 Jinja2 模板应用于 Playbook。以下是如何使用 Jinja2 模板自动化配置 Apache HTTP 服务器的示例。
①准备一个以 .j2 为后缀的 template 模板文件设置引用的变量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2
Listen {{http_port}} #42行修改
ServerName {{server_name}} #95行修改
DocumentRoot {{root_dir}} #119行修改②修改主机清单文件使用主机变量定义一个变量名相同而值不同的变量
vim /etc/ansible/hosts
[dbservers]
192.168.192.50 http_port192.168.192.50 server_namewww.benet.com:80 root_dir/var/www/html
③编写 playbook
vim apache.yaml
---
- hosts: dbserversremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name {{package}} statelatest- name: install configure filetemplate: src/opt/httpd.conf.j2 dest/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root dirfile: path/var/www/html statedirectory- name: start httpd serverservice: name {{service}} enabledtrue statestartedhandlers:- name: restart httpdservice: name {{service}} staterestarted5.6 tags 标签
在 Ansible 中可以为任务定义标签tags并通过命令行参数 --tags 来控制任务的执行范围。这对于只执行特定任务或跳过某些任务非常有用。
①编写带有 Tags 的 Playbook
创建一个带有 tags 的 Playbook 文件 daemon6.yaml
---
- hosts: dbserversremote_user: roottasks:- name: copy filecopy: src/opt/kgc.txt dest/home/kgc.txttags:- copy # 仅在指定运行 copy 标签时执行此任务- name: touch test1 filefile: path/home/kgc2.txt statetouchtags:- always # 无论运行哪一个标签始终执行此任务 - name: touch test2 filefile: path/home/kgc3.txt statetouchtags:- touch
在这个 Playbook 中tags 允许你控制任务的执行。only 标签的任务只有在命令行显式指定时才会执行而 always 标签表示无论执行什么标签这个任务都会被执行。
②执行带有 Tags 的 Playbook
使用 --tags 选项只执行带有 copy 标签的任务 只触发了 “copy”和“always” 部分内容 如果不指定tags则都触发