运维自动化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'

相关推荐
Pythonliu74 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我4 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
小O_好好学5 小时前
CentOS 7文件系统
linux·运维·centos
哲伦贼稳妥6 小时前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他
john_hjy6 小时前
11. 异步编程
运维·服务器·javascript
x晕x6 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
活跃的煤矿打工人6 小时前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
tangdou3690986557 小时前
两种方案手把手教你多种服务器使用tinyproxy搭建http代理
运维·后端·自动化运维
北京智和信通7 小时前
云平台和虚拟化智慧运维监控,全面提升故障感知与处置能力
运维·虚拟化·云平台·虚拟机监控
fasewer7 小时前
第五章 linux实战-挖矿 二
linux·运维·服务器