2023-05-11
linux
00
请注意,本文编写于 505 天前,最后修改于 505 天前,其中某些信息可能已经过时。

目录

Ansible
一、理论
二、ansible用法
三、模块的使用
1、shell模块
2、copy模块
3、file模块
4、yum模块
5、service模块
6、user模块
7、group模块
8、fetch模块
四、playbook
1、yml文件
1、yml文件格式
2、yml语法
2、playbook核心元素
3、组件1
4、组件2
5、运行playbook

Ansible

一、理论

1、自动化运维工具

​ 本质是批量管理

​ 利用工具执行繁琐、重复性的工作

​ 使用UI界面避免输入大量的命令

2、LB集群 调度器 2台 realserver 50台 修改realserver上的某项配置

3、ansible是一款基于ssh协议的一款远程管理工具

4、ansible的组件

shell
ansible 核心程序 主机清单 core module custom module plugins playbook connection plugin

5、主机清单

/etc/ansible/hosts

4、ansible管理被管理主机

ansible服务器如何与被管理主机连接? 方法一

shell
#在hosts文件中写明连接被管理主机的用户名、密码、端口号 192.168.2.10 ansible_ssh_user=root ansible_ssh_pass=123@.com ansible_ssh_port=22

方法二

shell
#做ssh免密登录 ssh-copy-id 192.168.2.10

二、ansible用法

shell
[root@cong11 ~]# ansible --help #查看帮助 Usage: ansible <host-pattern> [options] #使用方法,ansible+主机+选项 例如:ansible [组名] [-i 主机文件] [-m 模块名称] [-a 模块参数] ansible详细参数: -v #详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv) -i #指定清单文件(hosts)的路径,默认是在 /etc/ansible/hosts -m #指定使用的module名称,默认使用 command模块 -a #指定module模块的参数 -u #ssh连接的用户名,默认用root,ansible.cfg中可以配置 -k #提示输入ssh登录密码,当使用密码验证的时候用 -s,--sudo:远程执行命令时使用sudo方式,相当于Linux系统下的sudo命令。 -U SUDO_USERNAME,sudo到哪个用户,默认为root 注意:上述的-s和-U选项在新版中已经失效。新版本选项如下两项: -s,--sudo 被改成 -b,--become -U,--sudo-user被改成 --become-user -K, --ask-become-pass:使用--become或者--become-user时使用的密码认证(即提示输入sudo密码,当不是NOPASSWD模式时使用)。 -C #测试此命令执行会改变什么内容,不会真正的去执行 -f FORKS, --forks=FORKS:并行线程数量,当有数量巨大的机器需要配置,可以使用高并发线程,默认是5个。 --list-host:只打印有哪些主机会执行这个命令,不会实际执行 ansible-doc详细参数: ansible-doc -l #列出所有的模块列表 ansible-doc -s 模块名 #查看指定模块的参数 -s, --snippet # [ˈsnɪpɪt] 片断
shell
设置用户名密码:echo '<新密码>' | passwd --stdin <用户名> 或者 echo <用户名>:<密码> | chpasswd 例1:echo "123456" | passwd --stdin username 例2:echo "username:123456" | chpasswd

三、模块的使用

1、shell模块

shell
ansible all -m shell -a "ip a l ens33" #查看所有组主机的ens33网卡信息

2、copy模块

向被控制端主机拷贝数据

shell
例1: [root@cong11 ~]# ansible web_server -m copy -a 'src=/etc/hosts dest=/tmp/ owner=root group=root mode=640 backup=yes' 说明: #src 主控端文件位置 #dest 被控端目标位置 #owner 文件复制过去后的所有者 #group 文件复制过去后的所属组 #mode 文件的权限设定 #backup=yes 如果目标位置存在同名的文件,在覆盖之前将原文件备份
shell
例2:使用content [root@cong11 ~]# ansible web_servers -m copy -a 'content="Hello ansible\nyou are clever!\n" dest=/tmp/ansible.txt'

3、file模块

对文件的操作 :比如创建,删除,软硬链接等

shell
group:定义文件/目录的属组  mode:定义文件/目录的权限  owner:定义文件/目录的属主  path:必选项,定义文件/目录的路径  recurse:递归的设置文件的属性,只对目录有效  src:要被链接的源文件的路径,只应用于state=link的情况  dest:被链接到的路径,只应用于state=link的情况  state:     directory:如果目录不存在,创建目录     file:即使文件不存在,也不会被创建     link:创建软链接     hard:创建硬链接     touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间     absent:删除目录、文件或者取消链接文件
shell
例1: [root@cong11 ~]# ansible web_servers -m file -a "path=/tmp/hosts mode=777" #在web_servers组中所有主机的/tmp目录下创建hosts文件,权限为777 例2: [root@cong11 ~]# ansible web_servers -m file -a "src=/tmp/hosts dest=/opt/hosts state=link" #将web_servers组中的所有主机中/tmp/hosts软连接到/opt/hosts

4、yum模块

用来调用yum命令安装一些服务和依赖

shell
#yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包。 #常用参数: #name参数:必须参数,用于指定需要管理的软件包,比如 nginx。 #state参数:用于指定软件包的状态 ,默认值为present,表示确保软件包已经安装,除了present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。 #disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。 #update_cache参数:是否更新缓存,默认值时no #enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。 #disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。 #enablerepo 参数和 disablerepo 参数可以同时使用
shell
例1: [root@cong11 ~]# ansible web_servers -m yum -a "name=httpd state=latest" #给web_servers组主机安装httpd服务

5、service模块

shell
Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等。 service模块详解: name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。 state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。 enabled参数:此参数用于指定是否将服务设置为开机启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。 runlevel参数:服务启动级别 arguments参数:服务命令行参数传递 注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭

用法

shell
例1: [root@cong11 ~]# ansible web_servers -m service -a "enabled=yes name=httpd state=started" #启动httpd服务并设置开机自启 [root@cong11 ~]# ansible web_servers -m service -a "name=httpd state=restarted" #重启httpd服务

6、user模块

shell
user 模块可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。 常用参数 name参数:必须参数,用于指定要操作的用户名称。 group参数:此参数用于指定用户所在的基本组。 gourps参数:此参数用于指定用户所在的附加组。注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖。 append参数:如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将 append 设置为 yes,表示追加附加组到现有的附加组设置,append 默认值为 no。 shell参数:此参数用于指定用户的默认 shell。 uid参数:此参数用于指定用户的 uid 号。 expires参数:此参数用于指定用户的过期时间,相当于设置 /etc/shadow 文件中的的第8列,比如,你想要设置用户的过期日期为2020年12月31日,那么你首先要获取到2020年12月31日的 unix 时间戳,使用命令 “date -d 2020-12-31 +%s” 获取到的时间戳为1609344000,所以,当设置 expires= 1609344000 时,表示用户的过期时间为2020年12月31日0点0分,设置成功后,查看远程主机的 /etc/shadow 文件,对应用户的第8八列的值将变成18627(表示1970年1月1日到2020年12月31日的天数,unix 时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在 Linux 和 FreeBSD 系统中使用。 comment参数:此参数用于指定用户的注释信息。 state参数:此参数用于指定用户是否存在于远程主机中,可选值有 present、absent,默认值为 present,表示用户需要存在,当设置为 absent 时表示删除用户。 remove参数:当 state 的值设置为 absent 时,表示要删除远程主机中的用户。但是在删除用户时,不会删除用户的家目录等信息,这是因为 remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录。当 state=absent 并且 remove=yes 时,相当于执行 “userdel -r” 命令。 password参数:此参数用于指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于 /etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串
shell
例1: [root@cong11 ~]# ansible web_servers -m user -a "name=berry shell=/sbin/nologin state=present" #创建berry用户,不可登陆 例2: [root@cong11 ~]# ansible web_servers -m user -a "name=berry remove=yes state=absent" #删除betty用户并删除家目录 例3: ansible web_servers -m user -a "name=zyw shell=/bin/login password={{'123.com'|password_hash('sha512')}} state=present" #创建zyw用户密码为123.com

7、group模块

shell
group 模块可以帮助我们管理远程主机上的组。 常用参数 name参数:必须参数,用于指定要操作的组名称。 state参数:用于指定组的状态,两个值可选,present,absent,默认为 present,设置为absent 表示删除组。 gid参数:用于指定组的gid
shell
例1: [root@cong11 ~]# ansible web_servers -m group -a "name=test" #创建一个名为test的组 例2: [root@cong11 ~]# ansible web_servers -m group -a 'name=test state=absent' #删除名为test的组

8、fetch模块

shell
#远程从被控制端拉取数据到本机 [root@ansible ansible]# ansible all -m fetch -a "src=/etc/profile dest=/root/" #将所有主机的/etc/profile文件拉取到本机的root下

四、playbook

1、yml文件

1、yml文件格式

shell
1、yml文件一般都是以--开头 2、yml文件是以‘#’号为注释符 3、yml文件对大小写比较敏感 4、用缩进来表示层级关系,只要每层级的前面空格数一样即可 5、除了结尾是:的,其他的:号后面都要有空格 6、短横线表示列表项,短横线后面跟个空格。多个项在同一层级表示同一列表 7、文件结尾名一般为yaml或yml

2、yml语法

shell
对于Ansible, 每一个YAML文件都是从一个列表(列表list,又称为序列 sequence)开始。列表中的每一项都是一个键值对,通常它们被称为一个 “哈希” 或 “字典”或映射。所以, 我们需要知道如何在YAML中编写列表和字典。 #列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个减号和一个空格)。 #具体在ansible playbook中,列表所描述的是局部环境,它不一定要有名称,只要使用"- ",它就表示圈定一个范围,范围内的项都属于该列表。例如:

image-20220708104233531

image-20220708104352422

2、playbook核心元素

shell
hosts: #执行的远程主机 tasks: #任务集 Varniables #内置变量或自定义变量在playbook中调用 Templates #模板,可替换模板文件中的变量并实现一些简单逻辑的文件◆Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行 tags #标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

3、组件1

image-20220708111306268

4、组件2

image-20220708111353977

5、运行playbook

运行方式

shell
ansible-playbook <filename.yml> ...[options]

常用选项

shell
--check #只检测可能会发生的改变,并不会真正的去改变,就是测试的意思 --list-hosts #列出运行任务的主机 --limit #主机列表只针对主机列表中的主机运行 -v #显示过程 -vv -vvv更详细
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:YOUWEI

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 ™ 许可协议。转载请注明出处!