【大咖讲堂-173期】 十五分钟实现Ansible常用模块入门
本文是马哥教育特约金牌讲师、Linux运维专家魏巍的分享《Anisble常用模块入门指南》的文字整理篇。
朋友们晚上好:
今天我为大家带来的分享是
Ansible系列课堂之基础入门-基础模块的使用
难度指数: 2星(满星5星)
技术指数: 5星(满星5星)
理论指数: 2星(满星5星)
面向人群: 自动化运维&初中级运维
简单做下自我介绍:
魏巍: 出生时经医生证实为90后超早期,狂热的单车与开源爱好者,6年Linux一线运维经验,《Ansible权威指南》一书联合作者,做事情常出于“我不懂所以我想知道”的好奇心,在运维界界颇负“魏巍是谁啊没听说过”的盛名。
简介
众所周知,ansible是自动化运维神器
可以方便的实现大批量定制任务
首先,我们来了解一下ansible的整体架构
接下来,我们对上图中ansible的核心组件进行简单的解析
-
Ansible core : 即ansible软件本身
-
Host ivnetory : 主机池,定义可以由ansible来管理的主机
-
Core modules : 核心模块,即ansible处自带的模块,可完成大部分任务
-
Custom modules : 用户自己编写定制的模块,实现特定功能
-
Playbook : 用于定义多个任务在一个文件中,可多次使用
-
Connection plugin : 用来连接第一个被管理主机,实现一些辅助功能
第一条ansible命令
今天我们将借助一些ansible基础命令来初步了解一下Host inventory,深入学习几个常用的Core module
我们来看一条简单的ansible命令:
ansible datanodes -mcommand -a “uptime”
下面我们对其基本命令格式进行解析
adnsible的基本使用格式,如下:
ansible <host-pattern> [-f forks] [-mmodule_name] [-a args]
-
-f forks: 启动的并发线程数
-
-m module_name: 要使用的模块
-
-a args: 模块所需的参数
主机池
# ansible datanodes -mcommand -a uptime 中,
datanodes即所谓的host-pattern
定义在/etc/ansible/hosts文件中,格式如下:
(主机列表可以为域名,也可为IP地址)
data[4:6]为data4,data5,data6的简写形式
只有在/etc/ansible/hosts中定义过的主机,才能被ansible管理
主机变量
可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:
[webservers]
www1.magedu.com http_port=80maxRequestsPerChild=100
www2.magedu.com http_port=8080maxRequestsPerChild=200
需要注意的是这些变量只能在playbook中使用
组变量
组变量是指赋予给指定组内所有主机上的在playboo中可用的变量。例如:
[webservers]
www1.magedu.com
www2.magedu.com
共享如下变量:
[webservers:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
如此,ntp_server和nfs_server两个变量,便可被webservers组内所有主机共享
主机池
Ansible默认使用root用户,通过ssh对各主机进行管理
建议使用ssh密钥免密码认证来连接各主机
但也可以全用指定用户和密码,可直接在ansible hosts文件中指定:
ssh相关的参数如下:
ansible_ssh_host
指定域名对应的IP地址
ansible_ssh_port
指定ssh连接端口号
ansible_ssh_user
指定ssh默认使用哪个用户进行管理
ansible_ssh_pass
ssh连接所用的密码 (这非常不安全,强烈建议全用ssh密钥认证或交互式输入密码 --ask-pass )
ansible_sudo_pass
指定sudo的密码 (这非常不安全,强烈建议全用ssh密钥认证或交互式输入密码 --ask-pass)
简单明了,不是吗?
关于主机池的应用,先说这么多
下面我们深入介绍一下几个常用的核心模块
常用模块
Ansible 默认使用command模块,所以
#ansible –m commanddatanodes -a uptime
可以简写为: #ansible datanodes -a uptime
如图所示:
执行命令成功,返回结果为绿色
获取帮助
Anbible的模块那么多,我该如何获取各模块的信息和帮助呢?
Ansible为我们提供了ansible-doc命令
基本用法为:
ansible-doc [-Mmodule_path] [-l] [-s] [module...]
-M 文件路径, --moudle-path=文件路径
指定额外目录来寻找模块所需的库文件
-s, --snipet=
产生一段可以应用playbook中内容,类似于一种任务模板
-l, --list=
显示简洁的模块列表和一些简单的注释
如图所示,ansible-doc会显示两列信息
左侧为模块名,右侧为模块简介
左右一一对应
简单明了
以group模块为例
# ansible-doc -s group
group部共四个参数
-
gid: 指定所建组的ID,可选
-
name: 指定组名
-
state: 设定组的状态,默认为present,设置为absent时,表示删除该组
-
system: 值为yes时,表示该组将会被创建为系统组
(注意:group模块需要依赖系统命令:groupadd,groupdel,groupmod)
如此,我们在各datanode结点上分别创建gid为501的组
#ansible datanodes -m group -a 'name=developer'
data2| success >> {
"changed": true,
"gid": 501,
"name": "developer",
"state": "present",
"system": false
}
data3| success >> {
"changed": true,
"gid": 501,
"name": "developer",
"state": "present",
"system": false
}
删除developer组操作
# ansible datanodes -m group -a'name=developer state=absent'
data4 | success>> {
"changed": true,
"name": "developer",
"state": "absent"
}
data3 | success>> {
"changed": true,
"name": "developer",
"state": "absent"
}
user模块
ansible-doc user
user模块常用的参数有:
-
name: 指定所建用户的用户名
-
group: 指定所建用户的主组,可选
-
groups: 指定所建用户的附加组,如果设置为空(’groups=’),则清空所有附加组信息
-
shell: 指定使用哪种shell
-
uid: 指定用户的ID
-
state: 设定帐号状态,当值为absent时,将会删除指定用户
一个直观的例子:
ansible all –m user –a‘name=dev uid=666 group=developer’
我们看到,uid和group均为我们设置的值
group显示的是gid,gid501即为我们刚才新建的组ID
状态值state为present
当我们需要删除用户时,使用state设为absent就可以了,如:
ansible all –m user –a‘name=dev uid=666 group=developer state=absent’
copy模块
顾名思义,copy模块是用来远程传输文件的
常用参数如下:
-
src: 指定本地源文件路径,绝对路径或相对路径都可以,如果路径指向一个目录,则会把目录下所有文件全部复制
-
dest:远程主机的上文件存放路径,必做使用绝对路径
-
content: 直接在命令中指定文件内容,使用该内容在远程主机上生成文件
-
backup: 是否备份目标文件,默认为no
-
owner: 指定文件属主
-
group: 指定文件属组
-
mode: 指定文件权限,如640
一个简单的例子
我们要把本地文件/etc/issue复制到远程主机/tmp/目录下
属主为:zabbix用户
同时,还要求只有属主对该文件有读写权限
ansible datanodes -m copy -a 'src=/etc/issuedest=/tmp/issue.ansible mode=600 owner=zabbix'
content 参数的用法
比如,我们传送一段内容
“hello world
how are you ?” 到远程主机上的文件/tmp/content.ansible,操作如下:
# ansible datanodes -m copy -a'content="hello world!\n how are you? \n"dest="/tmp/content.ansible"'
# ssh data3 "cat /tmp/content.ansible"
hello world!
how areyou?
content可以对\n进行转义
是不是很棒?!~
定时任务管理模块:cron
批量管理定时任务
cron模块下的参数:day,hour,minute,month,weekday与系统crontab中的值一一对应
默认值都是*
-
jod:指定要定期执行的任务
-
name: 给任务一个简单的名字或注释,必选
-
state: 设定任务状态,absent表示删除该定时任务
为了演示效果
要求第分钟ping 一个www.baidu.com
# ansible data1 -m cron -a 'name="pingtest" minute="*/1" job="ping www.baidu.com" '
data1 | success >> {
"changed": true,
"jobs": [
"ping test"
]
}
注意:
name变量是必须指定的
删除某个job时,使用state参数:
state=absent
shell模块:在远程主机上执行命令
类似command模块
但是稍有不同,功能更为强大
比如,使用command中要使用管道符“|”
报出一系列的错误
使后shell模块后
顺利执行
所以,当命令中需要用到管道符时,一定要使用shell模块替代command模块
最后,给初学都一个最容易上手的模块
ping模块
Ping 模块用于检测主机的网络连通性
正常通信的主机,会返回一个pong信号
————广告时间————
《马哥Linux云计算及架构师》课程,由知名Linux布道师马哥创立,经历了8年的发展,联合阿里巴巴、唯品会、大众点评、腾讯、陆金所等大型互联网一线公司的马哥课程团队的工程师进行深度定制开发,课程采用 Centos7.2系统教学,加入了大量实战案例,授课案例均来自于一线的技术案例。
开课时间:11月06号
扫描二维码和更多小伙伴组团学习