2021-7-28-自动化运维Ansible

自动化运维ansible

1,Ansible介绍

1.1,Ansible简介

ansible是新出现的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

在这里插入图片描述

(1)、connection plugins:连接插件,Ansible和Host通信使用,负责和被监控端实现通信;

(2)、host inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载;指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbooks:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

(6)、Ansible:Ansible的核心程序

ansible的特点:

(一)批量管理工具

(二)模块

(三)python

(四)无终端,是基于ssh实现管理的

(五)也支持主从模式

(六)也支持playbook

Ansible的优点:

(1)部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作

(2)默认使用SSH协议 ,安全,无需安装客户端

(3)配置简单、功能强大、扩展性强

(4)支持API(应用程序接口)及自定义模块,可通过Python轻松扩展

(5)通过Playbooks来定制强大的配置、状态管理

(6)提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台(收费产品,一般很少用)

(7)幂等性:一种操作重复多次结果相同

1.2,ansible 任务执行

ansible 任务执行模式

Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhocplaybook

  • ad-hoc模式(点对点模式)
      使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

  • playbook模式(剧本模式)
      是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

ansible 执行流程

在这里插入图片描述

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

ansible 命令执行过程:

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时py文件,sleep 0退出;

1.3,ansible的安装

1、安装

yum install epel-release #需要安装epel源

yum install ansible -y

2、查看ansible的版本信息

ansible --version

3、查看ansible配置文件

[root@ren5 ~]# rpm -qc ansible

/etc/ansible/ansible.cfg

/etc/ansible/hosts

4、调用模块(python)

paramiko #模拟ssh协议批量管理主机

jinja2 #模板语言,主要用来传递变量

yaml #相当于是一种编程语言

5、控制方式:

(1)免密钥:key-gen

server: ssh-keygen

scp id_rsa.pub root@192.168.254.25:/root/.ssh/authorized_keys

(2)用户密码:

参数形式:ansible_ssh_user=root; ansible_ssh_pass=root ansible_ssh_port=22

host inventory:记录着客户端的ip信息

[root@ren5 ~]# vim /etc/ansible/hosts

在文件最后添加:

[test_ren1]

192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=0304 ansible_ssh_port=22

192.168.11.6 ansible_ssh_user=root ansible_ssh_pass=0304 ansible_ssh_port=22

注意:/root/.ssh/known_hosts需在此文件中有ssh连接的记录才可

或者取消/etc/ansible/ansible.cfg文件中#host_key_checking = False的注释

如果用了密钥登录,则密码登录无效;也就是说这两种方式无法混合使用

6、调用ansible的三种模式:

hoc:命令行

playbooks:剧本|脚本

roles:角色

1.4,Ansible使用基本格式

1、使用格式

[root@ren5 ~]# ansible

Usage: ansible [options]

2、参数:

-m:(–module-name=MODULE_NAME)指定模块名称

-a:(–args=MODULE_ARGS)指定模块的具体参数

-s:以sudo的方式运行操作

-i:(–inventory=INVENTORY)指定被管理节点的主机列表

-f:(–forks=FORKS)一批连接几个主机进行操作(默认是5个主机,最高255)控制并发数

​ 线程是最小的调度单位,进程是最小的管理单元

ansible-doc -l #查看所支持的模块

ansible-doc -s MODEL_NAME #模块的具体用法和参数

ansible all --list-hosts #查看所有主机

1.5,ansible管理节点的三种方法

1、指定主机组名

[root@ren5 ~]# ansible test_ren1 -a “ip a” #默认调用command模块

2、指定一个特定IP

[root@ren5 ~]# ansible 192.168.11.4 -a “ls”

3、使用all

[root@ren5 ~]# ansible all -a “date”

1.6,配置文件

ansible配置文件:(/etc/ansible/ansible.cfg)

14#inventory = /etc/ansible/hosts 主机管理资产清单

15#library = /usr/share/my_modules/ ansible操作的动作,无论是本地或者远程,都使用一小段代码来执行,这小段代码称之为模块,这个library就是用来存放这些模块的路径

16#module_utils = /usr/share/my_module_utils/

17#remote_tmp = ~/.ansible/tmp

18#local_tmp = ~/.ansible/tmp

20#forks = 5 ansible默认操作主机的并发数

21#poll_interval = 15

22#sudo_user = root 这是默认的执行命令的用户,也可以在playbook中重新设置这个参数

23#ask_sudo_pass = True 用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no

24#ask_pass = True Ansible 剧本playbook 是否会自动默认弹出弹出密码.默认为no

25#transport = smart

26#remote_port = 22 这个指定连接被管理节点的端口,默认是22,除非设置了特殊的ssh端口

27#module_lang = C 默认模块和系统之间通信的计算机语言,默认为’C’语言

28#module_set_locale = False

61#host_key_checking = False 这是设置是否检查ssh秘钥,可以设置为False和True

103#timeout = 10 ssh连接超时时间

111#log_path = /var/log/ansible.log ansible默认是不记录日志的,如果想把ansible系统输出的日志存放到文件中可以开启这个选项

136#private_key_file = /path/to/file 使用ssh公钥私钥登录系统的时候,使用的秘钥路径

还有更多的配置项,大家可以参考官方文档,如下:官方文档

1.7,常用模块

1、ping模块:指定ansible server跟client的连通性,测试成功会返回“pong”

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

2、command模块:命令模块,默认模块,用于在远程执行命令(不支持正则和管道符)

[root@ren5 ~]# ansible test_ren1 -m command -a “date ‘+%F %T’”

3、cron模块:管理定时任务

state:(prsent:安装;absent:移除)

day、env、hour、job、minute、month、name、state、user、weekday

[root@ren5 ~]# ansible test_ren1 -m cron -a “minute=*/5 job=‘echo HELLO’ state=present name=cron_test1”

[root@ren5 ~]# ansible test_ren1 -a “crontab -l”

[root@ren5 ~]# ansible test_ren1 -a “crontab -r”

4、user模块:管理用户账户

name=:指明创建的用户的名字

remove=USERNAME(state=absent)

state=present #创建用户 shell=:指定用户shell类型

#ansible testhosts -m user -a ‘name=user1 uid=250 group=group250’

5、group模块:添加或者删除用户组

#ansible testhosts -m group -a ‘name=group250 gid=250’

6、copy模块:复制本地文件到远程主机

src=:定义本地源文件路径

dest=:定义远程目标文件路径

[root@ren5 ~]# ansible test_ren1 -m copy -a “src=/root/a.txt dest=/root/a.txt”

content=:取代src,表示直接用此处指定的信息生成为目标的内容

#ansible all -m copy -a ‘content=nihao dest=/root/a.txt’

7、service模块:管理程序服务,指定运行状态

[root@ren5 ~]# ansible all -m service -a “name=httpd state=restarted”

[root@ren5 ~]# ansible all -m shell -a “ss -tnl |grep 80”

enabled=:是否开机自动启动,取值为true或者false

name=:服务名称

state=:状态,取值有started,stopped,restarted

8、shell模块:和command模块类似,在远程主机上运行命令,支持变量等符号,尤其是在用到管道符等功能的复杂命令

[root@ren5 ~]# ansible all -m shell -a “ls /tmp |wc -l”

9、script模块:将本地脚本复制到远程主机并运行(无需加多余参数,只需要在-a后面加上本地脚本路径即可)

ansible testhosts -m script -a ‘/root/a.sh’

10、yum模块:安装程序包

[root@ren5 ~]# ansible all -m yum -a “name=httpd state=present”

[root@ren5 ~]# ansible all -m yum -a “list=httpd”

name=:指定要安装的程序包,可以带上版本号

state=:present,latest,installed表示安装,absent,removed表示卸载

list=:查看安装的程序包

11、setup模块:收集远程主机的facts

每个被管理的节点在接受并运行管理命令之前,会将自己主机相关信息,如操作系统版本,ip地址等报告给远程ansible主机

[root@ren5 ~]# ansible all -m setup

12、file模块:设置文件属性

[root@ren5 ~]# ansible all -m file -a “state=touch path=/root/test.txt”

2,playBooks

2.1,playbooks

如果用模块形式一般有幂等性,如果用shell或者command没有幂等性

playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用

tasks:一个task相当于是一个play

varibles:变量,一定定义,多处调用

template:模板,可以区分不同主机的特点

handlers:触发器,依赖于前一个任务,前一个任务如果执行改变,那么就会触发handlers

2.2,yaml介绍及格式

yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。

特点:

(1)yaml的可读性好

(2)yaml和脚本语言的交互性好

(3)yaml使用实现语言的数据类型

(4)yaml有一个一致的信息模型

(5)yaml易于实现

(6)yaml可以基于流程来处理

(7)yaml表达能力强,扩展性好

编写说明:

(1)缩进:yaml 的缩进要求比较严格。一定不能使用tab键

(2)冒号:每个冒号后面一定要有一个空格

注意:1. 以冒号结尾不需要空格

​ 2. 表示文件路径的模版可以不需要空格

(3)短横线-:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

注意:

1. 严格控制空格编写剧本的时候

2. 剧本编写不支持tab

书写规范注意点:

1、脚本名:***.yml 【不是.yml也行】

2、注释: “#”

3、tasks: (后不能加任何字符-可以加注释#)

4、- name: 一个 - name: 下不能有两条功能(行)

.每个-和:即冒号之后要有一个空格,task除外。

剧本格式:

— ### 剧本的开头,可以不写

- hosts: all <- 处理所有服务器,找到所有服务器; -(空格)hosts:(空格)all

tasks: <- 剧本所要干的事情; (空格)(空格)task:

- command: (空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

测试剧本命令后面可以跟多个-v进行调试检查

常用命令:

1、对剧本语法检测

ansible-playbook --syntax-check /root/ansible/httpd.yaml

2、-C模拟执行剧本

ansible-playbook -C /root/ansible/httpd.yaml

3、执行剧本

ansible-playbook /root/ansible/httpd.yaml

3,roles介绍

3.1,roles介绍

什么情况下用到roles?

假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook?

第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。

也就是说playbooks的所有的方式有个弊端—无法实现重复使用且代码重复;假设在同时部署httpd,php,mayql时或不同服务器组合不同的应用就需要写多个yaml文件。很难实现灵活的调用。

roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。roles的作用是减少代码的复写。

3.2,角色集合

角色集合:roles

phpserver

webserver

mysqlserver

files:存储由copy或script等模块调用的文件;src直接指定文件名称,不需要写绝对路径;

tasks:此目录中至少应该有一个名为main.yaml的文件,用于定义各task;其它的文件需要由main.yaml进行“包含”调用;

handlers:此目录中至少应该有一个名为main.yaml的文件,用于定义各handler;其它的文件需要由main.yaml进行“包含”调用;

vars:此目录中至少应该有一个名为main.yaml的文件,用于定义各variable;其它的文件需要由main.yaml进行“包含”调用;

templates:存储由template模块调用的模板文本;src只写文件名即可,不需要写绝对路径;

meta:此目录中至少应该有一个名为main.yaml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yaml进行“包含”调用;

default:此目录中至少应该有一个名为main.yaml的文件,用于设定默认变量;

site.yaml:入站文件(站点文件),用于调用roles中的角色,一般创建在roles目录下,和角色同级;也可在roles同级目录下创建playbook执行文件(yaml)

3.3,角色定制实例

1、在roles目录下生成对应的目录结构

[root@ren6 ~]# mkdir -pv ansible/roles/{webserver,phpserver,mysqlserver}/{files,tasks,vars,templates,handlers}

[root@ren6 ansible]# tree

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接在这里插入图片描述

2、配置角色(webserver)

(1)配置files文件:将httpd配置文件上传到files目录下(线配置一台主机)

[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/files/httpd.conf

(2)编写tasks任务列表

[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

- name: install httpd
  yum: name=httpd state=present
  ignore_errors: yes
- name: copy httpd.conf
  copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  tags:
  - conf
  notify:
  - restart httpd
- name: start httpd
  service: name=httpd state=started
- name: echo http_port
  shell: echo {{ http_port }} > /root/port.txt

(3)由于上面的tasks中定义了notify,所以要定义handlers

[root@ren6 ~]# vim ansible/roles/webserver/handlers/main.yaml

1 - name: restart httpd
2   service: name=httpd state=restarted

(4)tasks中定义了变量,需要在vars目录下创建main.yaml文件,并在文件中写入变量,以key: value的形式定义

[root@ren6 ~]# vim ansible/roles/webserver/vars/main.yaml

http_port: 88

(5)在roles下编辑站点文件site.yaml

[root@ren6 ~]# vim ansible/roles/site.yaml

1 ---
2 - hosts: 192.168.11.4
3   remote_user: root
4   roles:
5   - webserver

(6)语法检测及模拟运行

[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

[root@ren6 ~]# ansible-playbook -C ansible/roles/site.yaml

(7)使用模板文件templates ,复制httpd的配置文件至templates目录下

[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/templates/

(8)编辑templates文件

[root@ren6 ~]# vim ansible/roles/webserver/templates/httpd.conf

Listen {{ http_port }}

(9)修改tasks文件

[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

- name: install httpd
  yum: name=httpd state=present
  ignore_errors: yes
- name: copy httpd.conf
  template: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
  tags:
  - conf_vars
  notify:
  - restart httpd
- name: start httpd
  service: name=httpd state=started

(10)修改站点文件

[root@ren6 ~]# vim ansible/roles/site.yaml

1 ---
2 - hosts: test1
3   remote_user: root
4   roles:
5   - webserver

(11)修改主机信息管理文件

[root@ren6 ~]# vim /etc/ansible/hosts

1 [test1]
2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=81
3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=82

(12)语法检测及运行

[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

[root@ren6 ~]# ansible-playbook ansible/roles/site.yaml

PLAY [test1] *************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************
ok: [192.168.11.5]
ok: [192.168.11.4]

TASK [webserver : install httpd] *****************************************************************************************************
ok: [192.168.11.5]
ok: [192.168.11.4]

TASK [webserver : copy httpd.conf] ***************************************************************************************************
changed: [192.168.11.5]
changed: [192.168.11.4]

TASK [webserver : start httpd] *******************************************************************************************************
changed: [192.168.11.4]
changed: [192.168.11.5]

RUNNING HANDLER [webserver : restart httpd] ******************************************************************************************
changed: [192.168.11.4]
changed: [192.168.11.5]

PLAY RECAP ***************************************************************************************************************************
192.168.11.4               : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.11.5               : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
3.4,注意

1、在tasks文件下可以创建多个yaml文件,但roles只会调用main.yaml文件,所以可以用include关键字来调用其他yaml文件(- include_tasks: a.yaml)

2、roles目录下的角色名称可以随意起,不过,最好和其功能联系在一起

3、角色下的几个目录名称必须正确,s必须加上(files,tasks,vars,templates,handlers)

4、站点文件(site.yaml)内可以定义多个hosts,每个hosts下可以调用多个角色

AP ***************************************************************************************************************************
192.168.11.4 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.11.5 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0


#### 3.4,注意

1、在tasks文件下可以创建多个yaml文件,但roles只会调用main.yaml文件,所以可以用include关键字来调用其他yaml文件(- include_tasks: a.yaml)

2、roles目录下的角色名称可以随意起,不过,最好和其功能联系在一起

3、角色下的几个目录名称必须正确,s必须加上(files,tasks,vars,templates,handlers)

4、站点文件(site.yaml)内可以定义多个hosts,每个hosts下可以调用多个角色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值