Linux ansible 服务

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 [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 角色:

  • 版权声明: 本文源自互联网, 于3个月前,由整理发表,共 5098字。
  • 原文链接:点此查看原文