阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ansible自动化运维工具使用详解

204次阅读
没有评论

共计 6913 个字符,预计需要花费 18 分钟才能阅读完成。

一、 ansible 简介

1. ansible

ansible 是新出现的 自动化 运维工具 基于 Python 研发 糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。 仅需在管理工作站上安装 ansible 程序配置被管控主机的 IP 信息,被管控的主机无客户端。 ansible 应用程序存在于 epel( 第三方社区 ) 源,依赖于很多 python 组件

Ansible 自动化运维工具使用详解

2.ansible 特性

模块化 设计 ,调用特定的模块来完成特定任务 ,本身是核心组件,短小精悍

基于 Python 语言实现,由 Paramiko (python 的一个可并发连接 ssh 主机功能库 ) , PyYAML 和 Jinja2 ( 模板化 ) 三个关键模块实现;

部署简单,agentless 无客户端工具;

主从模式 工作;

支持自定义模块 功能;

支持 playbook 剧本,连续任务按先后设置顺序完成;

期望每个命令具有 幂等性:

3.ansible 架构

ansible core ansible 自身核心模块

host inventory: 主机库,定义可管控的主机列表

connection plugins: 连接插件,一般默认基于 ssh 协议连接

modules:core modules ( 自带模块 ) custom modules ( 自定义模块 )

playbooks :剧本,按照所设定编排的顺序执行完成安排任务

Ansible 自动化运维工具使用详解

4. 配置 文件:

(1)ansible 应用程序的 主配置文件:/etc/ansible/ansible.cfg

(2) Host Inventory 定义管控主机 :/etc/ansible/hosts

遵循 INI 风格;中括号中的字符是组名;一个主机可同时属于多个组;

示例:

# Ex 1: Ungrouped hosts, specify before any groupheaders. 直接在任何组的头部前面指定,不属于任何组的主机

green.example.com

blue.example.com

192.168.100.1

192.168.100.10

# Ex 2: A collection of hosts belonging to the’webservers’ group ;一批主机属于一个组,例如定义为 ‘webservers’ 的组

[webservers]

alpha.example.org

beta.example.org

192.168.1.100

192.168.1.110

注意:默认是以 root 用户执行,但是基于 ssh 连接操作要多次输入密码,为方便可以使用基于 ssh 密钥方式进行认证

二、 ansible 应用程序命令

1. ansible-doc 命令:获取模块列表,及模块使用格式;

ansible-doc -l :获取列表

ansible-doc -s  module_name :获取指定模块的使用信息

2.ansible 命令格式

ansible  <host-pattern>  [-f forks] [-m module_name]  [-a args]

<host-pattern>

指明管控主机,以模式形式表示或者直接给定 IP ,必须事先定义在文件中; all 设置所有

[-f forks]

指明每批管控多少主机,默认为 5 个主机一批次

[-m module_name]

使用何种模块管理操作,所有的操作都需要通过模块来指定

[-a args]

指明模块专用参数; args 一般为 key=value 格式

注意:command 模块的参数非为 kv 格式,而是直接给出要执行的命令即可;

注意: <host-pattern> 默认读取 /etc/ansible/hosts ,也可以指明自定义文件路径

-iPATH, –inventory=PATH:指明使用的 host inventory 文件路径;

常用模块 (module_name)

1) command:默认模块 ,可省略。在远程主机上进行操作命令

-a  ‘COMMAND’

注意: comand 模块的参数非 key=value 格式,直接给出要执行的命令

[root@localhost ~]# ansible all -m command -a  ‘ifconfig’

2)user:

-a ‘name=  state={present ( 创建 ) |absent ( 删除 ) }  force= ( 是否强制操作删除家目录 )   system=  uid=  shell= home=’

[root@localhost ~]# ansible all -m user -a ‘name=ansible state=present’

3)group:

-a ‘name= state={present|absent}  gid=  system= ( 系统组 )

[root@localhost ~]# ansible all -m group -a ‘name=mygroup state=presentsystem=true’

4)cron:

-a  ‘name= state=  minute=  hour= day=  month=  weekday= job=’

[root@localhost ~]# ansible all -m cron -a ‘name=’Time’ state=presentminute=’*/5′ job=’/usr/sbin/ntpdate 172.168.0.1 &> /dev/null”

5)ping:

无参数

[root@localhost ~]# ansible all -m ping

6) file: 文件管理

-a ‘path=  mode=  owner= group= state={file|directory|link|hard|touch|absent}  src= (link ,链接至何处 )

[root@localhost ~]# ansible all -m file -a ‘path=/tmp/testdirstate=directory’

[root@localhost ~]# ansible all -m file -a ‘path=/tmp/test.txt state=touchmod=600 owner=user1’

7)copy:

-a ‘dest= ( 远程主机上路径 )   src= ( 本地主机路径 )   content= ( 直接指明内容 )  owner=  group=  mode=’

[root@localhosttmp]# ansible web -m copy -a ‘src=/etc/yum.repos.d/aliyun.repodest=/etc/yum.repos.d/’

8)template

-a  ‘dest= src=\’#\'” content=  owner= group=  mode=’

9)yum:

-a ‘name=  conf_file= ( 指明配置文件 )  state={present|latest|absent} enablerepo= disablerepo=’       

[root@localhost ~]# ansible all -m yum ‘name=httpd state=present’

10)service:

-a ‘name= state={started|stopped|restarted} enabled= ( 是否开机自动启动 )   runlevel=’

[root@localhost ~]# ansible all -m service -a ‘name=httpd state=started’

11)shell:

-a ‘COMMAND’   运行 shell 命令

[root@localhost ~]# ansible all -m shell -a echo “123456789” |passwd –stdin user1′

12)script:

-a ‘/PATH/TO/SCRIPT’ 运行脚本

[root@localhost ~]# ansible all -m script -a ‘/tmp/a.sh’

13) setup:获取指定主机的 facts 变量

Ansible 自动化运维工具使用详解

三、 Playbooks 剧本

1.playbook 组织格式:YAML 语言格式

playbooks ansible 更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行

(1)YAML 简介

YAML YAML Ain’t  Markup Language;  Yet Another Markup Language;

类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互

官方站点: http://www.yaml.org

(2) 语法 格式

1) 任何书记结构都用缩进来标识,可以嵌套

2) 每一行是一个键值数据 k ey :v alue ,冒号隔开。若想在一行标识需要用 {} , 分隔格式

3) 列表用 标识

2. inventory 参数 :主机库 ssh 参数设置

ansible 基于 ssh 连接 inventory 中指定的远程主机时,将以此处的参数指定的属性进行;

ansible_ssh_port

指定 ssh 端口

ansible_ssh_user

指定 ssh 用户

ansible_ssh_pass

指定 ssh 用户登录是认证密码,明文密码不安全

ansible_sudo_pass

指明 sudo 时候的密码

实例:

[websrvs]

192.168.0.101  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=xuding

192.168.0.102

注意:在 /etc/ansible/hosts 中直接定义连接时候的密码不安全,一般建议基于 ssh 的密钥认证方式实现

3.playbooks

(1) 核心元素

Tasks 任务、 Variables 变量、 Templates 模板、 Handlers 处理器、 Roles 角色

(2)playbooks 定义任务:

– name:task description     注释 描述信息

module_name: module_args   声明模块:定义 ansible 模块参数

Ansible 自动化运维工具使用详解

(3) ansible-playbook 执行 命令:

ansible-playbook  <filename.yml> …  [options]

Ansible 自动化运维工具使用详解

4.playbook— 变量

(1)变量命名:字母、数字和下划线组成,仅能以字母开头;

(2)变量种类:

1) facts:由远程主机发回的主机 特有的 属性信息,这些信息被保存在 ansible 变量中;无须 声明 ,可直接调用;

2)自定义变量:

通过命令行传递:ansible-playbook  test.yml  –extra-vars “host=www user=test”

通过 roles 传递

3) 主机变量:定义在 inventory 中的主机之后的变量; 直接传递给单个主机的变量

实例:

[root@localhost ~]# vim /etc/ansible/hosts 中直接定义在主机之后

[web]

192.168.0.101    host=mail

192.168.0.102

192.168.0.103

4) 组变量:定义在 inventory 中的组上的变量 ( 例如在默认的文件 /etc/ansible/hosts 上编辑 )

[group_name:vars]

var1=value

var2=value

注意:组名要事先存在,实例如下:

[websrvs]

192.168.0.101

192.168.0.102

[websrvs:vars]

host=mail

变量使用示例:

[root@localhost~]# vim useradd.yml

–    hosts: websrvs

remote_user: root

vars:

username: testuser

password: xuding

tasks:

-name: add user

user: name={{username}} state=present

-name: set password

shell: /bin/echo {{password}} |/usr/bin/passwd –stdin {{username}}

注释:

1) {{}} 调用变量

2) #ansible-playbook /PATH/TO/SOME_YAML_FILE  {-eVARS|–extra-vars=VARS}     变量的重新赋值调用方法

[root@localhost ~]# ansible-playbookuseradd.yml –extra-vars “username=Ubuntu”

5.playbook—  tasks

(1) 条件测试:

在某 task 后面添加 when 子句即可实现条件测试功能;when 语句支持 Jinja2 语法;

    实例 当时 RedHat 系列系统时候调用 yum 安装

tasks:

-name: install web server package

yum: name=httpd state=present

when: ansible_os_family == “RedHat”

(2) 迭代: item

在 task 中调用内置的 item 变量;在某 task 后面使用 with_items 语句来定义元素列表;

tasks:

-name: add four users

user: name={{item}}  state=present

with_items:

-testuser1

-testuser2

-testuser3

-testuser4

注意:迭代中,列表中的每个元素可以为字典格式;

实例:

-name: add two users

user: name={{item.name}}  state=present groups={{item.groups}}

with_items:

– {name: ‘testuser5’, groups: ‘wheel’}

– {name: ‘testuser6’, groups: ‘root’}

6.playbook— handlers: 处理器;触发器

只有其关注的条件满足时,才会被触发执行 的任务;

实例:配置文件发生改变触发重启服务

-hosts: websrvs

remote_user: root

tasks:

-name: install httpd

yum:name=httpd state=present

-name: install config file

copy: src=/root/httpd.confdest=/etc/httpd/conf/httpd.conf

notify: restart httpd

-name: start httpd service

service: name=httpd state=started

handlers:

-name: restart httpd

service: name=httpd state=restarted

7.playbook 模板

templates:

用于生成文本文件(配置文件);模板文件中可使用 jinja2 表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;

roles:

roles 用于实现“代码复用”;

roles 以特定的层次型格式组织起来的 playbook 元素(variables,tasks, templates, handlers);

可被 playbook 以 role 的名字直接进行调用;

用法 :在 roles/ 下建立 [group_name] 子目录,并非全部都要创建;例如:

/etc/ansible/roles/ (在 /etc/ansible/ansible.cfg 定义 roles 目录)

webserver/

files/:此角色中用到的所有文件均放置于此目录中;

templates/:Jinja2 模板文件存放位置;

tasks/:任务列表文件;可以有多个,但至少有一个叫做 main.yml 的文件;

handlers/:处理器列表文件;可以有多个,但至少有一个叫做 main.yml 的文件;

vars/:变量字典文件;可以有多个,但至少有一个叫做 main.yml 的文件;

meta/:此角色的特殊设定及依赖关系;

使用 Ansible 高效交付 Docker 容器  http://www.linuxidc.com/Linux/2015-10/124233.htm

使用 Ansible 批量管理远程服务器  http://www.linuxidc.com/Linux/2015-05/118080.htm

Ansible 安装配置与简单使用  http://www.linuxidc.com/Linux/2015-07/120399.htm

在 CentOS 7 中安装并使用自动化工具 Ansible  http://www.linuxidc.com/Linux/2015-10/123801.htm

Ansible 和 Docker 的作用和用法  http://www.linuxidc.com/Linux/2014-11/109783.htm

Ansible 批量搭建 LAMP 环境 http://www.linuxidc.com/Linux/2014-10/108264.htm

Ansible:一个配置管理和 IT 自动化工具  http://www.linuxidc.com/Linux/2014-11/109365.htm

Ansible 的详细介绍:请点这里
Ansible 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133466.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计6913字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中