Ansible自动化运维
目录
一、ansible概述
1.Ansible简介
2.Ansible工作机制
3.Ansible特性
二、Asible的安装
1)、设置EPEL仓库, Ansible仓库默认不在yum仓库中
2)、 使用yum安装Ansible
3)、 查看ansible的版本
三、Ansible基本使用
1、配置主机清单文件
2、测试
四、Ansible组件 -- inventory
五、Ansible组件 -- Ad-Hoc
六、Ansible组件 -- facts
七、Ansible组件 -- PlayBook
YAML介绍
所有的yum文件都必须以.yml或者.yaml结尾。
一、ansible概述
1.Ansible简介
—基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YAML 及 Jinja2模板语言,更强的远程命令执行操作。
Ansible 基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible自己本身纯主要的程序是不能运行任何东西的,可以把它完全当成一个平台,在平台集合了各种各样的模块,用模块实现它想要实现的功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
2.Ansible工作机制
connection plugins:连接插件,负责和被监控端实现通信,有SSH,ZEROMQ等,默认使用SSH连接
host inventory:主机清单,是一个配置文件里面定义监控的主机(用来记录所有被你远程操作机器的名单)
modules : 模块,核心模块、command模块、自定义模块等
plugins : modules功能的补充,包括连接插件,邮件插件等
playbook:编排,定义 Ansible 多任务配置文件,非必需
3.Ansible特性
1)、no agents:不需要在被管控主机上安装任何客户端,更新时,只需在操作机上进行一次更新即可
2)、no server:无服务器端,使用时直接运行命令即可
3)、modules in any languages:基于模块工作,可使用任意语言开发模块
4)、yaml,not code:使用yaml语言定制剧本playbook
5)、ssh by default:基于SSH工作
6)、strong multi-tier solution:可实现多级指挥
二、Asible的安装
1)、设置EPEL仓库, Ansible仓库默认不在yum仓库中
[root@ansible1 ~]# yum -y install epel-release 安装扩展源,启用epel仓库
[root@ansible1 ~]# yum list | grep -i ansible 看哪个软件是哪个源装的
2)、 使用yum安装Ansible
[root@ansible1 ~]# yum install ansible -y
3)、 查看ansible的版本
[root@ansible1 ~]# ansible --version
ansible 2.9.27
三、Ansible基本使用
1、配置主机清单文件
主机清单文件
定义所管理的主机组及主机,可以在主配置文件中指定清单文件位置和名称
默认位置/etc/ansible/hosts
主配置文件:
/etc/ansible/ansible.cfg
主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息
[root@ansible1 ~]# vim /etc/ansible/ansible.cfg 修改主配置文件的位置/名字
[root@ansible1 ~]# vim /etc/ansible/hosts
配置ssh公钥认证:
控制节点需要发送ssh公钥给所有非被控制节点。主机解析。
2、测试
语法
# ansible <pattern> -m <module_name> -a <arguments>
pattern--主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数 以~开头,匹配正则
最常用的模块:能直接让你用这个模块执行系统命令(在对面机器)
command 默认模块 可以不加-m
shell
执行shell命令
[root@ansible1 ~]# ansible 192.168.22.169 -m shell -a 'touch /tmp/b.txt' 给ip169创建b.txt
[root@ansible1 ~]# ansible 192.168.22.169 -m shell -a 'rm -rf /tmp/*' 删除b.txt
[root@ansible1 ~]# ansible 192.168.22.169 -m shell -a 'touch /tmp/c.txt;echo hello > /tmp/c.txt' 同时执行两条命令,创建一个c.txt,并且把hello重定向到c.txt
[root@ansible1 ~]# ansible w* -m shell -a 'touch /tmp/c.txt;echo hello > /tmp/c.txt' 所有以c开头的机器全部都执行。
执行command命令
ansible web1 -m command -a 'uptime'
ansible web1 -a 'uptime'
因为默认模块就是command,所以上面命令可以不加-m
同时指定多台机器
ansible web1,web2,web3 -m ping
使用ping模块检查ansible节点的连通性:
ansible web1 -m ping -o (-o是通用的,加上-o就是把执行结果变成一行)
使用ssh账户和密码
-u 用户 //指定ssh账户
-k //指定使用ssh密码(注意:如果设置了公钥认证,这里写什么密码都可以)
ansible w1 -a 'uptime' -u root -k 如果这台机器没有传公钥,远程ssh,默认是以root账户,root密码,所以在这里指定用户名,密码。(一般用的少,都会给被操纵机器加公钥)
SSH password:
w1 | SUCCESS | rc=0 >>
给节点增加用户
ansible 192.168.22.169 -a "useradd tom"
重定向输出到本地文件中
[root@ansible1 ~]ansible 192.168.22.169 -a "df -h" > /tmp/a.txt
[root@ansible1 ~]cat /tmp/a.txt
四、Ansible组件 -- inventory
inventory文件通常用于定义要管理主机及其认证信息,例如ssh登录用户名、密码以及key相关信息。
[root@ansible1 ~]# vim /etc/ansible/hosts 使用[]标签指定主机组
[root@ansible1 ~]# ansible db_servers -m shell -a 'echo hello > /tmp/a.txt' 对两台机器同时生效
查看组内主机列表
[root@ansible1 ~]# ansible db_servers --list-hosts
查看组内主机列表
ansible w1 -a 'uptime' -i web2.host 手动指定其他任意位置的清单
五、Ansible组件 -- Ad-Hoc
ad hoc 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。其实就是执行简单的命令,对于复杂的命令则需要playbook。
ansible-doc命令获取模块列表及模块使用格式
[root@ansible1 ~]# ansible-doc -l -l 获取列表
[root@ansible1 ~]# ansible-doc yum
[root@ansible1 ~]# ansible-doc -s yum ( -s module_name 获取指定模块的使用信息)
执行命令
-m shell
-f 2 指定定要使用的并行进程数,默认为5个。
[root@ansible1 ~]# grep forks /etc/ansible/ansible.cfg
#forks = 5
[root@ansible1 ~]# ansible all -m shell -a 'hostname' -o -f 3 all所有的机器,3台机器去处理,相当于并发控制。机器多的时候用得上
复制文件 -m copy
得有cp命令,源文件,目标文件
ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root group=root mode=644 backup=yes'
注意:src指定的是ansible本地机器上的文件
ansible all -m shell -a 'cp /tmp/a.txt /tmp/b.txt'
注意:如果想拷贝远程机器上的文件则需要使用remote_src=yes选项
# ansible 192.168.22.169 -m copy -a "src=/tmp/cc.txt dest=/tmp/dd.txt remote_src=yes"
用户管理
-m user
添加用户
[root@ansible1 ~]# echo '123' | openssl passwd -1 -stdin 产生一个加密的密码
$2$hXe3alXf$4VGhWAbRGA6tm4NMJznSf1
[root@ansible1 ~]# ansible 192.168.22.169 -m user -a 'name=lisi password="$2$hXe3alXf$4VGhWAbRGA6tm4NMJznSf1"' -o
测试 看密码是不是123 su - lisi
删除用户
[root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi state=absent" -o
使用变量需要用双引:
[root@ansible1 ~]# pass=`echo '1' | openssl passwd -1 -stdin` (把密码交给一个变量,ansible是可以加变量的,但是外边不能用单引号了)
[root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi password=$pass" -o (变成双引就好了)
使用命令替换需要用双引:
[root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi password=`echo '1234' | openssl passwd -1 -stdin" -o
软件包管理 -m yum
安装软件:
[root@ansible1 ~]# ansible 192.168.22.169 -m yum -a 'name=httpd state=latest/installed/present'
latest直接安装最新版本
删除软件:
[root@ansible1 ~]# ansible 192.168.22.169 -m yum -a 'name=httpd state=removed/absent'
服务管理 -m service
[root@ansible1 ~]# ansible 192.168.22.169 -m service -a 'name=httpd state=started enabled=yes'
systemctl list-unit-files 查看是不是 开机启动
六、Ansible组件 -- facts
最主要的功能:用来获取被操控机器的基本信息
facts组件是Ansible用于采集被管理主机信息的一个功能,可以使用setup模块查看主机的有的facts信息。
组件的名字叫facts,但要是想用组件获取信息用的是setup模块。
[root@ansible1 ~]# ansible 192.168.22.169 -m setup 可以拿到被操控机器的所有信息
[root@ansible1 ~]# ansible 192.168.22.169 -m setup -a 'filter=ansible_all_ipv4_addresses'
将所有主机的信息输入到/tmp/facts目录下:
每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
[root@ansible1 ansible]# ansible all -m setup --tree /tmp/facts
[root@ansible1 ~]# cd /tmp/
[root@ansible1 tmp]# ls
facts
[root@ansible1 tmp]# cd facts/
[root@ansible1 facts]# ls
192.168.22.169
[root@ansible1 facts]# cat 192.168.22.169
[root@ansible1 facts]# ansible 192.168.22.169 -m setup -a 'filter=ansible_*_mb' 查看主机内存信息
[root@ansible1 facts]# ansible 192.168.22.169 -m shell -a "ip a" 参数忘了可以直接 ip a 拿到ip地址
七、Ansible组件 -- PlayBook
playbook介绍
playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。
Playbook是Ansible的配置,部署,编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。
当执行一些简单的改动时ansible命令是非常有用的,然而它真的作用在于它的脚本能力。当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
Playbook还开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
YAML介绍
Ansible使用标准的YAML解析器,使用YAML文件语法即可书写playbook。
YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001首次发表了这种语言。
YAML Ain’t Makup Language,即YAML不是XML。不过,在开发这种语言时,YAML的意思是:Yet Another Makrup Language(仍是一种标记语言),其特性:YAML的可读性好、YAML和脚本的交互性好、YAML有一个一致的信息模型、YAML易于实现、 YAML可以基于流来处理、YAML表达能力强,扩展性好。
所有的yum文件都必须以.yml或者.yaml结尾。
playbook的基础组件
name 定义playbook或者task的名称
hosts playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。与命令模式下的ansible匹配规则一样
user remote_user则用于指定远程主机上的执行任务的用户,也可以使用user
tasks 任务列表 play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars 定义变量
vars_files 定义变量文件
notify 任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers 用于当前关注的资源发生变化时采取一定指定的操作
include 能包含的包括task,handler和playbook 可以在include的时候传递变量
简单playbook
vim test.yml # 固定后缀为yml或者yaml
文档以---开头,没有也可以
#两部分
#1.字典 映射 map dic
# key value的形式出现
# 凡是value为非嵌套结构的,直接写在key的后面,冒号后面必须加空格
# 凡是value为嵌套结构的,换行,冒号后面不需加空格
#2.list 列表
# 每个列表都是以-开头的,-后面必须带空格
# [1,2,3,[4,5,6]]
# - 1
# 2
# 3
# - 4
# 5
# 6
#语法规则
#1.区分大小写
#2.同级元素缩进必须一致,缩进的空格数量不限
#3.缩进尽量用空格,少用tab。