【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本

文章目录

一、Ansible安装及远程控制

前提:要有两台主机(我这里是两台虚拟机)

如下:

ansible只需在管理机上安装即可。

被管理机要设置静态IP 设置方法可参考此篇博客

被管理机也被称为节点。

下文中,将被管理机centos_7_1简称为被控主机1

1、关闭防火墙和SELinux

bash 复制代码
systemctl status firewalld   #查看防火墙状态

防火墙状态参数为active即为开启。

bash 复制代码
sudo systemctl stop firewalld  #临时关闭防火墙

参数改为inactive即关闭状态。

关闭SELinux

查看:

bash 复制代码
getenforce

关闭:

bash 复制代码
sudo setenforce 0

2、安装ansible

1、安装Ansible软件包的EPEL源

bash 复制代码
yum install epel-release

2、安装ansible

bash 复制代码
yum -y install ansible

3、查看ansible版本

bash 复制代码
ansible --version

3、配置SSH无密码登录

需要使用到两个命令:ssh-keygen(生成一对密钥)、ssh-copy-id(把本地主机的公钥复制到目标主机上)。

1、在管理机上生成一对密钥

bash 复制代码
ssh-keygen -t rsa

遇到询问,一路回车

执行完毕后会在/root/.ssh下生成一对密钥,其中id_rsa为私钥,id_rsa.pub为公钥。

2、将公钥下发到远程主机

bash 复制代码
ssh-copy-id root@192.168.58.132 #该地址为被控主机1的ip地址

3、保管密钥

bash 复制代码
ssh-add .ssh/id_rsa
ssh 192.168.58.132 #被控机ip

此时就处于被控主机1的家目录下。

回到管理机,只需输入ssh命令

bash 复制代码
ssh 管理机ip

4、主机目录

主机目录又称主机清单,保存了ansible所管理的远程主机信息及一些连接参数,也可用来对远程主机进行分类。

主机目录的配置文件默认是/etc/ansible/hosts

查看该文件:

bash 复制代码
vi /etc/ansible/hosts

可看到以下内容:

将该文件清空,输入一下内容:

bash 复制代码
[webservers]
192.168.58.132  #被控主机1的ip地址

测试被控主机1是否能被ping通

bash 复制代码
ansible webservers -m ping

二、常用模块

查看ansible中已加载的模块

bash 复制代码
ansible-doc -l

通过ansible命令可以调用这些模块

bash 复制代码
ansible [节点] -m [模块] -a [参数]

1、setup模块

用于获取节点的详细信息。

例,使用setup模块查看webservers组的节点信息。

bash 复制代码
ansible webservers -m setup

2、copy模块

可实现从管理机向节点复制静态文件,并设置合理的文件权限。

常用参数:

bash 复制代码
dest      #文件复制的目的地
src       #复制的源文件
backup    #是否备份原始文件
validate  #复制前是否检验需要复制目的地的路径

例:

将/root/demo/demol.txt复制到所以节点的/root目录下(若没有该文件可换成其它文件):

bash 复制代码
cd /root/demo
ansible all -m copy -a 'dest=/root src=/root/demo/demol.txt

3、file模块

可用来定义文件或目录属性、权限,创建、删除文件或目录。

常用参数:

bash 复制代码
mode   #文件的读/写权限
path   #文件路径
src    #文件链接路径
stat   #默认值:file  
       #选项:file  #创建文件  
              link  #创建链接
              sbsent#删除文件

4、shell模块

可以执行远程主机的shell脚本文件,也支持管道。

例:

检查mysql进程是否存在:

bash 复制代码
ansible all -m shell -a 'ps -ef|grep mysql'

由图可知,节点192.168.58.132下有mysql进程。

5、script模块

用于将管理机上的shell脚本发送到节点上执行。

例,

写一个脚本:

bash 复制代码
vi hello.sh

//脚本内容为:
#!/bin/bash
echo "hello ansible"

不会写shell脚本可参考这两篇博客:
Shell概念、命令、操作(重定向、管道、变量)
Shell脚本编写基本语法

将该脚本发送到webservers组的节点上执行:

bash 复制代码
ansible webservers -m script -a '/root/hello.sh'

6、ping模块

检查连通性。

bash 复制代码
ansible webservers -m ping

7、group模块

可以在节点上创建组。

常用参数

bash 复制代码
gid   #用户组的GID
name  #用户组的名字
state    #默认值;present   
         #选项:present #新增
         #     absent  #删除
                 

例:

在webservers组的节点上创建一个组名为test、GID为2017的组:

bash 复制代码
ansible webservers -m group -a 'gid=2017 name=test'

8、yum模块

从指定服务器自动下载安装RPM包,并且可自动处理依赖性关系。

常用参数:

bash 复制代码
name       #包名
state   选项:present   #安装
              latest    #更新
              absent    #卸载

例:

在被控主机1上安装命令tree:

bash 复制代码
ansible 192.168.58.132 -m yum -a "name=tree state=present"

9、service模块

管理节点上的服务,可开启、关闭、重启服务等。

bash 复制代码
参数		选项		含义
enabled     yes/no      是否开机自启动
name         --         服务名称

state      started      启动
           stopped      关闭
           restarted    重启
           reloaded     重新下载

例:

开启被控节点192.168.58.132端的firewalld服务:

bash 复制代码
ansible 192.168.58.132 -m service -a "name=firewalld state=started"

可在对应节点使用systemctl status firewalld命令来查看firewalld状态。

三、playbook脚本

在学习ansible模块的时候,都是使用命令在节点上执行任务,命令使用比较复杂,且每执行一次均要重复输入,为避免重复输入命令,ansible提供了playbook脚本。一个能被ansible执行的YAML文件叫做playbook。

1、指定节点和用户

每个playbook都需要指定针对那些节点进行运维,并且以哪个用户来执行任务。

指定节点:hosts

指定用户:users

bash 复制代码
-hosts: webservers      #指定webservers组中的所有节点
 users: root            #指定用户为root

注:hosts的值可以是主机或组,也可以是关键字all,全部节点。

2、任务列表

即要执行的任务的队列,关键字为tasks。任务列表中的每个任务都通过调用ansible模块完成。按定义的先后顺序执行。

例:

bash 复制代码
tasks:
  - name: running nginx               #启动nginx服务
   service: name=nginx state=running  #调用service模块

name标签是对任务的描述,也可以不加,但一般是会使用name标签。

3、handlers

对ansible模块进行调用,用于处理一些动态事件。

handlers中的模块调用与任务列表中的任务不同,任务默认按定义顺序执行,而handlers只有被触发时才会执行。

4、基本语法

1、变量

在playbook文件中,是通过字段vars来定义变量的。

例:

bash 复制代码
- hosts: all       #指定节点为所有节点
  vars:
   http_port: 80   #定义http_port变量,值为80

2、条件语句

由字段when声明。

例:

当操作系统为Red Hat时执行重启命令:

bash 复制代码
task:
   - name: reboot Red Hat host
     command: /usr/sbin/reboot
     when: ansible_os_family=="Red Hat"

执行顺序:先判断when条件。如果成立,返回True,则执行上一条语句command:;

如果不成立,返回False,不会触发上一条语句

3、循环

常见的循环由字段with_items声明。

例:

在指定节点上同时安装多个软件;

bash 复制代码
task:
 - name: install LAMP
   yum: name={{item}} state=present
   with_items:
    - nginx
    - mysql-server
    - php

代码功能:安装nginx、mysql-server、php 3个软件。with_items会自动循环执行上面的语句:name={{item}} state=present,会用软件名替换item,循环次数为元素个数。

4、include

当多个playbook需要重复使用任务列表时,可以将任务内容抽离出来写入独立文件中,要调用时只需用include将文件包含进来。

例:有单独的任务列表文件tasks/nignx.yml,文件内容为:

bash 复制代码
---
- name: install nginx
  yum: name=nginx state=present   #安装nginx

此后,如果有playbook要执行该操作,只需写入以下代码:

bash 复制代码
tasks:
   - include: tasks/nginx.yml     #将该文件包含进来

用例演示:

通过编写一个playbook实现Apache的安装与启动。

1、创建目录:

bash 复制代码
mkdir /root/ansible

在该目录下添加apache.yml文件,此文件就是一个playbook

bash 复制代码
cd /root/ansible
touch apache.yml

编写playbook内容为:

bash 复制代码
---
- hosts: 192.168.58.132
  users: root
  vars:
   http_port: 80
   max_clients: 200

  tasks:
  - name: ensure apache is latest
    yum: pkg=httpd state=latest
  - name: write the apache config file
  template: src=/srv/httpd.j2 dest=/etc/httpd.conf
  
  notify:
  - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
    
  handlers:
  - name: restart apache
    service: name=httpd state=restarted

使用以下命令调用:

bash 复制代码
ansible-playbook /root/ansible/apache.yml

四、谢谢观看!

参考书籍:《Linux系统管理与自动化运维》黑马程序员/编著

相关推荐
Y多了个想法3 分钟前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
嚯——哈哈9 分钟前
AWS云服务器:开启高效计算的新纪元
服务器·云计算·aws
嚯——哈哈9 分钟前
从入门到精通:解析如何使用亚马逊云服务器(AWS EC2)
运维·服务器·aws
编程修仙43 分钟前
Collections工具类
linux·windows·python
芝麻团坚果1 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
Elastic 中国社区官方博客1 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
写点什么啦1 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
NotesChapter1 小时前
Android吸顶效果,并有着ViewPager左右切换
android
wellnw1 小时前
[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
linux·ubuntu
不爱学习的YY酱1 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统