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
浙公网安备 33010602011771号