ansible的介绍和安装,Ansible,与

发表时间:2021-05-11

Ansible介绍

Ansible是一个IT自动化工具。能够配置系统、部署软件、编排服务,
如连续部署或零停机时间滚动更新。
	Ansible用Python编写,市场上还有许多自动化工具,如Salt、Puppet、Chef等,但它们各有优劣,而Ansible的特点在于简洁。
	不需要你在想要配置的每个节点上安装组件。同时如果需要的话,可以在不止一个地方控制整个基础架构。

Ansible特性

  • 模块化:调用特定的模块,完成特定的任务
  • 有Paramiko、PyYAML、Jinja2三个关键模块
  • 支持自定义模块
  • 基于Py语言实现
  • 部署简单,基于Python和SSH,agentless
  • 安全,基于openssh
  • 支持playbook编排任务
  • 幂等性:一个任务执行一遍和执行N遍效果一样,不会因为重复执行而带来意外情况
  • 无须代理不依赖PKI(无须SSL)
  • 可使用任何编程语言写模块
  • YAML格式,支持丰富的数据结构
  • 强大的多层解决方案

Ansible架构

在这里插入图片描述

主要模块如下:
Ansible:ansible自身核心程序
host inventory:主机清单,记录被管理的主机列表信息
play books:剧本YAML格式文件,多个任务定义在一个文件中
core modules:核心模块
custom modules:自定义模块,完成核心模块无法完成的功能,支持多种语言
connection plugins:连接插件,默认基于SSH协议连接

User通过请求主控端ansible控制host,ansible里有一个host inventory主机清单记录了哪些主机是被控制的
模块用于单一的命令,如果要执行多条任务,就要用到playboo批量执行
然后通过connection plugins连接插件基于SSH协议来执行
不仅可以是user用户来管理,也可以利用私有云或公有云开发接口来进行管理。

Ansible工作流程

在这里插入图片描述

1、加载配置文件/etc/ansible/ansible.cfg
2、加载对应的模块文件,如command
3、通过ansible模块或命令生成对应的临时Py文件,并将该文件传输至被管理服务器的对应用户家目录$HOME/.ansible/tmp/ansible-tmp-xxx/xx.py文件
4、给文件执行权限
5、执行并返回结果
6、删除临时py文件,sleep 0退出

简单一句话总结就是:
首先读取ansible.cfg中的配置,根据规则获取inventory中管理主机列表,并行的在这些主机中执行配置的任务,最后等待执行返回的结果。

安装前的注意事项

  • 主控端python版本需要2.6以上
  • 被控端python版本小于2.4需要安装python-simplejson
  • 被控端如开启SElinux需要安装libselinux-python
  • Windows不能作为主控端

Ansible的安装

主机规划

主控端:ansible 192.168.100.10
被控端:node-1 192.168.100.20
	   node-2 192.168.100.30
在主控端上安装ansible
可通过yum方式、pip方式、编译方式等其他方式安装ansible

下面通过yum方式安装ansible
首先安装epel源
[root@ansible ~]# yum install -y epel-release                                   
[root@ansible ~]# yum install -y ansible     
[root@ansible ~]# ansible --version
ansible 2.9.18                                   

主控端与被控端建立信任关系

[root@ansible ~]# ssh-keygen -t rsa                                   
将本地的公钥传输到被控端
[root@ansible ~]# ssh-copy-id root@192.168.100.20                     [root@ansible ~]# ssh-copy-id root@192.168.100.30  
              

配置主机清单文件

Inventory文件遵循INI文件风格,中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中;
此外,当如若目标主机使用非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来证明
[root@ansible ~]# vim /etc/ansible/hosts 
[websrvs] # 分组的名称 
192.168.100.20
[dbsrvs]
192.168.100.30
[appsrvs]
192.168.100.20
192.168.100.30

在这里插入图片描述

inventory介绍

Ansible默认是调用/etc/ansible/hosts主机清单文件,同时也可以通过-i参数指定自定义的hosts文件
Inventory分为静态和动态两部分

ansbile的主要功能用在于批量主机操作,为了便携地使用其中的部分主机,可以在inventory file中将其分组命名。

Ansible配置文件

[root@ansible ~]# cat /etc/ansible/ansible.cfg 
[defaults]

# some basic default values...

#inventory      = /etc/ansible/hosts #主机清单配置文件
#library        = /usr/share/my_modules/ #库文件存放路径
#remote_tmp     = ~/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp      = ~/.ansible/tmp #本机的临时命令执行目录
#forks          = 5 #默认并发数
#sudo_user      = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansible命令是否询问sudo密码
#ask_pass      = True #每次执行ansible命令是否询问ssh密码
#remote_port    = 22 #远程ssh端口号 默认22
#module_lang    = C #默认模块和系统之间通信的默认语言
#host_key_checking = False #不进行host_key检查,省去目标key发生变化时输入(yes/no)的步骤
#log_path = /var/log/ansible.log #日志文件


ansible修改配置文件不需要重启服务

Ansible系列命令

ansible-doc:显示模块帮助
	ansible-doc[options][module]
	-a	显示所有模块的文档
	-l,--list	列出可用模块
	-s,--snippet	显示指定模块的playbook片段
[root@ansible ~]# ansible-doc -l | wc -l
3387 #目前版本一共有3387个模块
[root@ansible ~]# ansible-doc ping #查看指定模块的help


ansible-galaxy:
	ansible-galaxy install geerlingguy.redis 安装redis角色
	[root@ansible ~]# ansible-galaxy list #列出已安装的角色
	# /root/.ansible/roles
	- geerlingguy.redis, 1.7.0
	# /usr/share/ansible/roles
	# /etc/ansible/roles
	[root@ansible ~]# tree /root/.ansible/roles/geerlingguy.redis/ #可以看到下载的reids角色目录结构
	[root@ansible ~]# ansible-galaxy remove geerlingguy.redis #删除角色

ansible-pull:#推送命令至远程
ansible-vault: #管理加密解密yml文件
	ansible-vault encrypt xx.yml #加密
	ansible-vault decrypt xx.yml #解密
	ansible-vault view xx.yml #查看
	ansible-vault edit xx.yml #编辑加密文件
	ansible-vault rekey xx.yml #修改口令
	ansible-vault create new.yml #创建新文件

ansible-console-2:#可交互执行命令,支持tab
[root@ansible ~]# ansible-console-2
root@all (2)[f:5]$ 
#执行用户@当前操作的主机组(当前组的主机数量)[f:并发数]$
root@all (2)[f:5]$ forks 10 #设置并发数
root@* (2)[f:10]$ cd websrvs #切换组
root@websrvs (1)[f:10]$ list # 列出当前主机组列表
192.168.100.20
root@websrvs (1)[f:10]$ yum name=httpd #执行命令

ansbile命令参数

ansible <host-parttern>主机清单 [-m module_name]模块名字 [-a args]模块参数
	-a 后面跟着要执行的模块参数
	--version 显示版本
	-m module 指定模块,一般不写
	-v 详细过程 -vv -vvv更详细
	--list-hosts 显示主机列表,可简写-list
	-k,--ask-pass 提示输入ssh连接密码
	-K,--ask-become-pass 提示输入sudo口令
	-C,--check 检查,不执行,预测可能发生的问题
	-T,--timeout=TIMEOUT 执行命令的超时时间,默认10S
	-u,--user=REMOTE_USER 执行远程执行的用户
	-b,--become 代替旧版的sudo切换
[root@ansible ~]# ansible all --list
  hosts (2):
    192.168.100.20
    192.168.100.30
[root@ansible ~]# ansible websrvs -u test -k -a 'ls /root'
#以test用户远程连接去查看/root目录,因为没有权限所以报错,所以要用到sudo提权
SSH password: 
192.168.100.20 | FAILED | rc=2 >>
ls: cannot open directory /root: Permission deniednon-zero return code

[root@ansible ~]# ansible websrvs -a "ls /root" -u test -k -b -K
SSH password: 
BECOME password[defaults to SSH password]: 
192.168.100.20 | FAILED! => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "module_stderr": "Shared connection to 192.168.100.20 closed.\r\n", 
    "module_stdout": "\r\ntest is not in the sudoers file.  This incident will be reported.\r\n", 
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", 
    "rc": 1
}
报错:因为在20主机上没有做过sudo授权
[root@node-1 ~]# visudo 
%wheel  ALL=(ALL)       ALL #将注释去掉
[root@node-1 ~]# usermod -aG wheel test 将test加到组
做完授权后再试一次
[root@ansible ~]# ansible websrvs -a "ls /root" -u test -k -b -K
SSH password: 
BECOME password[defaults to SSH password]: 
192.168.100.20 | CHANGED | rc=0 >>
anaconda-ks.cfg

如果sudo时不想输入口令
#%wheel ALL=(ALL)       ALL
%wheel  ALL=(ALL)       NOPASSWD: ALL
上面的加上注释,下面的去掉注释
[root@ansible ~]# ansible websrvs -a "ls /root" -u test -k -b
SSH password: 
192.168.100.20 | CHANGED | rc=0 >>
anaconda-ks.cfg
#把-K去掉就可以不用输入sudo口令也可以执行

Ansible的主机格式

匹配主机的列表
all:表示所有主机
*:通配符
	ansible "*" -m ping
	ansible 192.168.100.* -m ping
	ansible "*srvs" -m ping
或关系:
	ansible "websrvs:dbsrvs" -m ping
	ansible "192.168.100.20:192.168.100.30" -m ping
逻辑与:
	ansible 'websrvs:&appsrvs' -m ping
	#在websrvs组并且在appsrvs组的主机
逻辑非:
	ansible 'websrvs:!dbsrvs' -m ping
	#在websrvs组,但不在dbsrvs组中的主机      
正则表达式:
[root@ansible ~]# ansible '~(web|db)srvs' -m ping  

Ansible常用模块

1.command模块

在远程主机执行命令,默认模块,此命令不支持$VARNAME <> | ; &等,用shell模块实现

2.copy模块

相关选项:
backup:在覆盖之前,将源文件备份
content:用于替代src
dest:必选项,要将源文件复制到远程主机的绝对路径
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
group:拥有文件/目录的组的名称,将被馈送到chown
mode:文件/目录的权限,如将0644将被馈送到chmod
owner:拥有文件/目录的用户,chown
recurse:复制源目录中的所有内容
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。
如果路径是一个目录,它将递归复制。如果路径使用/结尾,则只复制目录里的内容,
如果没有/结尾,则包含目录在内的整个内容全部复制
[root@ansible ~]# ansible all -m copy -a "content='test\n' dest=/root/t.txt" #利用内容 直接生成目标文件
[root@node-1 ~]# cat t.txt 
test

[root@ansible ~]# vim 1.sh 
giao
[root@ansible ~]# ansible websrvs -m copy -a 'src=1.sh dest=/tmp/2.sh owner=test mode=500 backup=yes' # 如果目标存在,默认覆盖,指定先备份bakcup=yes
[root@node-1 tmp]# ll
total 12
-r-x------. 1 test root   5 Apr 24 03:43 2.sh
-rw-r--r--. 1 root root   0 Apr 24 03:42 2.sh.13148.2021-04-24@03:43:01~
[root@node-1 tmp]# cat 2.sh
giao

3.file模块

force 强制执行
group 设置文件的数组
mode 设置文件的权限
owner 设置文件的属主
path= 被管理文件的路径 别名dest,name
state file代表文件,link是个软链接,directory代表目录,hard代表硬链接,touch生成一个空文件,absent删除

创建目录
[root@ansible ~]# ansible websrvs -m file -a "path=/data/app state=directory"    
[root@ansible ~]# ansible websrvs -m shell -a 'ls -l /data'
192.168.100.20 | CHANGED | rc=0 >>
total 0
drwxr-xr-x. 2 root root 6 Apr 24 04:06 app

创建链接文件
[root@ansible ~]# ansible websrvs -m file -a 'path=/data/aaa.jpg state=touch'                          
[root@ansible ~]# ansible websrvs -m file -a 'path=/data/bbb.jpg src=aaa.jpg state=link'       
[root@ansible ~]# ansible websrvs -m shell -a 'ls -l /data'
192.168.100.20 | CHANGED | rc=0 >>
total 0
-rw-r--r--. 1 root root 0 Apr 24 04:13 aaa.jpg
drwxr-xr-x. 2 root root 6 Apr 24 04:06 app
lrwxrwxrwx. 1 root root 7 Apr 24 04:13 bbb.jpg -> aaa.jpg

删除文件
[root@ansible ~]# ansible websrvs -m file -a 'path=/data/app state=absent'
[root@ansible ~]# ansible websrvs -m shell -a 'ls -l /data'  
192.168.100.20 | CHANGED | rc=0 >>
total 0
-rw-r--r--. 1 root root 0 Apr 24 04:13 aaa.jpg
lrwxrwxrwx. 1 root root 7 Apr 24 04:13 bbb.jpg -> aaa.jpg             

4.yum模块

[root@ansible ~]# ansible websrvs -m yum -a 'name=httpd state=latest'  #安装
[root@ansible ~]# ansible websrvs -m yum -a 'name=httpd state=absent' #删除

5.service模块

用于服务程序的管理
arguments 命令行提供额外的参数
enabled 开机启动
name= 服务名称
runlevel 运行级别
sleep 重启服务过程中,是否等待 如 在服务器关闭以后等待2秒再启动
state 四种状态 started stopped restarted reloaded

开启服务并设置开机启动
[root@ansible ~]# ansible websrvs -m service -a 'name=httpd state=started enabled=true' 
[root@ansible ~]# ansible websrvs -m shell -a 'ss -ntl'
192.168.100.20 | CHANGED | rc=0 >>
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128         :::80                      :::*                  
LISTEN     0      128         :::22                      :::*                  
LISTEN     0      100        ::1:25                      :::*      
#80端口已经打开

 关闭服务
 [root@ansible ~]# ansible websrvs -m service -a 'name=httpd state=stopped'     
 [root@ansible ~]# ansible websrvs -m shell -a 'ss -ntl'                    
192.168.100.20 | CHANGED | rc=0 >>
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      100    127.0.0.1:25                       *:*                  
LISTEN     0      128         :::22                      :::*                  
LISTEN     0      100        ::1:25                      :::*                                          

6.user模块

用来管理用户账号
comment 用户的描述信息
createhome 是否创建家目录
force 在使用state=absent时 行为与userdel-force一致
group 指定基本组
groups 指定附加组 如果指定为(groups=)表示删除所有组
home 指定用户家目录
move_home 将用户主目录移动到指定的目录
name 指定用户名
non_unique 运行改变非唯一的用户ID值
password 指定用户密码
remove 与userdel-remove一致
shell 知道默认shell
state 设置账户状态 不指定为创建 指定值为absent表示删除
system 当创建一个用户,设置这个用户是系统用户。这个设置不能更改已存在用户
uid 指定用户uid


添加一个用户并指定其UID
[root@ansible ~]# ansible websrvs -m user -a 'name=giao uid=11111' 
[root@ansible ~]# ansible websrvs -m shell -a 'cat /etc/passwd | grep giao'
192.168.100.20 | CHANGED | rc=0 >>
giao:x:11111:11111::/home/giao:/bin/bash

删除用户
[root@ansible ~]# ansible websrvs -m user -a 'name=giao state=absent'
[root@ansible ~]# ansible websrvs -m shell -a 'cat /etc/passwd | grep giao'
192.168.100.20 | FAILED | rc=1 >>
non-zero return code

7.group模块

用于添加或删除组
gid= 设置组的GID
name= 指定组的名称
state= 组的状态 默认为创建 absent为删除
system= 设置为yes表示创建为系统组

创建组
[root@ansible ~]# ansible websrvs -m group -a 'name=giao gid=12222'
[root@ansible ~]# ansible websrvs -m shell -a 'cat /etc/group |grep 12222'
192.168.100.20 | CHANGED | rc=0 >>
giao:x:12222:

删除组
[root@ansible ~]# ansible websrvs -m group -a 'name=giao state=absent'

8.script模块

将本机的脚本在被控端的机器上运行
[root@ansible ~]# vim df.sh 
#!/bin/bash


date >> /tmp/disk_total.log
df -Th >> /tmp/disk_total.log

[root@ansible ~]# ansible websrvs -m script -a 'df.sh'                 
[root@ansible ~]# ansible websrvs -m shell -a 'cat /tmp/disk_total.log'
192.168.100.20 | CHANGED | rc=0 >>
Sat Apr 24 04:37:29 EDT 2021
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        17G  1.1G   16G   7% /
devtmpfs                devtmpfs  476M     0  476M   0% /dev
tmpfs                   tmpfs     488M     0  488M   0% /dev/shm
tmpfs                   tmpfs     488M  7.6M  480M   2% /run
tmpfs                   tmpfs     488M     0  488M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  130M  885M  13% /boot
tmpfs                   tmpfs      98M     0   98M   0% /run/user/0

9.setup模块

用于收集信息,通过facts组件来实现的
facts组件是ansible用于采集被控端设备信息的一个功能,可以使用setup模块查看机器的所有facts信息
可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中

查看信息
[root@ansible ~]# ansible websrvs -m setup -a 'filter="*mem*"' #查看内存
可以通过shell模块查看内存确认是否一致
[root@ansible ~]# ansible websrvs -m shell -a 'free -m'

保存信息
setup模块可以保存我们所筛选的信息到我们的主机上,同时文件名为被控端的IP,这样方便知道是哪个机器的信息
[root@ansible ~]# ansible websrvs -m setup -a 'filter="*mem*"' --tree /tmp/facts

[root@ansible ~]# cd /tmp/facts/
[root@ansible facts]# cat 192.168.100.20 
{"ansible_facts": {"ansible_memfree_mb": 468, "ansible_memory_mb": {"nocache": {"free": 760, "used": 214}, "real": {"free": 468, "total": 974, "used": 506}, "swap": {"cached": 0, "free": 2047, "total": 2047, "used": 0}}, "ansible_memtotal_mb": 974, "discovered_interpreter_python": "/usr/bin/python"}, "changed": false}[root@ansible facts]# 

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free