Ansible:
远程操作主机功能
自动化运维(playbook 剧本 yaml)
是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是一军突起。
Ansible能批量配置,部署,管理上千台主机。类似于xshell的一键输入的工具,不需要每次都切换主机进行操作。
只要有一台ansible的固定主机,就可以进行所有节点的操作。
不需要agent,客户端。
主协议一台主机上配置了ansible。
ansible是基于模块进行工作,只是提供了一种运行的架构,执行和辩证的是absible的模块来实现的。
copy
service
Ansible默认是通过ssh的密钥对来实现通信。(可以改)
Ansible的另一个特点,所有模块都是幂等性。
幂等性:指的是多次操作或者多次对协调资源的影响是一致的。
systemctl stop firewalld
systemctl stop firewalld
systemctl stop firewalld只要发现要停止的目标服务已经停止了,后续同样的停止操作,不会改变任何结果,什么也不做。
systemctl restart firewalld每一次操作都会先停再启动。不是幂等性
http get 幂等性
post 多次执行相同的post可能会创建多个相同的资源。不是幂等性
ansible的幂等性:决定了你可以放心大胆的实验,重复执行某个任务不会对结构生产任何影响(绝大多数情况)
Ansible的四大组件:
1,inventory 主机清单(主机组)定义ansible可以远程操作的服务器。
2,模块 13个模块(常用的)通过模块可以实现远程的配置和操作。
3,plugins 插件
4,playbook 剧本 (shell脚本 yaml格式)
Ansible的优缺点:
部署较为简单,注意在控制主机部署即可,被控制主机协议有shh和pyhon2.5以上版本。举办的linux都是自带的。ansible只能控制linux系统,windows不行。
基于模块工作,可以只要任意语言开发模块(二次开发。底层架构)
环境:
1,管理端:
2,被管理端:
备用:
要先安装epel源
yum install -y epel-release.noarch
yum install -y ansible
ansible.cfg:ansible的主配置文件,一般无需修改
hosts:主机组,声明可以被控制的主机
roles:公共角色目录
配置主机有两种方式:
1、直接声明主机的ip地址
2、主机名(/etc/hosts做映射)
名称只是一个标识,没有意义,不要用中文
vim hosts
配置密钥对验证
ssh-keygen -t rsa
ansible的命令格式:
ansible 组名/ip -m 模块名称 -a ‘参数列表(执行的命令)’
模块1:
command模块,在远程主机执行linux的命令,不支持管道符,不支持重定向输出。
要先执行到目标主机的命令
ansible 192.168.176.50 -m command -a 'date'
ansible 192.168.176.60 -m command -a 'date'
指定ip地址
在目标主机上不会显示执行命令但在日志会显示
再连接
sshpass -p '123' ssh-copy-id root@192.168.176.50
sshpass -p '123' ssh-copy-id root@192.168.176.60
指定执行组,也可以用组名,在组下的所有机器
ansible webservers -m command -a 'ls /opt'
也可以对所有:所有组中的所有机器
ansible all -m command -a 'ls /opt'
不加-m,不声明指定的模块,默认就是command模块。
常用参数:
chdir 先进入目录再执行命令
ansible all -m command -a 'chdir=/home ls'
creates:判断指定文件是否存在,如果存在,不执行后面的操作
ansible all -m command -a 'creates=/opt/123 ls /opt'
removes:判断指定的文件是否存在,如果存在,执行后续的命令。
ansible all -m command -a 'removes=/opt/123 ls /opt'
模块2:
shell模块,再远程主机现在命令,相当于在远程主机,支持管道符和重定向。
创建一个用户和密码
ansible 192.168.176.50 -m shell -a 'useradd test'
ansible 192.168.176.50 -m shell -a 'cat /etc/passwd'
ansible 192.168.176.50 -m shell -a 'echo 123456 | passwd --stdin test'
获取IP地址
ansible 192.168.176.50 -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}")|cut -d " " -f2'
在ansible当中,多个引号之间要做隔离
多个shell命令执行,多个命令之间用&&连在一块,表示逻辑且
ansible 192.168.176.50 -m shell -a 'touch /opt/123 && echo 123 > /opt/123 && ls /opt && cat /opt/123'
ansible 192.168.176.50 -m shell -a 'touch /opt/123 && echo 456 > /opt/123 && cat /opt/123'
也可以用;符号。表示逻辑或
ansible 192.168.176.50 -m shell -a 'touch /opt/456 ; echo "cc正" > /opt/456 ; cat /opt/456'
前面的命令成不成功后面的都会执行。
远程运行脚本
指定主机上创建一个脚本,在脚本中写入一个内容 #!/bin/bash ifconfig ,然后运行这个脚本:
ansible 192.168.176.50 -m shell -a 'echo -e "#!/bin/bash\nifconfig" > /opt/test.sh && sh /opt/test.sh'
简单的加法
ansible 192.168.176.50 -m shell -a 'echo -e "#!/bin/bash\na=$((2+3))\necho $a" > /opt/test1.sh && sh /opt/test1.sh'
模块3 cron模块
远程给主机设置定时任务
两种状态:present 表示添加(默认就是添加,可以省略)
absent 表示移除。#absent在整个ansible的语法当中都表示移除的意思(删除)
分 时 日 月 周
分=minute
时=hour
日=day
月=month
周=weekday
job:任务执行的命令
name:任务计划的名称,可以不加。
192.168.176.50 -m cron -a 'minute="*/5" job="ls /opt" name="test1"'
查看远程主机的但是任务:
ansible 192.168.176.50 -a 'crontab -l'
ansible 192.168.176.50 -m cron -a 'minute="30" hour="8" day="1" month="9" job="ls /opt" name="test2"'
ansible 192.168.176.50 -m cron -a 'minute="30" hour="14" weekday="3" job="ls /opt"'
远程删除定时任务删除一定要加state=名称
有名字的
ansible 192.168.176.50 -m cron -a 'name=test2 state=absent'
没有名字的
ansible 192.168.176.50 -m cron -a 'name=None state=absent'
多个none,会一起删除。所以最好给名称,指名不要重复。
模块4:
user模块:用户管理模块
常用参数:
name 指定用户名,必须要有
state:present absent 创建用户可以不加present,删除一定要加absent
system=yes | no,标记用户是否是一个程序用户 只会指明uid为程序用户
uid:用户的唯一标识
group:用户的所在组
create_home=yes | no, 替换用户的家目录,不需要替换用户的家目录可以不写
password:创建用户的密码
comment:户的注释信息(可有可无)
remove=yes | no 当删除用户,加上remove=yes,删除用户的家目录 userdel-r。如果不需要删除家目录,可以写。
给远程主机添加用户:
ansible 192.168.176.50 -m user -a 'name=cc1 system=yes'
在创建用户时,虽然我声明了是一个程序用户,但是默认的登录shell如果没有额外的声明,还是默认的/bin/bash,uid会按照程序用户来指定。
如何正确声明:
ansible 192.168.176.50 -m user -a 'name=cc2 shell=/sbin/nologin'
使用ansible的user模块创建用户时,如果创建普通用户可以不加system=no,指定shell轮询可以不加,默认就是/bin/bash 如果创建的是程序用户,一定要声明system=yes,声明shell的类型 shell=/sbin/nologin。
也可以指定uid的方式,给用户分配一个uid,同时指定用户的家目录
ansible 192.168.176.50 -m user -a 'name=cc5 uid=1013 password=123456 home=/opt/test3'
改变用户家目录:
ansible 192.168.176.50 -m user -a 'name=cc5 home=/opt/test4 create_home=yes'
删除用户连家目录一并删除
ansible 192.168.176.50 -m user -a 'name=cc5 remove=yes state=absent'
group 模块:
用户组的管理模块
name 必须要有
system=yes | no,标记用户组中的用户是否是程序用户 只会指明uid为程序用户
gid 设置组的id
ansible 192.168.176.50 -m group -a 'name=chen gid=306 system=yes'
创建的是组,不是用户
在创建一个用户的时候,怎么添加到一个组中。
ansible 192.168.176.50 -m user -a 'name=cc uid=1011 group=chen'
ansible不使用交互式的命令。
如何删除组
ansible 192.168.176.50 -m group -a 'name=chen state=absent'
要先删除组用户,才能删除组。
ansible 192.168.176.50 -m user -a 'name=cc remove=yes state=absent'
ansible 192.168.176.50 -m group -a 'name=chen state=absent'
ping模块:
ansible all -m ping