第三十六天:Ansible安装和常见问题

一、自动化运维应用场景

1、运维职业发展路线

2、企业实际应用场景分析

DEV开始环境-》测试环境-》预发布环境-》发布环境-》生产环境-》灰度环境

3、常见自动化运维工具

Ansible:python,Agentless,中小型应用环境
Saltstack:python,一般需部署agent,执行效率更高
Puppet:ruby, 功能强大,配置复杂,重型,适合大型环境
Fabric:python,agentless
Chef:ruby,国内应用少
Cfengine
func
二、Ansible 介绍和架构
公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备。公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以供开发和测试
人员使用,运维老大为了在年底有所表现,要求运维部门同学尽快实现,当你接到这个任务时,有没有更快的解决方案?
1、Ansible 发展史 
作者:Michael DeHaan( Cobbler 与 Func 作者)
Ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗
2012-03-09,发布0.0.1版,2015-10-17,Red Hat宣布1.5亿美元收购
官网:https://www.ansible.com/
官方文档:https://docs.ansible.com/

2、Ansible 功能

批量执行远程命令,可以对远程的多台主机同时进行命令的执行
批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
提供自动化运维工具的开发API, 有很多运维工具,如jumpserver就是基于 ansible 实现自动化管理功能

3、Ansible 特点

(1)优点

  功能丰富的模块:提供了多达数千个的各种功能的模块,完成特定任务只需调用特定模块即可,还支持自定义模块,可使用任何编程语言写模块
  使用和部署简单: 无需安装专用代理软件,基于python和SSH(默认已安装)实现
  安全: 基于OpenSSH实现安全通讯无需专用协议
  幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性和模块有关
  支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  较强大的多层解决方案 Role
  Python语言实现, 基于Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
  属于红帽(IBM)公司产品,背景强大,未来发展前景光明
(2)缺点 
  如果管理的主机较多时,执行效率不如saltstack高
  当前还不支持像MySQL数据库一样的事务回滚

4、Ansible 架构

(1)Ansible 组成

组合INVENTORY、API、MODULES、PLUGINS的绿框,为ansible命令工具,其为核心执行工具 

 

  INVENTORY:Ansible管理主机的清单文件,默认为 /etc/ansible/hosts
  MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  API:供第三方程序调用的应用程序编程接口
(2)Ansible 命令执行来源
  USER 普通用户,即SYSTEM ADMINISTRATOR
  PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  CMDB(配置管理数据库) API 调用
  PUBLIC/PRIVATE CLOUD API调用
  USER-> Ansible Playbook -> Ansibile 
(3)注意事项
  执行ansible的主机一般称为管理端, 主控端,中控,master或堡垒机
  主控端Python版本需要2.6或以上
  被控端Python版本小于2.4,需要安装python-simplejson
  被控端如开启SELinux需要安装libselinux-python
  windows 不能做为主控端,只能做为被控制端
二、Ansible 安装和常见模块

1、Ansible 安装

ansible的安装方法有多种
官方文档 
https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html
https://docs.ansible.com/ansible/latest/installation_guide/index.html
下载 
https://releases.ansible.com/ansible/
pip 下载 
https://pypi.org/project/ansible/

(1)包安装方式

#CentOS 的EPEL源的rpm包安装
[root@centos ~]#yum install ansible
#ubuntu 安装
[root@ubuntu ~]#apt -y install ansible

(2)pip 安装 

pip 是安装Python包的管理器,类似 yum
范例: 在rocky8上通过pip3安装ansible
[root@rocky8 ~]#yum -y install python39 rust
[root@rocky8 ~]#pip3 install ansible
[root@rocky8 ~]#ansible --version

[root@rocky8 ~]#yum -y install python38 python38-pip
[root@rocky8 ~]#pip3 install --upgrade pip -i https://pypi.douban.com/simple
[root@rocky8 ~]#pip3 install ansible -i https://pypi.douban.com/simple/
[root@rocky8 ~]#ansible --version

2、Ansible 相关文件

(1)Ansible 配置文件列表

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录 

(2)Ansible 主配置文件

Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下 
ANSIBLE_CONFIG #环境变量,注意:指定目录下的ansible.cfg文件必须存在才能生效
./ansible.cfg   #当前目录下的ansible.cfg,一般一个项目对应一个专用配置文件,推荐使
用
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg  #系统默认配置文件
Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
[defaults]
#inventory     = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks         = 5   #默认并发数
#sudo_user     = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22
#host_key_checking = False     #检查对应服务器的host_key,建议取消此行注释,实现第一次连
接自动信任目标主机
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command   #默认模块,可以修改为shell模块
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

(3) Inventory 主机清单文件

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织
默认的inventory file为 /etc/ansible/hosts
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成
注意:
  生产建议在每个项目目录下创建项目独立的hosts文件
  通过项目目录下的ansible.cfg文件中的 inventory = ./hosts实现
官方文档:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
主机清单文件格式
inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中
此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机
Inventory 参数说明

 3、Ansible相关工具

 /usr/bin/ansible 主程序,临时命令执行工具

/usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
利用ansible实现管理的主要方式:
  Ansible Ad-Hoc 即利用ansible命令,主要用于临时命令使用场景
  Ansible playbook 主要用于长期规划好的,大型项目的场景,需要有前期的规划过程
ansible 使用前准备
ansible 相关工具大多数是通过ssh协议,实现对远程主机的配置管理、应用部署、任务执行等功能
建议:使用此工具前,先配置ansible主控端能基于密钥认证的方式联系各个被管理节点

 (1)ansible-doc

 此工具用来显示模块帮助,相当于man

格式
ansible-doc [options] [module...]
-l, --list       #列出可用模块
-s, --snippet #显示指定模块的playbook片段

(2)ansible

Ansible Ad-Hoc 介绍
Ansible Ad-Hoc 的执行方式的主要工具就是 ansible
特点: 一次性的执行,不会保存执行命令信息,只适合临时性或测试性的任务
3.3.2.2 ansible 命令用法
格式:
ansible <host-pattern> [-m module_name] [-a args]
选项说明:

 (3)ansible-console

 此工具可交互执行命令,支持tab,ansible 2.0+新增

提示符格式:
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$

常用子命令:

设置并发数: forks n 例如: forks 10
切换组: cd 主机组 例如: cd web
列出当前组主机列表: list
列出所有的内置命令: ?或help

 

 

 

 

4、Ansible常用模块

虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只需要熟悉10几个模块即可
常用模块帮助文档参考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

(1)Command 模块

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
注意:此模块不具有幂等性
常见选项
chdir=dir    #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行

(2)Shell 模块

功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, > , 相当于增强版的command模块
注意:此模块不具有幂等性,建议能不能就用此模块,最好使用专用模块
常见选项
chdir=dir    #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行
注意:调用bash执行命令 类似 cat /tmp/test.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器

(3)Script 模块

功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
注意:此模块不具有幂等性
常见选项
chdir=dir    #执行命令前,先切换至目录dir
cmd          #指定ansible主机的命令
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行

(4)Copy 模块

功能:复制ansible服务器主控端或远程的本机的文件到远程主机
注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
常见选项
src      #控制端的源文件路径
dest     #被控端的文件路径
owner    #属主
group    #属组
mode     #权限
backup   #是否备份
validate #验证成功才会执行copy
remote_src  #no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机
(5)Get_url 模块
功能: 用于将文件从http、https或ftp下载到被管理机节点上
常用参数如下:

 (6)Fetch 模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
常见选项 
src      #被控制端的源文件路径,只支持文件
dest     #ansible控制端的目录路径

(7)File 模块

功能:设置文件属性,创建文件,目录和软链接等
常见选项

 (8)stat 模块

功能:检查文件或文件系统的状态
注意:对于Windows目标,请改用win_stat模块
常见选项
path #文件/对象的完整路径(必须)
常用的返回值判断:
exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配

(9)unarchive 模块

功能:解包解压缩
实现有两种用法:
将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置remote_src=no,此为默认值,可
省略
将远程本主机上或非ansible的其它主机的某个压缩包解压缩到远程主机本机的指定路径下,需要
设置remote_src=yes
常见参数: 

 (10)Archive 模块

功能:打包压缩保存在被管理节点 
常见选项 
path   #压缩的文件或目录
dest   #压缩后的文件
format #压缩格式,支持gz,bz2,xz,tar,zip

(11)Hostname 模块 

功能:管理主机名
常见选项
name  #修改后的主机名称

(12)Cron 模块

功能:计划任务
支持时间:minute,hour,day,month,weekday
常见选项
name #描述脚本的作用
minute    #分钟
hour #小时
weekday    #周
user #任务由哪个用户运行;默认root
job #任务

(13)Yum 和 Apt 模块 

功能:管理软件包
yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
apt 模块管理 Debian 相关版本的软件包
yum常见选项
name #软件包名称
state #状态
  =present #安装,此为默认值
  =absent #删除
  =latest #最新版
list            #列出指定包
enablerepo #启用哪个仓库安装
disablerepo #不使用哪些仓库的包
exclude #排除指定的包
validate        #是否检验,默认为yes

(14)yum_repository 模块

功能: 此模块实现yum的仓库配置管理
常见选项 
name #仓库id
description #仓库描述名称,对应配置文件中的name=
baseurl #仓库的地址
gpgcheck #验证开启
gpgkey              #仓库公钥路径

(15)Service 模块

此模块和sytemd功能相似,选项很多相同
功能:管理服务
常见选项
name #服务名称
state #服务状态
=started #启动
=stopped #停止
=restarted    #重启
=reloaded    #重载
enabled #开启自启动
daemon_reload   #加载新的配置文件,适用于systemd模块

(16)User 模块

功能:管理用户
常见选项 
name #创建的名称
uid #指定uid
group #指定基本组
shell #登录shell类型默认/bin/bash
create_home #是否创建家目录
password #设定对应的密码,必须是加密后的字符串才行,否则不生效
system #yes表示系统用户
groups          #附加组
append #追加附加组使用,yes表示增加新的附加组
state    #absen删除
remove #yes表示删除用户时将家目录一起删除
generate_ssh_key #创建私钥
ssh_keyu_bits    #私钥位数
ssh_key_file     #私钥文件路径

(17)Group 模块

功能:管理组
常见选项 
name        #指定组名称
gid         #指定gid
state 
  =present  #创建,默认
  =absent   #删除

(18)Lineinfile 模块 

ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,
会存在问题,无法正常进行替换 。 
ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换
一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块
功能:相当于sed,主要用于修改一行的文件内容
常见选项
path #被控端文件的路径
regexp #正则匹配语法格式,表示被替换的内容
line #替换为的内容
state #absent表示删除
insertafter     #插入到替换内容前面,如和regexp同时存在,只在没找到与regexp匹配时才使用
insertafter
insertbefore    #插入到替换内容后面,如和regexp同时存在,只在没找到与regexp匹配时才使用
insertafter
backrefs        #支持后面引用,yes和no
backup          #修改前先备份
create          #如果文件不存在,则创建,默认不存在会出错
mode            #指定权限
owner           #指定用户
group           #指定组
#注意
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被
匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

(19)Replace 模块

该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
功能: 多行修改替换
常见选项
path #被控端文件的路径
regexp #正则匹配语法格式,表示被替换的内容
replace #替换为的内容
after           #插入到替换内容前面,
before          #插入到替换内容后面
backup          #修改前先备份
mode            #指定权限
owner           #指定用户
group           #指定组

(20)SELinux 模块

功能: 该模块管理 SELInux 策略
常见选项
policy     #指定SELINUXTYPE=targeted
state      #指定SELINUX=disabled

(21)reboot 模块

功能: 重启
常见选项 
msg               #重启提示
pre_reboot_delay  #重启前延迟时间的秒数
post_reboot_delay #重启后延迟时间的秒数后,再验证系统正常启动
reboot_timeout    #重启后延迟时间再执行测试成功与否的命令
test_command      #执行测试成功与否的命令

(22)mount 模块

功能: 挂载和卸载文件系统
常见选项
src    #源设备路径,或网络地址
path   #挂载至本地哪个路径下
fstype #设备类型; nfs
opts   #挂载的选项
state  #挂载还是卸载
  =present #永久挂载,但没有立即生效
  =absent #卸载临时挂载,并删除永久挂载
  =mounted #临时挂载
  =unmounted #临时卸载

(23)Setup 模块

功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机
较多,会影响执行速度
可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
常见选项 
filter #指定过滤条件

(24)debug 模块

功能: 此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于echo命令
注意: msg后面的变量有时需要加 " " 引起来
常见选项
msg       #指定命令输出的信息
var       #指定变量名,和msg互斥
verbosity #详细度

(25)sysctl 模块

功能: 修改内核参数
常见选项 
name  #内核参数
value #指定值
state #是否保存在sysctl.conf文件中,默认present
sysctl_set #使用sysctl -w 验证值生效

(26)pam_limits 

功能: 管理资源限制
范例: 
- name: Change Limit /etc/security/limit.conf
 pam_limits:
   domain: "*"
   limit_type: "{{ item.limit_type }}"
   limit_item: "{{ item.limit_item }}"
   value: "{{ item.value }}"
 loop:
   - { limit_type: 'soft', limit_item: 'nofile',value: '100000' }
   - { limit_type: 'hard', limit_item: 'nofile',value: '10000' }

(27)apt_repository 模块

功能: 此模块实现apt的仓库配置管理
常见选项 
repo #仓库信息
state               #添加或删除
update_cache        #是否apt update,默认yes
filename            #仓库文件,默认放在/etc/apt/sources.list.d/file.list

(28) apt_key 模块 

功能: 添加和删除apt key
常见选项 
url #key路径
state           #添加或删除

(29)其它模块 

ansible 还提供了很多针对各种应用的模块,比如
nginx_status_info
nginx_status_facts
mysql_db   #需要安装MySQL-python包
mysql_user #需要安装MySQL-python包
redis
mongodb*
postgresql*
haproxy
git

 

 
posted @ 2024-03-13 20:46  djyhello  阅读(182)  评论(0编辑  收藏  举报