运维自动化ansible

一、ansible发展史及功能

官网:https;//www.ansible.com/

官方文档:https://docs.ansible.com/

1.1 ansible功能

  • 批量执行远程命令,可以控制多台主机进行操作
  • 批量安装和配置软件服务,可以对多台主机进行自动化的方式配置和管理各种服务
  • 编排高级的企业级复杂IT架构任务,例如:playbook、role
  • 提供自动化韵味工具的开发API,例如:jumpserver

1.2 ansible特性

  • 模块化
  • 三个关键模块:Paramiko(python),pyYAML,Jinja2(模版语言)
  • 基于python语言实现
  • 部署简单,依赖于python和SSH
  • 安全,它是基于OpenSSH
  • 幂等性
  • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案role

1.3 ansible架构

1.3.1 Ansible组成
  • INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts 需要管理的服务清单
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口
1.3.2 ansible命令执行来源
  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库) API 调用
  • PUBLIC/PRIVATE CLOUD API调用

二、ansible安装及入门

2.1 安装

2.1.1 安装epel源和ansible
2.1.2 查看ansible配置项
2.1.3 编辑hosts
2.1.4 远程连接虚拟机二
2.1.5 远程连接虚拟机三
2.1.6 同时ping通两台虚拟机
2.1.7 查看web主机名
2.1.8 分别在web下创建文件test
2.1.9 分别在两台虚拟机上查看test文件
2.1.10 免密登陆

2.2 查看基本信息

2.3 相关信息

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

2.4 ansible主配置文件

ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效

./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 、mod #默认模块,可以修改为shell模块

privilege_escalation #普通用户提权配置

#become=True

#become_method=sudo

#become_user=root

#become_ask_pass=False

2.5 inventory主机清单文件

默认的inventory file文件在:/etc/ansible/hosts

参数详细说明

ansible_ssh_host

#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.

ansible_ssh_port

#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口

192.168.1.100:2222

ansible_ssh_user

#默认的 ssh 用户名

ansible_ssh_pass

#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass

#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)

#sudo 命令路径(适用于1.8及以上版本)

ansible_connection

#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file

#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type

#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.

ansible_python_interpreter

#目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

2.6 ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  • /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
2.6.1 ansible

执行临时任务一次性任务

格式:

ansible <host-pattern> -m module_name -a args

命令 主机或者清单中的组 -m 指定模块 -a 执行的任务

或、且、非

ansible执行命令过程

1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
#root@node1 \~#ansible all -a "sleep 100" -f4
#cd /root/.ansible/tmp
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出

执行返回结果

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败
2.6.2 ansible-doc
2.6.3 ansible-console
2.6.4 playbook

此工具用于执行编写好的 playbook 任务

范例

ansible-playbook hello.yml

cat hello.yml


#hello world yml file

  • hosts: websrvs

remote_user: root

gather_facts: no

tasks:

  • name: hello world

command: /usr/bin/wall hello world

2.7 模块

2.7.1 Command模块

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项

注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现,此模块不具有幂等性

2.7.2 shell模块

功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >

注意:此模块不具有幂等性

2.7.3 scripts

功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)

注意:此模块不具有幂等性

2.7.4 copy模块

功能:从ansible服务器主控端复制文件到远程主机

注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件

2.7.5 Get_url模块

功能: 用于将文件从http、https或ftp下载到被管理机节点上

2.7.6 Fetch

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

root@localhost data#ansible web -m fetch -a 'src=/etc/passwd dest=/mnt'

root@node1 \~#ansible web -m fetch -a 'src=/var/log/messages dest=/mnt'

root@node1 mnt#tree

.

├── 192.168.91.101

│ └── var

│ └── log

│ └── messages

└── 192.168.91.102

└── var

└── log

└── messages

6 directories, 2 files

2.7.7 File模块

功能:设置文件属性,创建软链接等

| path | 指定文件路径 |
| state | 文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等 |
| src | 源文件 |
| mode | 权限 |
| owner | 属主 |
| group | 属组 |

recurse 递归
2.7.8 stat模块

功能:检查文件或文件系统的状态

注意:对于Windows 目标,请改用win_stat模块

选项:

path:文件/对象的完整路径(必须)

常用的返回值判断:

exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配

2.7.9 unarchive 模块

功能:解包解压缩

实现有两种用法:

  1. 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
  2. 将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

常见参数:

copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件

remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上

src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no

dest:远程主机上的目标路径

mode:设置解压缩后的文件权限

ansible web -m unarchive -a 'src=/data/ky.tar.bz2 dest=/mnt'

ansible websrvs -m unarchive -a 'src=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'

copy=no 代表压缩文件不是去本机上查找 去远端服务器查找

2.7.10 archive模块

功能:打包压缩保存再被管理节点

ansible web -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'

2.7.11 hostname模块
2.7.12 cron模块

功能:计划任务

支持时间:minute,hour,day,month,weekday

关键字:

name 会生成一行注释
job 执行的命令

2.7.13 yum和apt模块

功能:yum 管理软件包 ,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包

关键字:

name参数:必须参数,用于指定需要管理的软件包

state参数:用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和removed 等效,表示删除对应的软件包。

disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。

enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。

disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。enablerepo 参数和 disablerepo 参数可以同时使用。

| name | 所安装的包的名称 |
| state | present------安装,lastest------安装最新的,absent------卸载软件 |
| update_cache | 强制更新yum缓存 |
| conf_file | 指定远程yum安装时所以来的配置文件(安装本地已有的包) |
| disable_gpg_check | 是否禁止GPG checking,只用于presentor latest |
| disablerepo | 临时禁止使用yum库,只用于安装或更新时 |

enablerepo 临时使用的yum库。只用于安装或更新时
2.7.14 yum_repository模块

功能:建立yum仓库模块

关键字:

| name参数 | 必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID。 |
| baseurl参数 | baseurl参数:此参数用于设置 yum 仓库的 baseurl。 |
| description参数 | 此参数用于设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容。 |
| file参数 | 此参数用于设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为".repo"配置文件的文件名前缀,同一个".repo" 配置文件中 可以存在多个 yum 源。 |
| enabled参数 | 此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。 |
| gpgcheck参数 | 此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。 |
| gpgcakey参数 | 当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。 |

state参数 默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。
2.7.15 service模块

功能:管理服务

关键字:

| name参数 | 此参数用于指定需要操作的服务名称,比如:nginx |
| state参数 | 此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有startedstoppedrestartedreloaded |

enabled参数 此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动
2.7.16 mount挂载和卸载

功能: 挂载和卸载文件系统

#临时挂载

mount websrvs -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present'

#临时取消挂载

mount websrvs -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted'

#永久挂载

ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads opts="_netdev" state=mounted'

#永久卸载

ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads state=absent'

2.7.17 User模块

功能:管理用户

| comment | 用户的描述信息 |
| createhome | 是否创建家目录 |
| force | 在使用state=absent时, 行为与userdel --force一致. |
| group | 指定基本组 |
| groups | 指定附加组,如果指定为(groups=)表示删除所有组 |
| home | 指定用户家目录 |
| move_home | 如果设置为home=时, 试图将用户主目录移动到指定的目录 |
| name | 指定用户名 |
| non_unique | 该选项允许改变非唯一的用户ID值 |
| password | 指定用户密码,使用 SHA512 hash |
| remove | 在使用state=absent时, 行为是与userdel --remove一致 |
| shell | 指定默认shell |
| state | 设置帐号状态,不指定为创建,指定值为absent表示删除 |
| system | 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户 |
| uid | 指定用户的uid |
| update_ password | |
| always | 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always |

on_create 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
2.7.18 group模块

功能:管理组

2.7.19 reboot模块
2.7.20 lineinfile模块

ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块

regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

如果想进行多行匹配进行替换需要使用replace模块

功能:相当于sed,可以修改文件内容

关键字:

| path | 指定要操作的文件 |
| regexp | 使用正则表达式匹配对应的行 |
| line | 修改为新的内容 |
| insertafter | 将文本插入到"指定的行"之后 |
| insertbefore | 将文本插入到"指定的行"之前 |
| state | 删除对应的文本时,需要state=absent |
| backrefs | 1.支持向后引用 2.当未匹配到内容则不操作文件 |
| backup | 是否在修改文件之前对文件进行备份 |

create 当要操作的文件并不存在时,是否创建对应的文件

ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"

ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"

ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'

2.7.21 replace

该模块有点类似于sed命令,主要也是基于正则进行匹配和替换

2.7.22 setup模块

功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度

可以使用 gather_facts:

| no | 禁止 |
| Ansible | 收集 |

facts 信息

ansible all -m setup

ansible all -m setup -a "filter=ansible_nodename"

ansible all -m setup -a "filter=ansible_hostname"

ansible all -m setup -a "filter=ansible_domain"

ansible all -m setup -a "filter=ansible_memtotal_mb"

ansible all -m setup -a "filter=ansible_memory_mb"

ansible all -m setup -a "filter=ansible_memfree_mb"

ansible all -m setup -a "filter=ansible_os_family"

ansible all -m setup -a "filter=ansible_distribution_major_version"

ansible all -m setup -a "filter=ansible_distribution_version"

ansible all -m setup -a "filter=ansible_processor_vcpus"

ansible all -m setup -a "filter=ansible_all_ipv4_addresses"

ansible all -m setup -a "filter=ansible_architecture"

ansible all -m setup -a "filter=ansible_uptime_seconds"

ansible all -m setup -a "filter=ansible_processor*"

ansible all -m setup -a 'filter=ansible_env'

相关推荐
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉6 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造