ansible运维自动化

ansible

Ansible is Simple IT Automation 简单的自动化运维IT工具。
基于Python开发,实现批量系统设置、批量程序部署、批量执行命令等功能。批量部署是立身于ansible的模块进行工作的。

通俗说:就是在一个台或几台服务器上,执行一系列的命令,批量在远程服务器上执行命令。

默认通过SSH协议管理机器;

1. 特点

  • 模块化:调用特定的模块,完成特定任务,本身是核心组件,短小精悍;
  • 基于Python语言实现;
  • 部署简单;
  • 主从模式工作;
  • 支持自定义模块;
  • 支持playbook,连续任务按先后顺序完成;
  • 幂等特等性,不存在大量额外编码,可以一次又一次安全运行bash命令,任意多次执行所产生的一年更新均与一次执行的影响相同,不会造成环境混乱;

2. 核心组件和架构

ansible运维自动化_第1张图片

  • connection Plugins:连接插件,负责和被监控端实现通信;
  • host inventory:指定操作的主机,是一个配置文件里面定义监控的主机,可分组管理;
  • 各种核心模块、command模块、自定义模块;
  • 借助于插件完成记录日志邮件等功能;
  • playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务;
  • core modules:ansible核心模块,用来指定对远程主机具体的操作,执行命令等;
  • custom modules:自定义模块;
  • plugins:第三方插件支持;

3. 安装与使用

brew install ansible

// 安装成功后 查看版本是否安装成功
ansible --version

在这里插入图片描述

4. 配置公私钥

可以实现无秘访问控制其他机器,实现自动化的前提,可以在配置好ansible.cfg和hosts主机清单后执行。

// 生成密钥
ssh-keygen -t rsa

// 向主机分发秘钥
ssh-copy-id root@主机名或ip

5. 主机与组

主机的端口默认22,非默认可以明确表示
test.com:8888

一组相似的hostname,可以简写:
[test] test[1:10].com // 1到10台机器

6.管理服务器 Inventory文件

Inventory文件用来定义要管理的主机。
通过修改配置文件ansible.cfg的hostfile指定路径。

通常分组执行,同一组受控服务器应用相同的配置,一台服务器也可以归属到多个组,完成多个功能角色的配置,低耦合、模块化、比较灵活:

 [主机组名称]
 ip:端口 ansible_user=登录的用户名
	```
	[test]
	test1 ansible_ssh_host=127.0.0.1
	test2 ansible_ssh_host=10.10.114.122
	```

参数说明:

ansible_ssh_host:将要连接的远程主机名
ansible_ssh_port:ssh端口号,默认22
ansible_ssh_user:默认ssh用户名
ansible_ssh_pass:ssh密码
ansible_sudo_pass:sudo密码
ansible_sudo_exe:sudo命令路径
ansible_connection:与主机的连接类型
ansible_ssh_private_key_file:ssh使用的私钥文件
ansible_shell_type:shell类型

7. 配置文件ansible.cfg

library
ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码成为模块。
指向存放ansible模块的目录library=/usr/share/ansible。

forks
默认情况下ansible最多有多少个进程同时工作,默认最多5个进程并行处理。

sudo_user
默认执行命令的用户。

remote_port
指定连接被关节点的管理端口,默认22。

host_key_checking
设置是否检查ssh主机的密钥。

timeout
设置SSH连接的超时间隔,单位是秒。

log_path
ansible默认是不记录日志的,如果需要设置log_path来指定一个存储ansible日志的文件log_path=/var/log/ansible.log。

private_key_file
使用ssh公钥登录系统的时候,使用的密钥路径,private_key_file=/path/to/file.pem。

8. 常用模块

ping模块:测试主机的连通性

ansible localhost -m ping

在这里插入图片描述

出现如下结果表示未配置主机列表,需要再/etc/ansible/hosts中添加主机列表:
在这里插入图片描述

// ping模块:测试主机的连通性
ansible localhost -m ping

// setup模块:获取主机的信息
ansible localhost -m setup -a 'filter=ansible_*_mb'
// 查看地接口为ech0-2的网卡信息
localhost -m setup -a 'filter=ansible_eth[0-2]'

// file模块:用于远程主机上的文件操作
// 创建一个软连接
ansible localhost -m setup -a 'src=/etc/fstab dest=/tmp/fstab state=link'
// 删除一个文件
ansible localhost -m setup -a 'path=tmp/fstab state=absent'
// 创建一个文件
ansible localhost -m setup -a 'path=tmp/fstab state=touch'

// copy模块:复制文件到远程主机
ansible localhost -m copy -a 'src=/src/myfile.conf dest=/etc/foo.conf owner=foo group=foo mode=0644'

// service模块:用于管理主机服务
ansible localhost -m service -a ''

// cron模块:用于管理计划任务

// yum模块:使用yum包管理器来管理软件包

// user模块:用户管理模块

// group模块:组管理模块

// filesystem模块:在块设备上创建文件系统

// mount模块
配置挂载点

// get_url模块:用于从http/ftp/https服务器上下载文件

// unarchive模块:用于解压文件的模块

// script模块:在指定节点上执行shell/python脚本

// shell模块:在指定节点上执行shell/python脚本

// command模块:用于执行远程系统命令

// raw模块:类似于command模块,区别在于raw模块支持管道传递


9. Playbook

是Ansible的配置、部署、编排语言。
可以认为需要希望远程主机执行命令的方案,或一组IT程序运行的命令集合。
Ansible使用标准Yaml解析器并编写playbook

组成结构:

	```
	Inventory
	Modules
	Ad Hot Commands
	Playbooks
		Variables  // 变量元素,可传递给Tasks/templates使用
		Tasks     // 任务元素,即调用模块完成任务
		Templates // 模板元素,可根据变量动态生成配置文件 
		Handlers  // 处理器元素,通常指在某时间满足时触发的操作,发生改变时执行提前定义好的操作
		Roles	// 角色元素
	```

执行Playbook:

	ansible-playbook test.yml
	// 并行的级别是10个进程
	ansible-playbook test.yml -f 10

Playbook基础组件:
主机hosts和用户users
playbook的每一个play目的是为了让某个或某些主机以某个指定的用户的身份执行任务。
hosts用于指定要执行任务的主机。一个或多个冒号分割主机组。
remote_user用于指定远程主机上的执行任务的用户。

```
- hosts: test.zs  // 主机组
  gather_facts: no
  remote_user: root
  sudo: yes 
  sudo_user: myname //也可以指定通过sudo方式再远程主机上执行任务,或用sudo_user切换的用户
  tasks:     // 任务列表
  	-name: test connection
  		ping:
  		remote_user: myname // remote_user也可以用于task中
  		shell: 'echo "test "
  	-name: test1 connection
  		ping:
  		remote_user: myname // remote_user也可以用于task中
  		shell: 'echo "test 1"
  vars:
    - NVM_DIR: /usr/local/nvm
    - PROJ: testSvc
    - REPO: [email protected]:test.git
    - REPO_DIR: /home/test
    - pm2:
        config: test.api.yml
  roles:
    - role: deploy
```

tasks列表:
play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上运行,即在所有主机上完成第一个任务后再开始第二个任务。
如果发生host执行task失败,这个host会从整个playbook的rotation中移除,需要修正后重新执行。

目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,即多次执行时安全的,因为其结果一致。

每个task都有一个name。

提示:

PLAY RECAP *********************************************************************
10.10.143.122                : ok=5    changed=2    unreachable=0    failed=0

// OK:执行成功但没有做过任何变动的任务
// changed: 执行成功但做过变动的任务
// unreachable:无法到达的任务
// failed:失败的任务

你可能感兴趣的:(运维)