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 将认为它是一个字典。

 

posted @ 2019-09-16 00:27  PIPO2  阅读(214)  评论(0编辑  收藏  举报