一、ansible工具介绍
Ansible 是一种基于python的开源自动化工具,主要用于配置管理、应用部署和任务自动化,集合了puppet、chef、func、fabric、cfengine等众多运维工具的优点,它通过简单的 YAML 文件(称为 Playbooks)来定义自动化流程,能够以无代理的方式与远程主机进行通信。
Ansible 的主要特点:
- 无代理:不需要在被管理节点上安装任何代理软件。
- 易于学习:使用 YAML 格式编写 Playbooks,语法简单易懂。
- 模块化:提供了大量内置模块,可以方便地进行各种操作。
- 并发执行:能够同时对多个主机执行任务,提高效率。
二、ansible核心命令
ad-hoc模式基本语法为:ansible <host-pattern>主机或主机组,默认为/etc/ansible/hosts [-m module_name]指定模块 [-a args]指定参数
检查所有远程主机是否可以访问:ansible all -m ping
检查某个ip主机是否可以访问:ansible x.x.x.x -m ping
远程对单个主机进行指令输入ls:ansible x.x.x.x -m shell -a "ls"
远程对单个主机停用ssh服务:ansible x.x.x.x -m service -a "name=sshd state=stopped"(开启是state=started)
远程对单个主机安装ansible:ansible x.x.x.x -m yum -a "name=ansible state=installed"(其他状态有absent,latest,present,removed等)
远程对单个主机内创建用户:ansible x.x.x.x -m user -a "name=caixukun password=lanqiu"
远程对单个主机内复制文件:ansible x.x.x.x -m copy -a "src=xxx dest=xxx"
远程对单个主机内文件管理:ansible x.x.x.x -m file -a "path=/etc/1.txt mode=0777"(新建文件是state=touch)
远程对单个主机内文件传输到本地:ansible x.x.x.x -m fetch -a "src=/etc/2.txt dest=/etc/2.txt"
远程对单个主机内文件在末行添加内容:ansible x.x.x.x -m lineinfile -a "path=/etc/2.txt line='hhh' "
三、ansible剧本模式
Ansible 的剧本(Playbook)模式是自动化运维的核心工具。剧本使用 YAML 格式来定义,包含了多个“剧本块(Plays)”,每个剧本块可以对不同主机组执行指定任务,从而精确地控制不同主机在不同情景下的行为。
Ansible Playbook 是由以下部分组成的:
- 主机(Hosts):定义要执行任务的主机或主机组。
- 任务(Tasks):每个任务定义了执行的操作,如安装软件、修改文件等。
- 模块(Modules):Ansible 通过模块来完成任务,比如
yum
、apt
、copy
、file
等。 - 变量(Variables):可以定义可变参数,提高剧本的灵活性。
- 处理器(Handlers):在满足条件时触发执行(例如在安装软件后重新启动服务)。
- 条件判断(Conditionals):根据特定条件来执行或跳过任务。
- 循环(Loops):重复执行任务。
添加-C参数,可以模拟剧本的执行,但是不会产生实际改变:ansible-playbook -C install_rsync.yaml
---
- name: 配置 Web 服务器
hosts: webservers
become: yes # 需要 sudo 权限
vars:
http_port: 80
tasks:
- name: 安装 Nginx
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: 启动并启用 Nginx 服务
service:
name: nginx
state: started
enabled: yes
- name: 创建自定义首页
copy:
content: "Welcome to my website!"
dest: /var/www/html/index.html
- name: 确保防火墙允许 HTTP 流量
ufw:
rule: allow
port: "{{ http_port }}"
proto: tcp
handlers:
- name: 重启 Nginx
service:
name: nginx
state: restarted
以上代码是一个简单的ansible剧本,各个字段的解释如下:
hosts: webservers
:此剧本将应用于webservers
主机组中的所有主机。become: yes
:指定需要 sudo 权限来执行任务。vars
:定义了一个变量http_port
,设置 HTTP 的端口号。tasks
:包含一系列要执行的任务,如安装 Nginx、启动服务、复制自定义的首页文件、配置防火墙等。handlers
:定义了一个处理器,当某些任务(如配置变化)触发时,重启 Nginx 服务。
四、实际操作指令
-
编写剧本: 假设剧本文件名是
webservers.yml
,将上面的内容保存到该文件中。 -
运行剧本: 运行剧本时,使用
ansible-playbook
命令,执行命令如下:ansible-playbook webservers.yml
-
指定主机文件: 如果你有一个
inventory
文件,列出了主机名和组,可以用-i
参数指定:ansible-playbook -i /path/to/inventory webservers.yml
-
查看剧本的执行计划(--check 模式): 在实际执行之前,你可以先用
--check
参数来预览执行的结果,而不真正修改任何内容:ansible-playbook webservers.yml --check
-
加密敏感信息(使用 Ansible Vault): 如果你的剧本中包含敏感信息(如密码),可以加密特定的变量文件:
ansible-vault encrypt vars.yml
然后使用
--ask-vault-pass
在运行时输入解密密码:ansible-playbook webservers.yml --ask-vault-pass
小贴士:
- Idempotency:Ansible 的剧本是幂等的,也就是说你可以多次运行剧本而不担心重复操作。如果某个任务已经完成,Ansible 会跳过该任务。
- Error Handling:你可以通过
ignore_errors: yes
忽略某个任务的错误,或通过failed_when
自定义失败条件。
通过这种剧本模式,Ansible 实现了复杂自动化流程的灵活管理,适用于从简单任务到复杂应用环境的配置和部署。