Ansible is Simple IT Automation 简单的自动化运维IT工具。
基于Python开发,实现批量系统设置、批量程序部署、批量执行命令等功能。批量部署是立身于ansible的模块进行工作的。
通俗说:就是在一个台或几台服务器上,执行一系列的命令,批量在远程服务器上执行命令。
默认通过SSH协议管理机器;
brew install ansible
// 安装成功后 查看版本是否安装成功
ansible --version
可以实现无秘访问控制其他机器,实现自动化的前提,可以在配置好ansible.cfg和hosts主机清单后执行。
// 生成密钥
ssh-keygen -t rsa
// 向主机分发秘钥
ssh-copy-id root@主机名或ip
主机的端口默认22,非默认可以明确表示
test.com:8888
一组相似的hostname,可以简写:
[test] test[1:10].com // 1到10台机器
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类型
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。
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模块支持管道传递
是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:失败的任务