ansible

(一)ansible

1、ansible:是基于Python开发的配置管理和应用部署工具,在自动化运维中,现在是异军突起

2、ansible能批量配置、部署、管理上千台主机,类似于xshell的一键输入的工具,不需要每次都切换主机进行操作

3、只要一台ansible的固定主机,就可以统一所有节点的操作,不需要agent客户端,只需要一台主机上配置了ansible

4、ansible是基于模块进行工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的(copy、service)

5、ansible默认是通过ssh的密钥队实现通信(可以改)

(二)ansible的功能

1、远程操作主机功能

2、自动化运维(playbook剧本,yaml)
3、所有模块都是幂等性,ansible的幂等性决定了可以放心大胆的使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况)
①幂等性:多次操作或者多次执行对系统资源的影响是一致的,只要发现要停止的目标服务已经停止,后续同样的停止操作不会改变任何结果,什么也不做
②systemctl restart firewalld:每一次操作都会先停再启动(不是幂等性)
③http的get就是幂等性,post不是幂等性,多次执行相同的post可能创建多个相同的资源

ansible的四大组件

inventory

主机清单(主机组),定义ansible可以远程操作的服务器

模块

13个模块(常用的),通过模块可以实现远程的配置和操作

plugins

插件

playbook

剧本(shell脚本),yaml格式

ansible的优缺点

1、部署较为简单,只要在控制主机部署即可,被控制主机需要有ssh和Python2.5以上版本,基本上Linux都是自带的

2、ansible只能控制Linux系统,window不行

3、基于模块工作,可以使用任意语言开发模块(二次开发,底层架构)

ansible部署

管理端

20.0.0.10、ansible

被管理端

20.0.0.20

20.0.0.30

备用被管理端

20.0.0.70

1、安装epel源

ansible_第1张图片

ansible_第2张图片

ansible_第3张图片

ansible_第4张图片

ansible.cfg

ansible的主配置文件,一般无需修改

hosts

主机组,声明可以被控制的主机

roles

公共角色目录

2、修改配置文件

ansible_第5张图片

(1)配置主机有两种方式
①直接声明主机的IP地址
②主机名(/etc/hosts做映射)

ansible_第6张图片

(2)配置ssh密钥登录

ssh-keygen -t rsa
sshpass -p '123' ssh-copy-id [email protected]
sshpass -p '123' ssh-copy-id [email protected]

ansible_第7张图片

ansible_第8张图片

第一次传不过去,重新执行发送密钥对

ansible_第9张图片

(六)ansible的模块操作

ansible的模块操作

模块一:command模块,在远程主机执行Linux命令,不支持管道符和重定向输出

ansible的命令格式

ansible 组名/ip -m 模块名称 -a 参数列表(执行的命令)

ansible 20.0.0.20 -m command -a 'date'

指定IP地址,只有目标主机会执行

ansible webservers -m command -a 'date'

指定组,组内所有声明的主机都会执行

ansible all -m command -a 'date'

所有声明的主机都会执行

ansible 20.0.0.20 -a 'date'

不加-m也就是不声明使用的模块,默认就是command模块

command模块的常用参数

chdir

在远程主机上运行命令,提前进入目录

creates

判断指定文件是否存在,如果存在,不执行后面的操作

removes

判断指定的文件是否存在,如果存在,执行后续的命令

ansible all -m command -a 'chdir=/home ls'

ansible all -m command -a 'creates=/opt/123 ls /opt'

ansible 20.0.0.20 -m command -a 'remove=/opt/123 ls /opt'

模块二:shell模块,在远程执行命令,相当于调用远程主机的shell进程,支持管道符和重定向

&&

表示逻辑且,前一个命令成功,才会执行后一个命令

表示逻辑或,前面的命令成功与否,后面的命令都会执行

多个命令执行

ansible 20.0.0.20 -m shell -a touch /opt/123 && echo 123 > /opt/123 && cat /opt/123

给用户设置密码:

ansible 20.0.0.30 -m shell -a echo 123456 | passwd --stdin hyde

过滤ifconfig命令中的第二行:

ansible 20.0.0.20 -m shell -a "ifconfig | awk 'NR==2{print $2}'"

过滤ifconfig命令中的ip地址:

ansible 20.0.0.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d " " -f2'

指定主机上创建一个脚本,在脚本中写入一个内容#!/bin/bash,换一行写ifconfig,然后运行这个脚本

ansible 20.0.0.30 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/hyde.sh && sh /opt/hyde.sh'

在脚本中执行用位置变量,输入两个数,实现加法,运行结果,运行脚本

ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test.sh && sh /opt/test.sh'

模块三:cron模块,远程主机设置定时任务

两种状态

present

表示添加(默认就是添加,可以省略)

absent

表示移除,absent在整个ansible的语法中都表示移除的意思(删除)

minute

hour

day

month

weekday

job

任务执行的命令

name

任务计划的名称,可以不加

多个计划任务如果不给名字,都是none,一旦删除none,全部删除(不推荐,最好指定不重复的名称)

9月1号早上8点三十分,执行ls  /opt,任务名:test2

ansible 20.0.0.20 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'

每周三下午14:30分执行ls  /opt

ansible 20.0.0.20 -m cron -a 'minute="30" hour="14" weekday="3" job="ls /opt"'

删除定时任务

ansible 20.0.0.20 -m cron -a 'name=None state=absent'

模块四:user模块,用户管理模块

格式

ansible 20.0.0.30 -m user -a 'name=hyde system=yes'

user模块的常用选项

name

指定用户名,必须要有

state

present:表示添加(默认就是添加,可以省略)

absent:创建用户时,可以不加absent,但是删除一定要加absent

system=yes/no

标记用户是否是一个程序用户

uid

用户的唯一标识

group

用户的所在组

create_home=yes/no

替换用户的家目录,不需要替换家目录,可以不写

password

创建用户密码

comment

用户的注释信息(可有可无)

remove=yes/no

当删除用户时,加上remove=yes,删除用户的家目录(相当于userdel -r),如果不需要删除家目录,可以不写

注意事项

在创建用户时,虽然声明了是一个程序用户,但是默认的登录shell如果没有额外的生命,还是默认/bin/bash,uid会按照程序用户

使用ansible的user模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash,如果创建的是程序用户,一定要生命system=yes,声明shell的类型shell=/sbin/nologin,也可以指定uid的方式,给用户分配一个uid

创建用户,指定uid号和密码,以及家目录:

ansible 20.0.0.30 -m user -a 'name=hyde2 uid=1012 password=123 home=/opt/test1'

修改家目录:

ansible 20.0.0.30 -m user -a 'name=hyde2 home=/home/hyde2 create_home=yes'

删除用户、家目录:

ansible 20.0.0.30 -m user -a 'name=hyde2 remove=yes state=absent'

模块五:group模块,用户组管理模块

gid

设置组的id

name

必须要有

创建用户组:ansible 20.0.0.20 -m group -a name=haide gid=306 system=yes

创建用户,添加到已有的组里

ansible 20.0.0.20 -m user -a name=haide1 uid=1202 group=haide

注意:ansible不适合交互式的命名

删除组

ansible 20.0.0.20 -m group -a 'name=zzz gid=310 system=yes'

删除组:ansible 20.0.0.20 -m group -a 'name=zzz state=absent'

模块六:ping模块,测试主机之间的连通性

格式

ansible all -m ping

ansible 20.0.0.20 -m ping

1、模块一:command模块,在远程主机执行Linux的命令,不支持管道符和重定向输出

①ansible的命令格式:ansible 组名/ip -m 模块名称 -a 参数列表(执行的命令)

ansible 20.0.0.20 -m command -a 'date'

指定IP地址,只有目标主机会执行

ansible webservers -m command -a 'date'

指定组,组内所有声明的主机都会执行

ansible all -m command -a 'date'

所有声明的主机都会执行

ansible 20.0.0.20 -a 'date'

不加-m也就是不声明使用的模块,默认就是command模块

常用参数

chdir

在远程主机上运行命令,提前进入目录

creates

判断指定文件是否存在,如果存在,不执行后面的操作

removes

判断指定的文件是否存在,如果存在,执行后续的命令

ansible all -m command -a 'chdir=/home ls'

ansible all -m command -a 'creates=/opt/123 ls /opt'

ansible 20.0.0.20 -m command -a 'remove=/opt/123 ls /opt'

ansible_第10张图片

ansible_第11张图片

ansible_第12张图片

ansible_第13张图片

ansible_第14张图片

2、模块二:shell模块,在远程执行命令,相当于调用远程主机的shell进程,支持管道符和重定向

&&

表示逻辑且,前一个命令成功,才会执行后一个命令

表示逻辑或,前面的命令成功与否,后面的命令都会执行

1在ansible当中,多个引号要做隔离

ansible_第15张图片

ansible_第16张图片

ansible 20.0.0.20 -m shell -a "ifconfig | awk 'NR==2{print $2}'"
ansible 20.0.0.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d " " -f2'

2多个命令执行

(3)指定主机上创建一个脚本,在脚本中写入一个内容#!/bin/bash ,换一行写ifconfig,然后运行这个脚本
ansible 20.0.0.30 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/hyde.sh && sh /opt/hyde.sh'

ansible_第17张图片

ansible_第18张图片

(4)在脚本中执行用位置变量,输入两个数,实现加法,运行结果,运行脚本
ansible 20.0.0.20 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test.sh && sh /opt/test.sh'

3、模块三:cron模块,远程主机设置定时任务

1两种状态
①present,表示添加(默认就是添加,可以省略)
②absent,表示移除,absent在整个ansible的语法中都表示移除的意思(删除)

minute

hour

day

month

weekday

job

任务执行的命令

name

任务计划的名称,可以不加

多个计划任务如果不给名字,都是none,一旦删除none,全部删除(不推荐,最好指定不重复的名称)

ansible_第19张图片

29月1号早上8点三十分,执行ls  /opt,任务名:test2
ansible 20.0.0.20 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'

ansible_第20张图片

3每周三下午14:30分执行ls  /opt
ansible 20.0.0.20 -m cron -a 'minute="30" hour="14" weekday="3" job="ls /opt"'

ansible_第21张图片

4删除定时任务:ansible 20.0.0.20 -m cron -a 'name=None state=absent'
①多个计划任务如果不给名字,都是none,一旦删除none,全部删除(不推荐,最好指定不重复的名称)

ansible_第22张图片

4、模块四:user模块,用户管理模块

常用的参数

name

指定用户名,必须要有

state

present:

absent:创建用户时,可以不加absent,但是删除一定要加absent

system=yes/no

标记用户是否是一个程序用户

uid

用户的唯一标识

group

用户的所在组

create_home=yes/no

替换用户的家目录,不需要替换家目录,可以不写

password

创建用户密码

comment

用户的注释信息(可有可无)

remove=yes/no

当删除用户时,加上remove=yes,删除用户的家目录(相当于userdel -r),如果不需要删除家目录,可以不写

1ansible 20.0.0.30 -m user -a 'name=hyde system=yes'
①在创建用户时,虽然声明了是一个程序用户,但是默认的登录shell如果没有额外的生命,还是默认/bin/bash,uid会按照程序用户
②使用ansible的user模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash,如果创建的是程序用户,一定要生命system=yes,声明shell的类型shell=/sbin/nologin,也可以指定uid的方式,给用户分配一个uid

ansible_第23张图片

ansible_第24张图片

ansible_第25张图片

ansible_第26张图片

2)ansible 20.0.0.30 -m user -a 'name=hyde2 uid=1012 password=123 home=/opt/test1'

ansible_第27张图片

3修改家目录:ansible 20.0.0.30 -m user -a 'name=hyde2 home=/home/hyde2 create_home=yes'

ansible_第28张图片

ansible_第29张图片

4删除用户、家目录:ansible 20.0.0.30 -m user -a 'name=hyde2 remove=yes state=absent'

ansible_第30张图片

ansible_第31张图片

5、模块五:group模块,用户组管理模块

gid

设置组的id

name

必须要有

ansible_第32张图片

ansible_第33张图片

1创建用户,添加到已有的组里

ansible_第34张图片

ansible_第35张图片

(2)删除组(先删组用户,再删组)

ansible_第36张图片

ansible_第37张图片

ansible_第38张图片

ansible_第39张图片

6、模块六:ping模块,测试主机之间的连通性

ansible_第40张图片

你可能感兴趣的:(ansible)