Ansible

Ansible主要功能:

远程操作主机功能

自动化运维(playbook 剧本 yam)

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

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

只要有一台ansible的固定主机,就可以实现所有节点的操作。

不需要agent,客户端

只需要一台主机上配置了Ansible即可

ansible是基于模块进行工作,只是提供了一种运行的架构,真正执行操作和变更的是ansible的模块来实现的

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脚本) yam格式

Ansible的优缺点:

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

Ansible只能控制linux系统,windows不行。

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

环境:

管理端 192.168.211.10 ansible

被管理端 192.168.211.20

192.168.211.30

备用: 192.168.211.11

[root@host ~]# yum -y install epel-release
安装ansible必须要有第三方源

[root@host ~]# yum -y install ansible


[root@host ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles

----------------------------------------
ansible.cfg  主配置文件,一般无需修改
hosts   主机组,声明可以被控制的主机
roles   公众角色目录 

配置主机有两种方式:

直接声明主机的ip地址

进入ansible的hosts文件内进行修改 如下 
[webservers]
192.168.211.20
[dbservers]
192.168.211.30

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

ansible的命令格式:

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

ansible 192.168.211.20 -m command -a 'date'  指定主机执行这个命令 
ansible all -m command -a 'ls/opt'   所有声明的主机都会执行
ansible webservers -m command -a 'date'  指定组执行
不加-m也就是不声明使用的模块。默认就是执行command模块 

常用参数:

chdir:在远程主机上运行命令,提前进入目录,然后再执行命令

[root@host opt]# ansible all -m command -a 'chdir=/home ls'
192.168.211.30 | CHANGED | rc=0 >>
czy
192.168.211.20 | CHANGED | rc=0 >>
czy

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

[root@host opt]# ansible all -m command -a 'creates=/opt/123 ls /opt'
192.168.211.20 | SUCCESS | rc=0 >>
skipped, since /opt/123 exists
192.168.211.30 | CHANGED | rc=0 >>
containerd
lnmp
nhtml
rh

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

[root@host opt]# ansible 192.168.211.20 -m command -a 'removes=/opt/123 ls /opt'
192.168.211.20 | CHANGED | rc=0 >>
123
containerd
lnmp
nhtml
rh

模块2:

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

[root@host opt]# ansible 192.168.211.20 -m shell -a 'useradd test'
192.168.211.20 | CHANGED | rc=0 >>
[root@host opt]# ansible 192.168.211.20 -m shell -a 'cat /etc/passwd'
test:x:1001:1001::/home/test:/bin/bash

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

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

ansible 192.168.211.20 -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:任务计划的名称,可以不加。

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

模块4:

user模块:用户管理模块

常用的参数:

name:指定用户名,必须要有

state present absent 创建用户可以不加present,删除一定要加absent

system=yes | no 标记用户是否是一个程序用户

uid:用户的唯一标识

group:用户的所在组

create_home=yes | no ,替换用户的家目录,不需要替换用户的家目录可以不写

password:创建用户的密码

comment:添加一个用户的注释信息(可有可无)

remove=yes | no 当删除用户时,加上remove=yes,删除用户的家目录 userdel-r. 如果不需要删除家目录,可以不写。

ansible 192.168.211.20 -m user -a 'name=czy1 system=yes'
在创建用户时,虽然我声明了是一个程序用户,但是默认的登录shell,如果没有额外的声明,还是默认的/bin/bash
UID会按照程序用户来指定 
[root@host opt]# ansible 192.168.211.20 -m user -a 'name=czy2 shell=/sbin/nologin system=yes'
czy2:x:986:979::/home/czy2:/sbin/nologin
使用ansible的user模块创建用户时,如果创建普通用户可以不加system=no,指定shell类型也可以不加,默认就是/bin/bash
如果创建的是程序用户,一定要声明system=yes,声明shell的类型,shell=/sbin/nologin
也可以指定UID的方式,给用户分配一个uid

group模块:

用户组的管理模块:

name:必须要有

gid:设置组的id

ansible不适用交互式的命令

ping模块:

ansible 192.168.211.20 -m ping 

只有在/etc/ansible/hosts文件当中声明的主机,ansible的服务端才可以进行远程操作

host模块

ansible 192.168.211.20 -m hostname  -a 'name=test2'

copy模块

用于复制指定的主机文件到远程主机的模块

常用的参数:

dest:指出要复制的文件在哪,必须使用觉得路径。如果源目标是目录,指目标也是目录,如果目标文件存在,会覆盖原有内容

src:复制分件的源,最好使用绝对路径,源目标是目录,指目标也是目录

owner:指出文件的所有者

group:指定文件的所在组

content:从主机复制到指定的内容到目标主机,content就不能使用src

mode 指定复制之后的文件的权限

[root@host opt]# ansible 192.168.211.20 -m copy -a 'src=/opt/123 dest=/opt/123.txt owner=test mode=655'

[root@host2 opt]# ls -l
总用量 0
-rw-r-xr-x. 1 test root  0 12月 19 08:51 123.txt

复制目录时,还是完整的目录,即目录当中不能为空,里面最终要有一个文件

file模块,文件模块,跟目录无关

owner group mode

state=link 创建连接文件

[root@host guoqi]# ansible 192.168.211.20 -m file -a 'path=/opt/czy.txt state=touch '
[root@host guoqi]# ansible 192.168.211.20 -m file -a 'owner=test group=test mode=777 path=/opt/czy.txt'
[root@host2 opt]# ls -l
总用量 0
-rw-r-xr-x. 1 test root  0 12月 19 08:51 123.txt
drwx--x--x. 4 root root 28 12月 13 12:03 containerd
-rwxrwxrwx. 1 test test  0 12月 19 09:32 czy.txt

yum模块

远程主机上安装与卸载软件包

在目标主机上的操作都是后台运行,不影响其他用户的使用

[root@host opt]# ansible 192.168.211.20 -m yum -a 'name=tree'    下载 
[root@host opt]# ansible 192.168.211.20 -m yum -a 'name=tree state=absent'  卸载 

service/systemd模块

name,设定管理服务的名称

state=started | stopped | restarted 管理动作

enabled=true 表示是否设置开机自启,如果不加,默认就是开机不自动启动

runlevel:配合enabled 如果是开机自启,可以设置运行级别。

script模块

运行本地脚本,然后把结果输出到目标主机

setup模块

setup查看目标主机的环境系统(facts),目标节点的系统信息

[root@host ~]# ansible 192.168.211.20 -m setup -a 'filter=*ipv4'
查询IP地址 

主机清单:

ansible可以管理上千台主机

192.168.211.6【1:3】

192.168.211.61 62 63

主机清单管理组当中的变量名:

ansible_host 连接时的IP地址

ansible_port 声明对方的连接端口 默认是ssh的22端口

ansible_user 指定连接时使用对方主机的用户名,不指定主机执行ansible的用户即为使用目标主机的用户名

ansible_password 指定连接ssh时的密码 (目标主机的用户密码)

ansible_become 提升用户权限

become root 可以改变用户的权限也可以改变用户的身份

ansible_become_password #指定切换用户的密码

你可能感兴趣的:(ansible)