Ansible 自动化运维工具
Ansible是什么?
Ansible是一个“配置管理工具”也是一个“自动化运维工具”
Ansible 作用:
Ansible是新出现的自动化运维工具,基于Python开发,实现批量系统配置,批量程序部署,批量运行命令
Ansible 简介:
Ansible 是一个能实现批量部署的自动化运维工具,基于python开发,能实现批量系统配置,批量部署程序,批量运行命令。Ansible是基于模块来运行,它本身没有任何批量部署的能力,ansible主要是提供一种批量部署的框架。
Ansible的框架:
- 连接的插件connection plugins: 负责和被监控端的通信
- Host inventory : 指定服务器上配置文件定义监控的客户端
- 核心模块: command、shell、yum、copy、ping、rm、自定义模块(第三方模块)等
- Playbook: 剧本任务,在非必要的情况下可以在一个节点执行多个任务
Ansible 特性:
- No agent 不需要在被管控主机上安装任何软件
- No server 不用单独启用服务,能使用直接运行,使用时直接运行命令
- 对硬件资源占用小
- 不需要在被管控的主机上安装任何软件
- 基于模块工作
- 基于ssh工作
- 使用yaml语言
- 可实现多级指挥
Asible的优势:
1) 轻量级易操作
2) 分布式,无agent客户端
3) 配置语法是YAML语言
4) 轻量级,无需在客户端安装agent,更新时在操作机更新一次即可
5) 批量任务执行可以写成脚本,不用发送给客户机就可执行
6) 使用python编写,维护简单
7) 支持sudo
Ansible的架构:
连接其他主机默认使用的ssh协议,也支持local、zeromq的方式连接
核心:ansible
核心模块(core modules):ansible自带的模块
扩展模块(custom modules):核心模块不能满足需求,添加扩展模块。
插件(plugins):完成模块的补充
剧本(playbook):在ansible配置文件中,可以将多个任务定义在一个剧本中,在ansibel执行剧本。
连接插件(connectior plugins):ansible默认使用ssh连接的,但是ansible也支持其他的连接方式,其他的连接方式是需要插件的支持,才可以实现通信。
主机群(host inventory): 定义ansible管理的主机的
Ansible生成的主要文件
1 |
/etc/ansible |
Ansible的工作原理:
- 服务端连接客户端,实现通信
- 通过服务器的节点使用模块实现客户端的需求
- 通过剧本实现多个任务的实现
Ansible 的7个命令:
Ansible、Ansible-doc、Ansible-galaxy、Ansible-lint、Ansible-playbook、Ansible-pull、Ansible-vault:
Ansible:
Ansible是核心的指令,主要用于执行单条命令,默认跟的是主机和选项部分,默认不指定模块时,使用的是command模块(默认使用的模块可以在ansible.cfg修改):
Eg:[root@44 ~]# ansible all -a "pwd"
192.168.20.70 | SUCCESS | rc=0 >>
/root
- 参数:
- -a 'Arguments', --args='Arguments' 命令行参数
- -m NAME, --module-name=NAME 执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
- -i PATH, --inventory=PATH 指定库存主机文件的路径,默认为/etc/ansible/hosts.
- -u Username, --user=Username 执行用户,使用这个远程用户名而不是当前用户
- -U --sud-user=SUDO_User sudo到哪个用户,默认为 root
- -k --ask-pass 登录密码,提示输入SSH密码而不是假设基于密钥的验证
- -K --ask-sudo-pass 提示密码使用sudo
- -s --sudo sudo运行
- -S --su 用 su 命令
- -l --list 显示所支持的所有模块
- -s --snippet 指定模块显示剧本片段
- -f --forks=NUM 并行任务数。NUM被指定为一个整数,默认是5。 #ansible testhosts -a "/sbin/reboot" -f 10 重启testhosts组的所有机器,每次重启10台
- --private-key=PRIVATE_KEY_FILE 私钥路径,使用这个文件来验证连接
- -v --verbose 详细信息
- all 针对hosts 定义的所有主机执行
- -M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/
- --list-hosts 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 文件
- -o --one-line 压缩输出,摘要输出.尝试一切都在一行上输出。
- -t Directory, --tree=Directory 将内容保存在该输出目录,结果保存在一个文件中在每台主机上。
- -B 后台运行超时时间
- -P 调查后台程序时间
- -T Seconds, --timeout=Seconds 时间,单位秒s
- -P NUM, --poll=NUM 调查背景工作每隔数秒。需要- b
- -c Connection, --connection=Connection 连接类型使用。可能的选项是paramiko(SSH),SSH和地方。当地主要是用于crontab或启动。。。。。
Ansible-doc:
Ansible-doc -h 用于查看模块的信息常见的参数-l -s
Ansible-doc -l 列出已安装的模块
Ansible-doc -s 模块 : 查查看具体模块的使用方法
Ansible-galaxy:
Ansible-galaxy 从站点下载第三方的扩展模块
[root@44 ~]# ansible-galaxy -h
Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
Ansible-lint:
Ansible-lint对playbook的语法进行检查的工具
Ansible-lint 剧本名
注:本人安装的ansible 没有此命令选项所以用ansible-playbook --syntax-check 对剧本进行语法的检查
[root@44 ~]# ansible-playbook --syntax-check + 剧本名
对剧本语法进行检查但不执行
Ansible-playbook:
Ansible-playbook 读取playbook文件执行相应的动作。
执行ansible-playbook的剧本
eg:执行a.yml剧本
[root@44 ~]# ansible-playbook a.yml
Ansible-pull:
Ansible-pull 适用于数量多的机器配置,远程执行命令的工具。对运维架构能力比较强
Ansible-vault:
Ansible-vault 配置文件有敏感信息,设置加密/解密这个配置文件
常用模块使用
Ansible语法:ansible 机组名 -m 模块 -a 执行的内容
1) Setup模块
用来查看远程主机的一些基本信息
Ansible 用户 -m setup
2) Ping模块
## 用来测试远程主机的运行状态
Ansible 用户 -m ping
3) Copy模块
复制文件到远程主机
示例:将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器
Ansibles -m copy -a "src=/etc/ansible/ansible.cfgdest=/tmp/ansible.cfg owner=root group=root mode=0644"
4) Command模块
## 在远程主机上执行命令
相关选项如下:
ansible storm_cluster-m command -a "uptime"
5) Shell模块
## 切换到某个shell执行指定的指令,参数与command相同。
这个模块与script不同的是,首先要将写好的sh脚本分发到机组,再执行
与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw。
示例:
先在本地创建一个SHELL脚本
vim/tmp/rocketzhang_test.sh
将创建的脚本文件分发到远程
ansiblestorm_cluster -m copy -a "src=/tmp/rocketzhang_test.shdest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"
远程执行
# ansiblestorm_cluster -m shell -a "/tmp/rocketzhang_test.sh"
6) Script模块
用script:模块可以实现到对象节点上执行本机脚本。有点类似copy+shell+删除copy的脚本的这样一个综合的功能。
ansible host32-m script -a /tmp/hello.sh
7) 更多模块
其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。
service:系统服务管理
cron:计划任务管理
yum:yum软件包安装管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理
File : 对文件目录的创建、删除
Path 参数:用来指定要操作的文件或目录
State 参数: 设定操作的需求
State=directory 创建目录
State=touch 创建文件
State=link 创建硬连接
State=absent 缺席、删除
Ansible-playbook 剧本
Ansible-playbook的作用:
为什么使用ansible-playbook哪?当批量部署的过程中有些监控器需要做出改动的时候,我们不需要通过ansible命令去手动去改动,那样太过于消耗时间,我们可以把它写成脚本,有改动的时候,只需要修改定义下的变量就好。Ansible中的脚本功能就是ansible-playbook剧本。
Ansible-playbook 的使用方法:
Ansible-playbook的组织格式:YAML语言格式
YAML的简介:
类似于半结构化数据,声明式配置,可读性较高用来表达资料序列的格式,容易与脚本语言交互
YAML的语法格式:
① 任何书记结构用缩进来标识,可以嵌套
② 每一行的一个键值key:value ,冒号隔开。若想在一行标识用{}和,分隔
③ 列表用-标识
Playbook 组成的结构:
Host: 被监控的主机
Tasks :任务,调用的模块执行操作
Variables: 变量
Templates: 模板
Handlers :处理器
Roles :角色
基本结构:
– host:webservices
remote_user:
– tasks:
– task1
module_name
YAML文件扩展名通常为.yml,如test.yml。
Eg:
[root@44 ~]# cat a.yml
- hosts: 192.16.20.70
remote_user: root
tasks:
- name: add group
group: name=new state=present
- name: add user
user: name=yxyfyy group=new
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/etc/services dest=/tmp/ owner=nobody group=new
[root@44 ~]# ansible-playbook --syntax-check a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.16.20.70
playbook: a.yml
编写playbook 剧本(执行拷贝的模板,把主机上的1111.txt文件拷贝到被监控的主机上。)
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
对playbook剧本进行检测有没有错误
[root@44 ~]# ansible-playbook --syntax-check a.yml
playbook: a.yml
执行playbook剧本
[root@44 ~]# ansible-playbook a.yml
PLAY [192.168.20.70] ******************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [192.168.20.70]
TASK [copy] ***************************************************************************
changed: [192.168.20.70]
PLAY RECAP ****************************************************************************
192.168.20.70 : ok=2 changed=1 unreachable=0 failed=0
检查结果
[root@44 ~]# cat 1111.txt
ansible
[root@yk3 ~]# cat /tmp/1111.txt
ansible
Ansible-playbook的组成:
Ansible-playbook可以理解为把ansible的使用的模块方法写入ansible-playbook剧本中。
Ansible-playbook文件是以“.yaml”或“.yml”结尾的文件
EG:
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70 (指定被操作主机)
(yaml语法中使用冒号映射键值对,“冒号”后必须加空格)
remote_user: root (指定远程操作时使用那个用户)
(注意格式:yaml语法用层级关系,同一层级的是对齐的。(开头对齐))
tasks: (操作的任务列表,可以有多个任务)
- name: copy (自定义任务名称)
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
(任务的操作,copy:copy模块,src:源地址,(copy的内置条件) dest:目的地址, owner:所属人 group:所属组)
Hosts:定义要操作的主机,可以是IP地址、主机名(提前域名解析)、定义的分组。 定义多个主机要用,分隔开
Ansible-playbook 剧本
Ansible-playbook的作用:
为什么使用ansible-playbook哪?当批量部署的过程中有些监控器需要做出改动的时候,我们不需要通过ansible命令去手动去改动,那样太过于消耗时间,我们可以把它写成脚本,有改动的时候,只需要修改定义下的变量就好。Ansible中的脚本功能就是ansible-playbook剧本。
Ansible-playbook 的使用方法:
Ansible-playbook的组织格式:YAML语言格式
YAML的简介:
类似于半结构化数据,声明式配置,可读性较高用来表达资料序列的格式,容易与脚本语言交互
YAML的语法格式:
① 任何书记结构用缩进来标识,可以嵌套
② 每一行的一个键值key:value ,冒号隔开。若想在一行标识用{}和,分隔
③ 列表用-标识
Playbook 组成的结构:
Host: 被监控的主机
Tasks :任务,调用的模块执行操作
Variables: 变量
Templates: 模板
Handlers :处理器
Roles :角色
基本结构:
– host:webservices
remote_user:
– tasks:
– task1
module_name
YAML文件扩展名通常为.yml,如test.yml。
Eg:
[root@44 ~]# cat a.yml
- hosts: 192.16.20.70
remote_user: root
tasks:
- name: add group
group: name=new state=present
- name: add user
user: name=yxyfyy group=new
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/etc/services dest=/tmp/ owner=nobody group=new
[root@44 ~]# ansible-playbook --syntax-check a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.16.20.70
playbook: a.yml
编写playbook 剧本(执行拷贝的模板,把主机上的1111.txt文件拷贝到被监控的主机上。)
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
对playbook剧本进行检测有没有错误
[root@44 ~]# ansible-playbook --syntax-check a.yml
playbook: a.yml
执行playbook剧本
[root@44 ~]# ansible-playbook a.yml
PLAY [192.168.20.70] ******************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [192.168.20.70]
TASK [copy] ***************************************************************************
changed: [192.168.20.70]
PLAY RECAP ****************************************************************************
192.168.20.70 : ok=2 changed=1 unreachable=0 failed=0
检查结果
[root@44 ~]# cat 1111.txt
ansible
[root@yk3 ~]# cat /tmp/1111.txt
ansible
Ansible-playbook的组成:
Ansible-playbook可以理解为把ansible的使用的模块方法写入ansible-playbook剧本中。
Ansible-playbook文件是以“.yaml”或“.yml”结尾的文件
EG:
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70 (指定被操作主机)
(yaml语法中使用冒号映射键值对,“冒号”后必须加空格)
remote_user: root (指定远程操作时使用那个用户)
(注意格式:yaml语法用层级关系,同一层级的是对齐的。(开头对齐))
tasks: (操作的任务列表,可以有多个任务)
- name: copy (自定义任务名称)
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
(任务的操作,copy:copy模块,src:源地址,(copy的内置条件) dest:目的地址, owner:所属人 group:所属组)
Hosts:定义要操作的主机,可以是IP地址、主机名(提前域名解析)、定义的分组。 定义多个主机要用,分隔开