Ansible
1. 运维自动化
简单来讲,运维自动化就是将日常重复性的工作按照预先既定的规则,在指定的时间范围内自动运行,整个过程无需人工参与。
Ansible 是一种运维自动化工具,基于 python 语言,实现了批量配置管理、批量程序部署、批量运行命令等。Ansible 默认使用 SSH 协议管理一组远程的机器,只需要在管理机器(必须是Linux系统)上安装 ansible 软件即可。
2. Ansible框架组件
-
Inventory:Ansible 管理主机的清单。
-
API:供第三方程序调用的应用程序编程接口。
-
Modules:Ansible 执行命令的功能模块。
-
Plugins:功能模块的补充,如连接插件、邮件插件等。
-
Ansible:组合 Inventory、API、Modules、Plugins 的核心执行工具。
-
Playbook:编排定义 Ansible 任务集的配置文件,通常是 JSON 格式的 YML 文件。
3. 工作过程
用户使用 Ansible 或 Ansible-playbook,在服务器终端输入 Ad-Hoc 命令或 Playbook 后,Ansible 会遵循预先编排的规则将 Playbooks 逐条拆解为Play,再将 Play 组织成 Ansible 可识别的任务(Task),随后调用任务涉及的所有模块(Module)和插件(Plugin),根据 Inventory 中定义的主机列表通过 SSH 将任务集以临时文件或命令的形式,推送到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。
4. 目录结构
(1)配置文件目录 /etc/ansible/,Inventory主机信息配置、Ansible工具功能配置等。
(2)执行文件目录 /usr/bin/,Ansible系列命令默认存放目录。
5. Inventory
Inventory 是 Ansible 管理主机信息的配置文件,遵循 INI 文件风格,默认存放在 /etc/ansible/hosts。
Inventory 包含静态 Inventory 和动态 Inventory。静态 Inventory 是指配置文件中指定的主机和组,动态 Inventory 是指通过外部脚本获取的主机列表。
192.168.10.2
[webserver] #定义主机分组
172.16.2.[5:6] #172.16.2.5,172.16.2.6
[dbserver]
db-[a:b].edu.com
[servers] #分组嵌套
webserver
dbserver
6. Ansible 核心模块
(1)ping模块
ansible all -m ping
(2)command模块(默认模块)
ansible all -m command -a "mkdir /tmp/1.txt"
(3)shell模块
ansible all -m shell -a "ps -ef |grep java"
(4)script模块
ansible all -m script -a "/server/scripts/yum.sh"
(5)yum模块
ansible all -m yum -a "name=nginx state=present"
-
name:软件包名
-
state:present(安装),absent(卸载)
(6)copy模块
ansible all -m copy -a "src=/etc/hosts dest=/tmp/"
-
src:源文件路径
-
dest:目标文件路径
-
owner:指定文件所有者
-
group:指定文件用户组
-
mode:指定文件权限
-
backup:yes备份
-
content:清空并添加文件内容,不可与src同时使用
(7)file模块
ansible all -m file -a "path=/tmp/test.txt state=touch"
-
path:要修改文件的路径
-
owner:修改属主
-
group:修改属组
-
mode:修改权限
-
recurse:递归设置文件属性,yes/no
-
state:touch(新建文件),directory(创建目录),absent(移除)
(8)service模块
ansible all -m service -a "name=httpd state=restarted enabled=yes"
-
name:服务名
-
state:started(启动),stopped(停止),restarted(重启)
-
enabled:yes 服务开机自启,默认为 no
(9)group/user模块
ansible all -m group -a "name=app gid=500 state=present"
-
name:组名
-
gid:组ID
-
state:present(新建),absent(移除)
ansible all -m user -a "name=user1 uid=111 group=app shell=/sbin/nologin create_home=no"
-
name:用户名
-
uid:用户ID
-
group:用户组名
-
gid:组ID
-
password:用户密码
-
shell:用户登录shell
-
create_home:yes/no
(10)cron模块
ansible all -m cron -a 'name="ntpdate" hour="*/12" job="/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" state=persent'
-
name:任务计划名称
-
minute/hour/day/month/weekday
-
job:任务计划执行命令
-
state:present(新建),absent(移除)
(11)mount模块
ansible 172.16.10.5 -m mount -a "fstype=ext4 src=172.16.1.31:/data path=/upload state=mounted"
-
fstype:挂载文件类型
-
src:被挂载的设备目录
-
path:挂载目录
-
state:present(创建),absent(移除),mounted(挂载),unmounted(卸载)
7. Ansible命令用法
Ansible 命令行执行方式有两种:Ad-Hoc 和 Ansible-playbook。
(1)Ad-Hoc 命令集由 /usr/bin/ansible 实现,可快速执行单个任务。
ansible <host-pattern> [options]
可选参数如下:
-i PATH:指定 inventory,默认是 /etc/ansible/hosts。
-f NUM:并发线程数,默认5个线程。
-M DIRECTORY:指定模块存放路径,默认是 /usr/share/ansible。
-m NAME:指定执行使用的模块。
-a 'ARGUMENT':模块参数。
-u USERNAME:远程主机以指定用户运行命令。
-s:相当于Linux系统下的sudo命令。
-U USERNAME:切换用户。
ansible all -m ping -u bruce -s -U batman #以 bruce sudo 至 batman 用户执行 ping 命令
(2)Ansible-playbook 由 /usr/bin/ansible-playbook 实现,执行事先编排好的任务集,固化批量操作。
ansible-playbook playbook.yml
8. YAML语法
对于 Ansible,每一个 YAML 文件都是从一个列表开始。列表中的每一项都是一个键值对,通常它们被称为一个"哈希"或"字典"。所以,我们需要知道如何在 YAML 中编写列表和字典。
YAML 文件开始行都应该是 ---,这是 YAML 格式的一部分,表明一个文件的开始。列表中的所有成员以相同的缩进开始,并且使用一个"- "作为开头。
---
- Apple
- Orange
- Mango
一个字典是由"键:值"的形式组成(冒号后面必须是一个空格)。
---
name: Example Developer
job: Developer
skill: Elite
字典另外一种写法:
---
{name: Example Developer,job: Developer,skill: Elite}
Ansible 使用 {{ var }} 来引用变量。如果一个值以 { 开头,YAML 将认为它是一个字典。