目录
Ansible概述:
Ansible 是一种开源的自动化工具,用于配置和管理计算机系统、应用程序和网络设备。它采用简单易懂的 YAML 或 JSON 形式的剧本(playbook)语法,并通过 SSH 协议与远程主机进行通信。以下是 Ansible 的优点:
1. 简单易用
: Ansible 的语法简洁明了,易于理解和编写。使用基于文本的 YAML 或 JSON 格式描述配置任务,无需编写复杂的脚本或程序。
轻量级
: Ansible 使用代理少或无代理的架构,在被管理的主机上不需要额外的软件或永久性的运行进程。这使得安装和管理 Ansible 变得十分简便。
2. 基于SSH
: Ansible 通过 SSH 连接到远程主机执行任务,无需在目标主机上安装特定的客户端。这使得连接配置更加灵活且安全可靠。
3. 模块化和可扩展
: Ansible 提供了大量的内置模块,用来完成各种常见的操作。同时也支持自定义模块,可以根据特定需求进行扩展和定制。
4. 剧本(Playbook)驱动
: Ansible 使用剧本来组织和描述自动化任务的执行流程。通过剧本,可以实现复杂的多任务协调和依赖关系,提高工作效率。
5. 跨平台
: Ansible 可以管理各种操作系统、网络设备和云平台,包括 Linux、Windows、Cisco 等。这为混合环境下的统一管理提供了便利。
6. 可扩展的生态系统
: Ansible 拥有活跃的社区支持和广泛的插件生态系统。可以与其他工具(如 Docker、Kubernetes)集成,满足不同的自动化需求。
7. 可靠性和稳定性
: Ansible 经过多年的发展和广泛的应用,在稳定性和可靠性方面得到验证。它被许多组织广泛采用,包括大型企业和云服务提供商。
一、安装 Ansible
1.1 配置 EPEL 源
在 CentOS 7 上安装 Ansible 需要先安装 EPEL 源,可以使用以下命令安装:
sudo yum install epel-release
1.2 安装 Ansible
安装 Ansible 可以使用以下命令:
sudo yum install ansible
1.3 验证 Ansible 是否安装成功
安装完成后,可以使用以下命令验证 Ansible 是否安装成功:
ansible --version
如果出现类似以下的输出,说明 Ansible 安装成功:
ansible 2.9.17 config file = /etc/ansible/ansible.cfg configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.6/site-packages/ansible executable location = /usr/bin/ansible python version = 3.6.8 (default, Apr 16 2021, 01:36:27) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
二、使用 Ansible
2.1 编写 Ansible 配置文件
Ansible 的配置文件默认为 /etc/ansible/ansible.cfg,可以使用以下命令创建一个新的配置文件:
sudo vi /etc/ansible/myansible.cfg
在配置文件中可以设置一些常用的配置项,例如:
[defaults]
inventory = /etc/ansible/hosts
remote_user = user
private_key_file = /path/to/private/key
2.2 创建 Ansible inventory 文件
Ansible inventory 文件用于存储主机列表,可以使用以下命令创建一个新的 inventory 文件:
sudo vi /etc/ansible/hosts
在 inventory 文件中可以指定主机的 IP 地址或主机名,例如:
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
2.4 编写 Ansible playbook
Ansible playbook 是一个 YAML 格式的文件,用于描述 Ansible 的执行过程。可以使用以下命令创建一个新的 playbook:
sudo vi /etc/ansible/playbook.yml
在 playbook 文件中可以指定要执行的任务,例如:
- name: Install Apache hosts: webservers become: true tasks: - name: Install Apache yum: name: httpd state: latest
以上 playbook 的作用是在 webservers 组的主机上安装最新版本的 Apache。
2.5 执行 Ansible playbook
执行 Ansible playbook 可以使用以下命令:
ansible-playbook /etc/ansible/playbook.yml
执行完成后,可以查看结果确认任务是否执行成功。
2.6 常用参数指令
Ansible 是一个功能强大的自动化工具,支持多种参数以满足不同的需求。下面是 Ansible 常用的一些参数:
- -i/--inventory: 指定主机清单文件(inventory),指定要管理的目标主机。
示例:
ansible-playbook -i inventory.ini playbook.yml
- -m/--module-name: 指定要执行的模块名称。
示例:
ansible -m command -a "uptime" all
- -a/--args: 传递给模块的参数。
示例:
ansible -m shell -a "echo 'Hello, world!'" all
- -u/--user: 以指定的用户名连接到远程主机。
示例:
ansible -u myuser -m ping all
- -b/--become: 使用特权(sudo/root)执行远程命令。
示例:
ansible -b -m yum -a "name=httpd state=installed" all
- -K/--ask-become-pass: 在执行命令之前提示输入特权密码。
示例:
ansible -b -m shell -a "reboot" all -K
- -e/--extra-vars: 传递额外的变量给 Playbook 或命令行。
示例:
ansible-playbook -e "my_var=value" playbook.yml
- --limit: 限制执行任务的主机或组。
示例:
ansible-playbook --limit web_servers playbook.yml
- -t/--tags: 标记需要运行的任务或剧本标签。
示例:ansible-playbook -t install playbook.yml
- --skip-tags: 跳过被标记的任务或剧本标签。
示例:ansible-playbook --skip-tags setup playbook.yml
2.7 命令简单示范
- ansible
: 执行 Ansible 命令并指定主机清单文件(inventory)和模块。
示例:执行 command 模块在所有主机上运行命令。
ansible -i inventory.ini all -m command -a "ls"
- ansible-playbook
: 运行 Ansible 的剧本(playbook),在目标主机上进行配置管理。
示例:执行 playbook 文件来安装、配置软件包。
ansible-playbook -i inventory.ini playbook.yml
- ansible-config: 查看和修改 Ansible 配置文件的选项。
示例:查看当前 Ansible 配置文件的位置。
ansible-config --list | grep CONFIGURATION FILE
- ansible-doc
: 获取 Ansible 模块的文档信息。
示例:查看 debug 模块的帮助文档。
复制代码ansible-doc debug
- ansible-galaxy
: 用于与 Ansible Galaxy 集成的命令。
示例:从 Ansible Galaxy 下载一个角色。
ansible-galaxy install username.role_name
- ansible-vault: 对 Ansible 加密文件进行操作,以保护敏感数据。
示例:创建一个加密的变量文件。
ansible-vault create secret.yml
三, 注意事项
3.1 inventory/hosts-主机清单规则
- inventory文件位置
默认的inventory文件在/etc/ansible/hosts。你可以通过不同位置的ansible文件来定义不同的inventory位
置。
- inventory文件书写注意事项
如果inventory文件包含同样名字的host和group,那么ansible在列出目标主机的时候会弹出警告,并且 group会被忽略
- inventory定义
inventory文件定义了一系列的被管理主机,这些被管理主机可以被放到group中。group可以包含child
group,并且一个主机可以同时属于多个组,inventroy文件中也可以设置变量来指定主机和组
- 静态inventory文件可以通过主机名或者ip地址来指定被管理主机,每行代表一个主机
- 常规写法
web1.example.com
db1.example.com
db2.example.com
192.168.1.1
- 主机组
通常情况下使用主机组来指定ansible的被管理主机,这样更高效一些。每个主机组使用“[]”来括起来
[webservers]
web1.example.com
web2.example.com
192.168.1.1
[db-servers]
db1.example.com
db2.example.com
- 被管理的主机也可以存在与多个组中
- 两个一定存在的主机组
all:表示每个inventory中的主机
ungrouped:不在任何主机组中的主机
- 嵌套组
ansible的inventory使用“:children”来表示嵌套组
[tom]
test1.example.com
192.168.126.120
[monkey] ceshi1.example.com
192.129.0.11
[zuhe:children] tom monkey
- 指定范围主机
192.168.[1:4].[0:255]匹配192.168.1.0/22网络
server[01:20].example.com匹配server01.example.com到server20.example.com,不会匹配
server1.example.com
3.2 提权操作
[privilege_escalation]
#如果你remote_user使用的是root用户,就不需要配置提权部分,如果你的remote_user不是
root,但是不需要做特权操作,那么也可以不用配置这部分。如果是普通用户,但是需要做特权操作,
那么就需要配置这部分。
become = true
#true表示需要提权,false就表示不需要提权
become_method = sudo
#表示提权的方式是sudo提权
become_user = root
#表示提权到root用户
become_ask_pass = false
#false表示进行sudo操作的时候不提示输入密码,true表示需要输入密码
不是任何用户作为remote_user,且配置了提权就能真的提权。而必须要在被管理主机里面配置
sudoers文件,让这个remote_user有提权的能力才可以。