Ansible 是一个开源的自动化配置管理工具,用于应用程序部署、任务执行和多节点管理。它的目标是简化和自动化 IT 基础设施管理和配置工作。通过使用 Ansible,系统管理员可以有效地管理数以百计的服务器,而无需依赖复杂的脚本或安装额外的代理。
Ansible 通过 SSH 协议与目标主机进行通信,无需在目标机器上安装任何代理程序,这使得它比许多传统的自动化工具更简单、轻便。Ansible 使用基于 YAML 语言的配置文件,称为 Playbooks,来定义自动化任务。
Ansible 的主要特点
- 无代理架构:不需要在目标机器上安装代理,所有任务通过 SSH 进行远程执行。
- 易于学习:基于 YAML 的配置文件,语法简洁、易懂。
- 高度可扩展:通过模块和插件支持各种任务,支持多种操作系统和环境。
- 强大的社区支持:拥有广泛的社区支持和丰富的文档资源。
- 灵活性:适用于配置管理、应用部署、任务自动化等多种场景。
常用命令:
命令 | 用途 | 常用选项 | 示例 |
---|---|---|---|
ansible | 在一台或多台主机上执行一个单独的任务 | -m <module> :指定模块<br> -a "<module-args>" :指定模块参数<br> -i <inventory> :指定库存文件 | ansible all -m ping <br> ansible web_servers -m shell -a 'uptime' |
ansible-playbook | 运行 Playbook,执行一系列自动化任务 | -i <inventory> :指定库存文件<br> --check :检查模式<br> --extra-vars :传递额外变量<br> --tags :只运行特定任务 | ansible-playbook site.yml <br> ansible-playbook site.yml --check |
ansible-galaxy | 管理角色、集合等资源 | init <role-name> :初始化角色<br> install <role-name> :安装角色<br> list :列出已安装的角色 | ansible-galaxy install geerlingguy.apache <br> ansible-galaxy list |
ansible-vault | 用于加密和解密敏感数据 | create <file> :创建加密文件<br> encrypt <file> :加密文件<br> decrypt <file> :解密文件 | ansible-vault create secret.yml <br> ansible-vault encrypt secret.yml |
ansible-doc | 查看模块的文档,帮助了解模块使用方法 | -l :列出所有模块<br> -s :查看模块摘要<br> -d :显示模块详细文档 | ansible-doc ping <br> ansible-doc yum <br> ansible-doc file -d |
ansible-inventory | 显示、验证和操作库存文件 | --list :列出库存<br> --host <host> :显示某主机的详细信息 | ansible-inventory -i hosts --list <br> ansible-inventory -i hosts --host web01 |
ansible-pull | 从 Git 仓库拉取并执行 Playbook | -U <repository> :指定 Git 仓库<br> -i <inventory> :指定库存文件 | ansible-pull -U https://github.com/myrepo/ansible.git -i inventory |
ansible-playbook (调试选项) | 执行 Playbook 时启用调试和调试模式 | -vvvv :增加调试级别<br> --start-at-task :从指定任务开始<br> --tags :仅执行特定标签的任务 | ansible-playbook site.yml -vvvv <br> ansible-playbook site.yml --start-at-task="Install Apache" |
ansible (其他模块) | 各种系统管理任务的执行 | -m <module> :指定模块,-a <args> :指定模块参数<br> -i <inventory> :指定库存文件 | ansible all -m yum -a "name=httpd state=present" <br> ansible all -m service -a "name=apache state=started" |
常见模块:
模块名 | 用途 | 常用选项 | 示例 |
---|---|---|---|
ping | 测试与目标主机的连接 | 无选项 | ansible all -m ping <br> ansible web_servers -m ping |
shell | 执行 shell 命令 | -a :指定命令参数 | ansible all -m shell -a 'uptime' <br> ansible web -m shell -a 'echo Hello World' |
command | 执行命令(不通过 shell) | -a :指定命令参数 | ansible all -m command -a 'date' |
copy | 将本地文件复制到远程主机 | src :源文件路径<br> dest :目标文件路径 | ansible all -m copy -a "src=/tmp/file dest=/tmp/file" |
template | 从模板文件生成文件并复制到远程主机 | src :模板文件路径<br> dest :目标文件路径 | ansible all -m template -a "src=template.j2 dest=/tmp/file" |
yum | 管理基于 RPM 的系统的软件包 | name :软件包名<br> state :软件包状态(如:present, latest) | ansible all -m yum -a "name=httpd state=present" |
apt | 管理基于 Debian 的系统的软件包 | name :软件包名<br> state :软件包状态(如:present, latest) | ansible all -m apt -a "name=nginx state=latest" |
service | 管理系统服务(启动、停止、重启等) | name :服务名<br> state :服务状态(如:started, stopped) | ansible all -m service -a "name=apache state=started" |
user | 管理用户账户 | name :用户名<br> state :用户状态(如:present, absent) | ansible all -m user -a "name=foo state=present" |
group | 管理用户组 | name :组名<br> state :组状态(如:present, absent) | ansible all -m group -a "name=admin state=present" |
git | 从 Git 仓库克隆代码或拉取更新 | repo :仓库地址<br> dest :目标目录 | ansible all -m git -a "repo=https://github.com/repo.git dest=/tmp/repo" |
file | 修改文件的属性(权限、所有者等) | path :文件路径<br> mode :文件权限<br> owner :文件所有者 | ansible all -m file -a "path=/tmp/file mode=755 owner=root group=root" |
cron | 配置定时任务 | name :任务名<br> minute , hour , day , month , weekday :时间设置 | ansible all -m cron -a "name='backup' minute='0' hour='3' job='/usr/bin/backup.sh'" |
lineinfile | 在文件中查找/添加/删除指定行 | path :文件路径<br> line :需要添加的行<br> regexp :匹配模式 | ansible all -m lineinfile -a "path=/etc/hosts line='127.0.0.1 myhost'" |
selinux | 配置 SELinux 状态 | policy :策略(如:enforcing, permissive, disabled) | ansible all -m selinux -a "policy=disabled" |
firewalld | 配置 firewalld 防火墙 | zone :区域<br> service :服务(如:http, ssh) | ansible all -m firewalld -a "zone=public service=http state=enabled" |
wait_for | 等待某个条件(如端口开放、文件存在) | port :端口号<br> path :文件路径 | ansible all -m wait_for -a "port=22 state=started" |
安装部署tomcat-练习单机版
1、使用yum源安装 EPEL仓库 和 Ansible
sudo yum install epel-release -y
sudo yum install ansible -y
2、配置 hosts.ini
文件 添加目标主机 将192.168.153.221换成你的目标主机ip地址。
[tomcat_servers]
tomcat-server ansible_host=192.168.153.221
3、创建 deploy_tomcat.yml
Playbook
vim deploy_tomcat.yml
4、添加以下内容:
---
- name: 安装 JDK 和 Tomcathosts: localhost # 或者指定你的目标主机become: yes # 使用 sudo 权限vars:jdk_version: "23" # JDK 版本tomcat_version: "10.1.34" # Tomcat 版本jdk_url: "https://download.oracle.com/java/{{ jdk_version }}/latest/jdk-{{ jdk_version }}_linux-x64_bin.rpm" # JDK 下载链接tomcat_url: "https://dlcdn.apache.org/tomcat/tomcat-10/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz" # Tomcat 下载链接install_dir: "/opt" # 安装目录tomcat_dir: "/usr/local/tomcat" # Tomcat 安装后的目标目录tasks:- name: 确保 /opt 目录存在file:path: "{{ install_dir }}"state: directorymode: '0755' # 设置目录权限- name: 检查 JDK 安装包是否已经存在stat:path: "{{ install_dir }}/jdk-{{ jdk_version }}_linux-x64_bin.rpm" # 检查 JDK 是否已下载register: jdk_stat- name: 下载 JDK 安装包get_url:url: "{{ jdk_url }}"dest: "{{ install_dir }}/jdk-{{ jdk_version }}_linux-x64_bin.rpm" # 下载 JDK 安装包到指定路径mode: '0644' # 设置文件权限when: not jdk_stat.stat.exists # 如果 JDK 安装包不存在,则下载- name: 检查 Tomcat 安装包是否已经存在stat:path: "{{ install_dir }}/apache-tomcat-{{ tomcat_version }}.tar.gz" # 检查 Tomcat 是否已下载register: tomcat_stat- name: 下载 Tomcat 安装包get_url:url: "{{ tomcat_url }}"dest: "{{ install_dir }}/apache-tomcat-{{ tomcat_version }}.tar.gz" # 下载 Tomcat 安装包到指定路径mode: '0644' # 设置文件权限when: not tomcat_stat.stat.exists # 如果 Tomcat 安装包不存在,则下载- name: 停止并禁用防火墙 (如果未禁用)systemd:name: firewalldstate: stopped # 停止防火墙服务enabled: no # 禁用防火墙ignore_errors: yes # 防止防火墙没有启动时出错- name: 禁用 SELinux (修改配置)lineinfile:path: /etc/selinux/configregexp: '^SELINUX='line: 'SELINUX=disabled' # 将 SELinux 设置为禁用create: yes # 如果文件不存在则创建- name: 安装 JDKyum:name: "{{ install_dir }}/jdk-{{ jdk_version }}_linux-x64_bin.rpm" # 安装 JDKstate: present # 确保安装- name: 配置 JDK 环境变量lineinfile:path: /etc/profile.d/java.shline: "{{ item }}" # 配置 JAVA_HOME 和 PATH 等环境变量create: yes # 如果文件不存在则创建loop:- "export JAVA_HOME=/usr/java/jdk-{{ jdk_version }}" # 配置 JAVA_HOME- "export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar" # 配置 CLASSPATH- "export PATH=$JAVA_HOME/bin:$PATH" # 配置 PATH- name: 设置 JDK 环境变量可执行权限file:path: /etc/profile.d/java.shmode: '0755' # 设置文件执行权限- name: 加载 JDK 环境变量shell: |source /etc/profile.d/java.sh # 加载环境变量java -version # 验证 Java 版本become: false # 不需要 sudo 权限ignore_errors: yes # 如果没有安装成功,不影响脚本执行- name: 解压 Tomcat 安装包unarchive:src: "{{ install_dir }}/apache-tomcat-{{ tomcat_version }}.tar.gz" # 解压 Tomcat 安装包dest: "{{ install_dir }}" # 解压到安装目录remote_src: yes # 解压远程文件- name: 检查目标目录是否已经存在stat:path: "{{ tomcat_dir }}" # 检查 Tomcat 安装目录是否已经存在register: tomcat_dir_stat- name: 移动 Tomcat 到 /usr/local/tomcatcommand: mv "{{ install_dir }}/apache-tomcat-{{ tomcat_version }}" "{{ tomcat_dir }}" # 将解压后的 Tomcat 移动到目标目录when: not tomcat_dir_stat.stat.exists # 如果目标目录不存在,则移动- name: 启动 Tomcatcommand: "{{ tomcat_dir }}/bin/startup.sh" # 启动 Tomcatignore_errors: yes # 如果启动失败,不影响脚本执行- name: 检查 Tomcat 是否启动成功command: "curl -s -o /dev/null -w '%{http_code}' http://localhost:8080" # 通过 curl 检查 Tomcat 是否启动成功register: tomcat_statusretries: 5 # 重试 5 次delay: 10 # 每次重试的延迟 10 秒until: tomcat_status.stdout == "200" # 直到收到 HTTP 200 状态码- name: 输出 Tomcat 安装并启动成功信息debug:msg: "Tomcat 安装并启动成功!" # 如果 Tomcat 启动成功,输出信息
5、运行 Ansible Playbook
ansible-playbook -i /root/hosts.ini deploy_tomcat.yml
6、运行结果
7、浏览器访问测试:http://192.168.153.221:8080/
成功