Linux ansible 服务
Ansible:
运维工具的分类:
agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, …
agentless:基于ssh服务完成管理,ansible, fabric, …
使用agentless基于ssh服务管理时,最好使用ssh密钥对进行认证连接。
ansible架构:
Ansible Core:ansible主架构;
Modules:模块;
Core Modules:核心(标准模块)
Customed Modules:自定义模块
Host Iventory:主机清单(要管理的主机);
Files:通过文件加载要管理的主机
CMDB:通过外部设备进行管理主机
PlayBooks:剧本;
Hosts:
roles:定义要完成的任务功能
Connection Plugins:连接插件,连接至各被管控的主机,完成并发连接,ansible默认一次管控5台主机;
ansible特性:
模块化:调用特定的模块,完成特定的任务;
基于Python语言研发,由Paramiko, PyYAML和Jinja2三个核心库实现;
部署简单:agentless基于ssh服务完成管理;
支持自定义模块,使用任意编程语言;
强大的playbook机制;
幂等性;
安装及程序环境:
程序:
ansible
ansible-playbook
ansible-doc
配置文件:
/etc/ansible/ansible.cfg
主机清单:
/etc/ansible/hosts
插件目录:
/usr/share/ansible_plugins/
ansible管理获取模块:
获取模块列表:ansible-doc -l
获取模块列表帮助:ansible-doc -h
获取指定模块的使用帮助:ansible-doc -s MOD_NAME
基本使用入门:
ansible命令格式:
Usage: ansible <host-pattern> [options]
常用选项:
-m MOD_NAME -a MOD_ARGS
配置Host Inventory:
/etc/ansible/hosts
[group_id]:配置主机清单组;
HOST_PATTERN1
HOST_PATTERN2
示例:
在ansible主机清单中定义服务组:
ansible常用模块:
ping:探测目标主机是否存活;
示例:
command模块:在远程主机执行命令;
shell模块:在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 ;
注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;
示例:
在远端主机执行hostname命令:
示例:
在远程各个主机上创建分别创建centos用户:
为在各个远程主机上创建的centos用户设置密码:
copy模块:拷贝文件到远端主机上:
用法:
(1) 复制文件
-a "src= dest= "
(2) 给定内容生成文件
-a "content= dest= "
content:直接给定内容;
mode:设置权限;
其它参数:mode, owner, group, …
示例:
拷贝content=remote 到各个远程被控主机websrvs组的/tmp/remote.ansible;
websrvs组中的主机:192.168.3.2 192.168.3.8
验证:copy到websrvs组主机其中192.168.3.2中的内容:
file模块:设置文件属性
用法:
state:定义文件目标状态;
absent:删除指定的文件;
director:创建目录;
link:定义链接文件;
(1) 创建目录:
-a "path= state=directory"
(2) 创建链接文件:
-a "path= src= state=link"
(3) 删除文件:
-a "path= state=absent“
absent:缺席的;在此意为:删除;
示例:
在远端主机上创建目录:
在远端主机上删除创建的目录:
在远端主机上创建链接文件:
验证远端主机上的link文件:
fetch模块:从远程某一台主机拉取文件;
例
cron模块:管理周期性任务计划
-a ""
minute=
hour=
day=
month=
weekday=
job=
name=
user=
state={present|absent}
示例:
使用ansible给各远程主机设置周期性计划任务:
删除各远程主机上的周期性计划任务可以使用 state=absent:
hostname模块:管理远端主机的主机名
name=
示例:
为远端主机192.168.3.2主机设置hostname主机名:
去远端主机192.168.3.2主机上验证主机名是否设置成功:
yum模块:管理远程主机使用yum模块安装程序包:
注意:在远端主机上需先配置好yum仓库;
-a ""
(1) name= 安装所指定的服务程序包。
state={present|latest} 默认为:present;
state=absent 删除指定的程序包。
conf_file
disable_gpg_check
disablerepo
list
name=
state
update_cache
示例:
使用ansible的yum模块为远端主机安装最新版的httpd服务:
service模块:管理远端主机服务`started'/`stopped' `restarted'
-a ""
name=
state=
started
stopped
restarted
enabled= 定义远端主机开机是否自启动;
runlevel= 定义远端主机在那些运行级别下可以开机自启动;
示例:
使用ansible控制远程主机httpd服务启动,并设置为开机自启动:
group模块:在远程主机上添加/删除组:
-a ""
name=
state=
system=
gid=
示例:
使用ansible为各远程主机创建test组:
使用ansible删除各远程主机上的test组:
user模块:在远端主机上创建/删除用户:
-a ""
name= 指定要创建的用户名
group= 指定基本组
groups= 指定附加组
comment= 备注
uid= 指定uid号
system= 指定为系统用户
shell= 指定新建用户使用的shell
expires= 指定过期时长
home= 指定家目录
示例:
使用ansible为各个远端主机创建一个用户haha:
使用ansible删除各个远端主机上的用户haha:
setup模块:从指定的远端主机上获取远端主机详细的配置参数:
示例:
从远端主机192.168.3.2上获取详细的配置参数:
YAML:YAML是一个人类易读的数据序列化格式设计的脚本语言。
YAML is a data serialization format designed for human readability and interaction with scripting languages.
数据结构:
key:value
– item1
– item2
– item3
{name:jerry, age:21}
ansible-playbook:
核心元素:
Tasks:任务,由模块定义的操作的列表;
Variables:变量
Templates:模板,即使用了模板语法的文本文件;
Handlers:由特定条件触发的Tasks;
Roles:角色;
playbook的基础组件:
Hosts:运行指定任务的目标主机;
remote_user:在远程主机以哪个用户身份执行;
sudo_user:非管理员需要拥有sudo权限;
tasks:任务列表
模块,模块参数:
格式:
(1) action: module arguments
(2) module: arguments
ansible-playbook:用法
Usage: ansible-playbook [options] playbook.yml
options:
-C, –check:测试playbook任务,但不真正的执行;
–list-hosts:列出playbook任务影响到的主机;
–list-tasks:列出playbook要执行的任务;
运行playbook,使用ansible-playbook命令
(1) 检测语法
ansible-playbook –syntax-check /path/to/playbook.yaml
(2) 测试运行
ansible-playbook -C /path/to/playbook.yaml
–list-hosts
–list-tasks
–list-tags
(3) 运行
ansible-playbook /path/to/playbook.yaml
-t TAGS, –tags=TAGS 指明要运行的任务标签
–skip-tags=SKIP_TAGS 指明要跳过的任务标签
–start-at-task=START_AT 指明要从哪个任务标签开始运行
示例:
定义一个playbook,创建用户和组及安装htpd服务并启动:
检查playbook user.yaml剧本语法:
为远端主机192.168.3.7安装httpd服务,复制配置文件并启动服务:
注:提供的配置文件监听的端口为:8080
handlers:由特定条件触发的Tasks;
调用及定义方式:
tasks:
– name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers:
– name: HANDLER_NAME
module: arguments
示例:
在复制一份httpd服务监听80端口的主配置文件到远端主机192.168.3.2上,然后使其触发handlers:
或执行reload服务:
测试:
测试:
tags:给指定的任务定义一个调用标识;
– name: NAME
module: arguments
tags: TAG_ID
多个任务可以使用同一个标签;
执行时也可以一次调用多个任务;
示例:
指明要在远端主机上要执行的任务标签:
Variables:
类型:
内建:
(1) facts
自定义:
(1) 命令行传递;
-e VAR=VALUE
(2) 在hosts Inventory中为每个主机定义专用变量值;
(a) 向不同的主机传递不同的变量 ;
IP/HOSTNAME variable_name=value
(b) 向组内的所有主机传递相同的变量 ;
[groupname:vars]
variable_name=value
(3) 在playbook中定义
vars:
– var_name: value
– var_name: value
注意:variables变量在host inventory和 playbook中都可以定义。
(4) Inventory还可以使用参数:
用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
…
(5) 在角色调用时传递参数
roles:
– { role: ROLE_NAME, var: value, …}
示例:
变量调用:
{{ var_name }}
示例:
在playbook中定义变量名安装vsftpd服务:
这时我们可以使用命令行给playbook中的pkgname变量传递变量值,让其在远端主机上安装vsftpd服务:
注意:命令行 -e 选项给定的变量名变量值要比playbook中给定的变量名变量值要优先使用。
我们也可以在playbook中定义变量名和变量名来安装vsftpd服务:
示例:
在hosts Inventory中为每个主机定义专用变量值:
或者向组内的所有主机传递相同的变量 ;
在playbook中定义任务:
Templates:模板
文本文件,内部嵌套有模板语言脚本(使用模板语言编写)
注意:此模板不能在命令行使用,而只能用于playbook;
Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.
语法:
字面量:
字符串:使用单引号或双引号;
数字:整数、浮点数;
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false
算术运算
+, -, *, /, //, %, **
比较操作:
==, !=, >, <, >=, <=
逻辑运算:and, or, not
执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
template:
-a ”“
src=
dest=
mode=
onwer=
group=
示例:
使用template模板为websrvs组的远端主机安装配置nginx服务:
1)拷贝本机ansible上的nginx.conf的主配置文件到/root目录下并制定后缀名为j2:
2)编辑/root/nginx.conf.j2 文件,使nginx的worker_processes进程调用ansible的cpu个数内键变量来生成worker进程数:
3)编辑ansible的host inventory配置文件 :
4)编辑playbook
注意:此playbook需要在远端主机上的/root目录下先准备好rpm格式的软件包。如果没有可以使用wget下载。
测试:
when条件测试:
when语句:在tasks中使用,Jinja2的语法格式;
示例:
条件测试centos6、centos7 nginx服务启动:
编写playbook:
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为"item”,使用with_items属性给定要迭代的元素;
元素:列表
字符串
字典
示例:
基于字符串列表给出元素,安装服务:
示例:
基于字典列表给出元素,创建用户和组:
删除用户和组:
roles角色:
以特定的层级目录结构进行组织的tasks、vars、handlers、templates、files等;
role_name/
files/:存储由copy或script等模块调用的文件;
tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
templates/:存储由template模块调用的模板文本;
meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
在playbook中调用角色的方法:
– hosts: HOSTS
remote_user: USERNAME
roles:
– ROLE1
– ROLE2
-{ role: ROLE3, VARIABLE: VALUE, …}
– { role: ROLE4, when: CONDITION }
实验测试nginx使用角色调用:
在/etc/ansible/roles目录下创建特定的目录角色(roles):
拷贝nginx安装包到/etc/ansible/nginx/file/目录下:
拷贝ansible本机nginx的主配置模板和默认配置模板到/etc/ansible/roles/nginx/templates/目录下并添加后缀名为XXXX.j2
更改nginx模板的主配置文件
更改nginx的模板默认配置文件:
编辑/etc/ansible/roles/nginx/tasks/main.yml文件:
在tasks任务中定义了,拷贝nginx安装包到远程主机、定义了在远程主机上安装nginx程序包、定义了拷贝ansible主机上的nginx主配置文件和默认配置文件的template模板文件到远程主机上、定义了在远程主机上启动nginx服务并开机自启动。
编辑/etc/ansible/roles/nginx/handlers/main.yml文件:
编辑/etc/ansible/roles/nginx/vars/main.yml
在playbook中调用nginx角色:
测试/etc/ansible/nginx.yml语法:
测试:
在playbook中使用字典调用nginx角色:
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/60052