远程操作主机功能
自动化运维(playbook 剧本 yaml格式)
是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起。
Ansible能批量配置、部署、管理上千台主机。类似于xshell的一键输入工具,不需要每次都切换主机进行操作。只要有一台ansible的固定主机,就可以所有节点的操作。
不需要angent,客户端。
只需要一台主机上配置了ansible。
ansible是基于模块进行工作,只是提供了一种运行的架构,执行操作和辩证的是ansible的模块来实现的。
copy
service
Ansible默认是通过ssh的密钥对实现通信。(可以改)
Ansible的另一个特点,所有模块都是幂等性。
所谓幂等性,指的是多次操作或者多次执行对系统资源的影响是一致的。
只要发现要停止的目标服务已经停止了,后续同样的停止操作,不会改变任何结果,什么也不做。
systemctl restart firewalld 每一次操作都会先停再启动。
http get 幂等性
post:多次执行相同的post可能创建多个相同的资源。(结果有变化)
1
1
1(数据库里面写入了3个1)
ansible的幂等性,决定了你可以放心大胆的使用,重复执行某个任务不会对结果产生任何影响(绝大多数情况)
1、Inventory 主机清单(主机组)定义ansible可以远程操作的服务器。
2、模块 13个模块(常用的),通过模块可以实现远程的配置和操作。
3、Plugins 插件
4、playbook剧本(shell脚本)yaml格式
部署较为简单,主要在控制主机部署即可,被控制主机需要有ssh和Python2.5以上版本。基本上Linux都是自带的。ansible只能控制Linux系统,Windows不行。
基于模块工作,可以使用任意语言开发模块(二次开发。底层架构)
环境:
1、管理端:192.168.233.10? ansible
2、被管理端:192.168.233.20
? ? ? ? ? ? ? ? ? ? ? ? 192.168.233.30
备用:192.168.233.40
/etc/ansible/
|—— ansible.cfg
|—— hosts
|—— roles
ansible.cfg:ansible的主配置文件,一般无需修改
hosts:主机组,声明可以被控制的主机
roles:公共角色目录
配置主机有两种方式:
1、直接声明主机的ip地址
2、主机名映射(/etc/hosts做映射)
ansible 组名/ip? -m? 模块名称? ?-a? 参数列表(执行的命令)
模块1:
command模块,在远程主机执行Linux的命令,不支持管道符,重定向输出。
ansible 192.168.233.20? -m command -a 'date'
指定ip地址,只会目标主机执行
ansible webserver? -m command -a 'ls /opt'
指定组,组内所有的声明的主机都会执行
ansible all -m command -a 'ls /opt'
所有声明的主机都会执行
ansible 192.168.233.20 -a 'ls /opt'
不加-m也就是不声明使用的模块,默认就是command模块
常用参数:
chdir:在远程主机上运行命令,提前进入目录。
creates:判断指定文件是否存在,如果存在,不执行后面的操作。
removes:判断指定文件是否存在,如果存在,执行后续的操作。
例如:
ansible all -m command -a 'chdir=/home ls'
ansible all -m command -a 'creates=/opt/123 ls /opt'
ansible 192.168.233.20 -m command -a 'removes=/opt/123 ls/opt'
模块2:
shell模块,在远程主机执行命令,相当于调用远程主机的shell进制,支持管道符和重定向。
在Ansible当中,多个引号之间要做隔离
例:指定截取主机地址
ansible 192.168.233.20 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}" ) | cut -d " " -f2'
ansible 192.168.233.30 -m shell -a 'touch /opt/123 && echo 456 > /opt/123 && ls /opt && cat /opt/ 123'
表示逻辑且,前一个命令成功才会执行后一个命令。
ansible 192.168.233.39 -m shell -a 'touch 456; cheo "帅帅帅" > /opt/456 ; cat?/opt/456'
指定主机上创建一个脚本,在脚本中写入一个内容 #!/bin/bash/ ifconfig ,然后运行这个脚本
ansible 192.168.233.20 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'
在脚本中用位置变量,实现加法,然后运行脚本。
ansible 192.168.233.30 -m shell -a ‘echo -e "#!/bin/bash\na=$((2+3))\necho \$a" > /opt/test1.sh && sh /opt/test1.sh’
ansible 192.168.233.30 -m shell -a 'touch /opt/123 ; echo 456 > /opt/123 ; ls /opt ; cat /opt/ 123'
表示逻辑或,前面成功与否,后面的命令都会执行。
模块3:cron模块
远程主机设置定时任务
两种状态:present 表示添加(默认就是添加,可以省略)
? ? ? ? ? ? ? ? ? absent? 表示移除。注:absent在整个ansible的语法中都表示移除的意思(删除)
定时任务:分 时 日 月 周
分=minute
时=hour
日=day
月=month
周=weekday
job:任务执行的命令
name:任务计划的名称,可以不加。
例:
ansible 192.168.233.20 -m cron -a 'minute="*/5" job="ls /opt" name="test1"'
查看定时任务:crontab -l
例:
ansible 192.168.233.20 -a 'crontab -l'
题1:
9月1号早上8点三十分,执行ls /opt 任务名:test2
删除定时任务
ansible -m -a '"name=None state="'
多个计划任务,如果不给名字都是None,一旦删除None,全部删除,不推荐(最好是指定一个不重复的名称)。
模块4:
user模块:用户管理模块
常用的参数:
name 指定用户名,必须要有
state? present? ?absent? ? ? ? 创建用户可以不加present,删除一定要加 absent
system=yes | no,标记用户是否是一个程序用户
uid:用户的唯一标识
group:用户的所在组
create_home=yes | no,替换用户的家目录,不需要替换用户的家目录可以不写
passwd:创建用户的密码
comment:添加用户的注释信息(可有可无)
remove=yes | no 当删除用户时,加上remove=yes,就是删除用户的家目录=userdel -r。如果不需要删除家目录,可以不写。
例:
ansible 20.0.0.181 -m user -a'name=guoqi system=yes'
在创建用户时,虽然我声明了是一个程序用户,但是默认的登陆shell如果没有额外的声明,还是默认的/bin/bash,uid会按照程序用户来指定。
指定:ansible?
11:20
使用ansible的user模块创建用户时,如果创建普通用户可以把不加system,指定shell类型也可以不加,默认就是/bin/bash
如果创建的是程序用户,一定要声明system=yes,声明shell的类型? shell=/sbin/nologin.
也可以指定uid的方式,给用户分配一个uid
11:24
即指定 又指定
ansible 192.168.233.20 -m user -a 'name=gq1 home=/home/gq1 create_home=yes'
ansible? 20.0.0.181 -a 'cat /etc/passwd'
删除家目录
ansible 192.168.233.20 -m user -a 'name=gq2 remove=yes state=absent'
模块5:
group模块:用户组的管理模块
name 必须要有(指定名称)
gid 设置组的id
ansible 不适合使用交互式的命令。
例:
ansible 192.168.233.30 -m group
添加到指定组
ansible 192.168.233.30 -m user -a ''
删除指定组
注:要先删除组里面的用户,才能删除组
ansible 192.168.233.30 -m group -a ‘name=gq4 state=absent’
ping模块:
检测主机的连通性