ansible搭建学习

官方文档:https://docs.ansible.com/ansible/latest/index.html

参考文档: https://www.cnblogs.com/keerya/p/7987886.htm

 

关于Ansible:

Ansible是一种IT自动化工具。它可以配置系统,部署软件并协调更高级的IT任务,例如连续部署或零停机滚动更新。

Ansible以无代理的方式管理机器。从来没有关于如何升级远程守护程序的问题,也没有因为卸载守护程序而无法管理系统的问题。由于OpenSSH是最受同行评议的开源组件之一,因此可以大大降低安全风险。

 

架构图:

 

 

 


核心:ansible

核心模块(Core Modules):这些都是ansible自带的模块

扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块

插件(Plugins):完成模块功能的补充

剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行

连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件

主机群(Host Inventory):定义ansible管理的主机

优先类别:

Ansible提供了四个来源来控制其行为。按照从最低(最容易覆盖)的优先级到最高(覆盖所有其他优先级)的优先顺序,这些类别是:

配置设定

命令行选项

剧本关键字

变数

每个类别都会覆盖所有低优先级类别中的所有信息.

 

配置设置包括ansible.cfg文件和环境变量的值。在此类别中,配置文件中设置的值具有较低的优先级。Ansible使用ansible.cfg找到的第一个文件,而忽略所有其他文件。Ansibleansible.cfg在以下位置搜索的顺序:

ANSIBLE_CONFIG (如果设置了环境变量)

ansible.cfg (在当前目录中)

~/.ansible.cfg (在主目录中)

/etc/ansible/ansible.cfg

环境变量的优先级高于中的条目ansible.cfg。如果您在控制节点上设置了环境变量,则它们将覆盖ansible.cfg文件Ansible加载的设置。任何给定环境变量的值都遵循常规的Shell优先级:定义的最后一个值将覆盖先前的值。

 

ansible执行过程:

加载本机配置文件,默认/etc/ansible/ansible.cfg;

查找对应的主机配置文件(ansible/hosts),找到要执行的主机或者组;

加载对应的模块文件;

通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;

对应执行用户的家目录的.ansible/tmp/ansible-tmp-xxx/xxx.py文件;

执行并返回结果;

 

配置文件:

Ansible中的某些设置可以通过配置文件(ansible.cfg)进行调整。

如果从程序包管理器安装Ansible,则最新ansible.cfg文件应存在于中/etc/ansible,.rpmnew如果有更新,则应以文件(或其他文件)的形式出现。

如果从pip或从源安装了Ansible,则可能要创建此文件以覆盖Ansible中的默认设置。

 

执行模式:

ad-hoc:调用单个模块,支持同时执行多条命令

playbook:将ad-hoc的命令集合完成

 

参数说明:

#inventory      = /etc/ansible/hosts        //默认库文件(hosts文件)位置

#library        = /usr/share/my_modules/  //ansible模块目录,可以多个目录,使用;分开

#remote_tmp     = ~/.ansible/tmp   //Ansible 通过远程传输模块到远程主机,然后远程执行,执行后在清理现场.在有些场景下,你也许想使用默认路径希望像更换补丁一样使用

#plugin_filters_cfg = /etc/ansible/plugin_filters.yml   //如果没有提供“hosts”节点,这是playbook要通信的默认主机组.默认值是对所有主机通信

#forks          = 5   //在与主机通信时的默认并行进程数 ,默认是5d

#poll_interval  = 15  //当具体的poll interval 没有定义时,多少时间回查一下这些任务的状态, 默认值是5秒

#sudo_user      = root  //sudo使用的默认用户 ,默认是root

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

#ask_pass      = True  //控制Ansible playbook 是否会自动默认弹出密码

#remote_port    = 22  //远程ssh端口。 默认是22

#log_path = /var/log/ansible.log  //指定日志文件

 

安装扩展包epel-release和ansible:

yum install epel-release  –y
yum install ansible –y

 

编辑/etc/ansible下的hosts文件:

[]代表组

填写在该组的服务器ip,如下:

 

 

 

模块测试:

ping模块:

用于测试ping功能

ansible nodes -m ping  ##测试nodes组中服务器是否可以ping通

 


command模块:

使用该模块可以直接在远程机器上执行命令,不支持管道符

ansible nodes -m command -a "free -h"  ## 查看nodes下机器内存使用情况

 

 

shell模块:

在远程主机上调用shell解释器运行命令

ansible nodes -m shell -a "ip addr |grep ens32"  ##查看nodes下机器ens32网卡信息

 

copy模块:

用于将文件复制到远程主机
ansible nodes -m copy -a 'src=./test dest=/ mode=777'    ##将当前目录下的test复制到nodes集群下的/目录下,权限为777

参数:

添加backup=yes 可以进行覆盖

src:  源文件,可以是绝对路径,也可以是相对路径

dest: 目标路径.

 

  

file模块:

用于设置文件的属性,如文件创建,文件删除等

参数:

force  #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group  #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限

owner  #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径

recurse  #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况

dest  #被链接到的路径,只应用于state=link的情况

state  #状态,有以下选项:

       directory:如果目录不存在,就创建目录

       file:即使文件不存在,也不会被创建

       link:创建软链接

       hard:创建硬链接

       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

       absent:删除目录、文件或者取消链接文件

 

创建目录:

ansible nodes -m file -a 'path=/app state=directory'

 

 

 

删除文件:

ansible web -m file -a 'path=/app state=absent'

 

 

 

fetch模块:

用于从远程主机获取文件

参数:

src:在远程拉取的文件,并且必须是一个file,不能是目录

dest:用来存放文件的目录

 

 

 

yum模块

用于使用yum安装软件

参数:

name  包名称

state   absent/removed  卸载 present/installed 安装 latest 安装最新的软件

 

service模块

用于管理服务运行状态

参数

name #服务名称

enabled #设置开机启动。

state  #有四种状态,分别为:started:启动服务, stopped:停止服务, restarted:重启服务, reloaded:重载配置

 

mount模块

用于批量管理主机进行挂载卸载操作

参数:

用于批量管理主机进行挂载卸载操作

src          设备文件信息

path       设置挂载点信息

state       absent:会进行卸载,也会修改fstab文件信息 unmounted:会进行卸载,不会修改fstab文件 present:不会挂载,只会修改fstab文件 mounted:会进行挂载,会修改fstab文件


cron模块

用于管理cron计划任务的。

参数:

name #定时任务描述

job   #指明运行的命令是什么

state absent:删除定时任务,present添加定时任务

minute/hour/day/month/weekday  和设置时间相关

 


user模块:

远程批量创建用户信息

name            指定用户名信息

password              指定密码信息

uid         指定用户uid信息

group            指定用户主要属于哪个组

groups          指定用户属于哪个附加组信息

shell /bin/bash或/sbin/nologin,指定是否能够登录

create_home yes/no    是否创建家目录信息

home            指定家目录创建在什么路径 默认/home

 

group模块:

远程批量创建用户组信息

name            指创建组名称信息

gid         指创建的组ID信息

state       absent:删除指定的用户组 present:创建指定的用户组

 

playbook:

playbook由YMAL语言编写。

 YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。

 文件名称应该以.yml结尾

 

YMAL格式:

  1、文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。

  2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby。

  3、YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。

  4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。

5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。

 

举例:

---

#安装与运行mysql服务

- hosts: node1

  remote_user: root

  tasks:

 

    - name: install mysql-server package

      yum: name=mysql-server state=present

    - name: starting mysqld service

      service: name=mysql state=started

 

host部分:使用 hosts 指示使用哪个主机或主机组来运行下面的 tasks ,每个 playbook 都必须指定 hosts ,hosts也可以使用通配符格式。主机或主机组在 inventory 清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行 task 的过程中。

remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行 task 的用户,可以任意指定,也可以使用 sudo,但是用户必须要有执行相应 task 的权限。

tasks:指定远端主机将要执行的一系列动作。tasks 的核心为 ansible 的模块,前面已经提到模块的用法。tasks 包含 name 和要执行的模块,name 是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

 

Playbook的核心元素:

Hosts:主机组;

Tasks:任务列表;

Variables:变量,设置方式有四种;

Templates:包含了模板语法的文本文件;

Handlers:由特定条件触发的任务;

 

基本组件

  Playbooks配置文件的基础组件:

    Hosts:运行指定任务的目标主机

    remoute_user:在远程主机上执行任务的用户;

    sudo_user:

    tasks:任务列表

 

  格式:

    tasks:

      – name: TASK_NAME

       module: arguments

       notify: HANDLER_NAME

       handlers:

      – name: HANDLER_NAME

       module: arguments

variables 变量: 

facts :可直接调用

 

variables也可以直接调用facts组件,具体的facters可以使用setup模块来获取,然后直接放入剧本中调用即可。

 

用户自定义变量:直接使用用户自定义变量

ansible-playbook命令的命令行中的-e VARS, --extra-vars=VARS,这样就可以直接把自定义的变量传入

 

在playbook中定义变量(剧本内声明)

vars:

  - var1: value1

- - var2: value2

 


例子:
    

 

 

 

 

Host Inventory

  可以直接在主机清单中定义。

 

  向不同的主机传递不同的变量:

  IP/HOSTNAME varaiable=value var2=value2

  向组中的主机传递相同的变量:

   [groupname:vars]

   variable=value

posted @ 2020-09-06 11:45  努力变强的菜鸟  阅读(249)  评论(0)    收藏  举报