美文网首页
2020-01-10

2020-01-10

作者: WarrenYang | 来源:发表于2020-01-10 15:38 被阅读0次

ansible学习

什么是ansible

Ansible是一个自动化统一配置管理工具,自动化主要体现在Ansible集成了丰富模块以及功能组件,可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。

同类型软件对比

1.puppet 学习难,安装ruby环境难,没有远程执行功能
2.ansible 轻量级,大规模环境下只通过ssh会很慢,串行的
3.saltstack 一般选择salt会使用C/S结构的模式,salt-master和salt-minion,并行的,大规模批量操作的情况下,会比Ansible速度快一些,底层使用的是zero-MQ消协队列

saltstack与ansible区别:
    管理云平台
    支持的python版本 saltstack支持python2和python3   ansible支持python2

Ansible的功能及优点

1.远程执行
批量执行远程命令,可以对多台主机进行远程操作

2.配置管理
批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停

3.事件驱动
通过Ansible的模块,对服务进行不同的事件驱动
比如:
1)修改配置后重启
2)只修改配置文件,不重启
3)修改配置文件后,重新加载
4)远程启停服务管理

4.管理公有云
通过API接口的方式管理公有云,不过这方面做的不如saltstack.
saltstack本身可以通过saltcloud管理各大云厂商的云平台。

5.二次开发
因为语法是Python,所以便于运维进行二次开发。

6.任务编排
可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署

7.跨平台,跨系统
几乎不受到平台和系统的限制,比如安装apache和启动服务

在Ubuntu上安装apache服务名字叫apache2
在CentOS上安装apache服务名字叫httpd

在CentOS6上启动服务器使用命令:/etc/init.d/nginx start
在CentOS7上启动服务器使用命令:systemctl start nginx

ansible架构与执行流程

1、连接插件connection plugins用于连接主机 用来连接被管理端
2、核心模块core modules连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块custom modules根据自己的需求编写具体的模块
4、插件plugins完成模块功能的补充
5、剧本playbookansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单inventor定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
1.Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
2.首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块。
3.其次Ansible会通过连接插件连接对应的主机并推送对应的任务列表。
4.最后被管理的主机会将Ansible发送过来的任务解析为本地Shell命令执行。

安装ansible

1.准备环境

主机名 wanIP lanIP 角色
m01 10.0.0.61 172.16.1.61 Ansible控制端
web01 10.0.0.7 172.16.1.7 Ansible被控端
web02 10.0.0.8 172.16.1.8 Ansible被控端
lb01 10.0.0.4 172.16.1.4 Ansible被控端
lb02 10.0.0.5 172.16.1.5 Ansible被控端

2.安装ansible

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

3.ansible参数

# ansible <host-pattern> [options]
--version   #ansible版本信息
-v          #显示详细信息
-i          #主机清单文件路径,默认是在/etc/ansible/hosts
-m          #使用的模块名称,默认使用command模块
-a          #使用的模块参数,模块的具体动作
-k          #提示输入ssh密码,而不使用基于ssh的密钥认证
-C          #模拟执行测试,但不会真的执行
-T          #执行命令的超时

[root@m01 ~]# ansible --version -v
ansible 2.9.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
[root@m01 ~]# 

4.配置文件读取顺序

#要查看完整列表,请访问https://docs.ansibe.com/或使用ansibe-config命令。
For a full list check \fI\%https://docs.ansible.com/\fP\&. or use the \fIansible\-config\fP command.

#/etc/ansible/ansible.cfg 配置文件,如果存在则使用
/etc/ansible/ansible.cfg \-\- Config file, used if present

#~/.ansible.cfg 用户配置文件,覆盖默认配置(如果存在)
~/.ansible.cfg \-\- User config file, overrides the default config if present

#\&/ansible.cfg 本地配置文件(在当前工作目录中)假定为(aqproject-specific)(aq,如果存在,则重写其余文件)。
\&./ansible.cfg \-\- Local config file (in current working directory) assumed to be \(aqproject specific\(aq and overrides the rest if present.

#如上所述,ANSIBLE_CONFIG环境变量将覆盖所有其他环境变量。
As mentioned above, the ANSIBLE_CONFIG environment variable will override all others.

总结:
1、$ANSIBLE_CONFIG
2、./ansible.cfg
3、~/.ansible.cfg
4、/etc/ansible/ansible.cfg (正常情况只配置这个就可以了)

5.Ansible配置文件详解

[root@m01 ~]# cat /etc/ansible/ansible.cfg 
#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                     #每次执行是否询问sudo的ssh密码
#ask_pass      = True                     #每次执行是否询问ssh密码
#remote_port    = 22                      #远程主机端口
host_key_checking = False                 #跳过检查主机指纹
log_path = /var/log/ansible.log           #ansible日志

#普通用户提权操作
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False 

ansible主机清单

1.场景一:基于密码连接

[root@m01 ~]# cat /etc/ansible/hosts

#方式一、IP+端口+用户+密码
[webs]
10.0.0.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'
10.0.0.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='1'


#方式二、主机名+密码(必须将主机名写入hosts)
[webs]
web0[1:2] ansible_ssh_pass='123456'

#方式三、主机+密码(必须将主机名写入hosts)
[webs]
web0[1:2]
[webs:vars]
ansible_ssh_pass='123456'

2.场景二:基于密钥连接,需要先创建公钥和私钥,并下发公钥至被控端

#创建秘钥对
[root@m01 ~]# ssh-keygen

#推送公钥
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
#方式一、主机+端口+密钥
[webs]
10.0.0.7:22
10.0.0.8

#方式二、别名+主机+端口+密钥
[webs]
web01 ansible_ssh_host=10.0.0.7 ansible_ssh_port=22
web02 ansible_ssh_host=10.0.0.8

#方式三:主机名 + hosts + 密钥
[webs]
web01
web02
[root@m01 ~]# cat /etc/hosts
10.0.0.7 web01
10.0.0.8 web02

3.场景三:主机组使用方式

#配置主机清单
[root@m01 ~]# vim /etc/ansible/hosts 
[web_group]
web01
web02

[lb_group]
lb01
lb02

[root@m01 ~]# vim /etc/hosts
10.0.0.7 web01
10.0.0.8 web02
10.0.0.4 lb01
10.0.0.5 lb02


#查看指定组内主机数量
[root@m01 ~]# ansible web_group --list-host
  hosts (2):
    web01
    web02
[root@m01 ~]# ansible lb_group --list-host
  hosts (2):
    lb01
    lb02
[root@m01 ~]# ansible all --list-host
  hosts (4):
    lb01
    lb02
    web01
    web02
[root@m01 ~]# 

#是用-i参数的场景
[root@m01 ~]# vim hosts 
[install_nginx_group]
lb01
web01
db01
[root@m01 ~]# ansible install_nginx_group -i ./hosts --list-host
  hosts (3):
    lb01
    web01
    db01
[root@m01 ~]# ansible install_nginx_group -i ./hosts -m shell 'yum install -y nginx


#方式一、主机组变量+主机+密码
[db_group]
db01 ansible_ssh_host=10.0.0.51
db02 ansible_ssh_host=10.0.0.52
[db_group:vars]
ansible_ssh_pass='1'

#方式二、主机组变量+主机+密钥
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

#定义多组,多组汇总整合
# lnmp组包括两个子组[db,web]
[nginx_group:children]
web_group
lb_group

#最终配置文件
[root@m01 ~]# cat /etc/ansible/hosts 
[web_group]
web01
web02

[lb_group]
lb01
lb02

[nginx_group:children]
web_group
lb_group

[root@m01 ~]# vim /etc/hosts
10.0.0.7 web01
10.0.0.8 web02
10.0.0.4 lb01
10.0.0.5 lb02


#查看多组
[root@m01 ~]# ansible nginx_group:children --list-host
[WARNING]: Could not match supplied host pattern, ignoring: children  (警告可以忽略children)
  hosts (4):
    web01
    web02
    lb01
    lb02
[root@m01 ~]# ansible nginx_group --list-host
  hosts (4):
    web01
    web02
    lb01
    lb02
[root@m01 ~]# 

Ansible ad-hoc

什么是ad-hoc?

ad-hoc简而言之就是“临时命令”,执行完即结束,并不会保存

ad-hoc模式的使用场景

比如在多台机器上查看某个进程是否启动,或拷贝指定文件到本地,等等

ad-hoc模式的命令使用

image
[root@m01 ~]# ansible web_group -m shell -a 'df -h'
web02 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.4G   18G   8% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0

web01 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.4G   18G   8% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.6M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs            98M     0   98M   0% /run/user/0

ad-hoc结果返回颜色

绿色: 代表被管理端主机没有被修改
黄色: 代表被管理端主机发现变更
红色: 代表出现了故障,注意查看提示

ad-hoc 常用模块

command             # 执行shell命令(不支持管道等特殊字符)
shell               # 执行shell命令
script              # 执行shell脚本
yum_repository      # 配置yum仓库
yum                 # 安装软件
copy                # 变更配置文件
file                # 建立目录或文件
service             # 启动与停止服务
mount               # 挂载设备
cron                # 定时任务
get_url             #下载软件
firewalld           #防火墙
selinux             #selinux

Ansible-doc帮助手册
[root@m01 ~]# ansible-doc -l        # 查看所有模块说明
[root@m01 ~]# ansible-doc copy      # 查看指定模块方法
[root@m01 ~]# ansible-doc -s copy   # 查看指定模块参数

command模块(不识别特殊符号)

# 默认模块, 执行命令
[root@m01 ~]# ansible web01 -m command -a 'ifconfig eth0'
web01 | CHANGED | rc=0 >>
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.7  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::eba7:f61e:ad51:a114  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::184c:eb61:486c:d656  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::3c99:706f:2b25:1bee  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:9f:d6:25  txqueuelen 1000  (Ethernet)
        RX packets 30018  bytes 40064000 (38.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10757  bytes 1003061 (979.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
# 不识别特殊符号
[root@m01 ~]# ansible web01 -m command -a 'ps -ef | grep nginx'
web01 | FAILED | rc=1 >>
error: garbage option

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).non-zero return code

shell模块(识别特殊符号,但嵌套层数不能太多)

# 如果需要一些管道操作,则使用shell
[root@m01 ~]# ansible web01 -m shell -a 'ifconfig eth0 | awk 'NR==2''
web01 | CHANGED | rc=0 >>
        inet 10.0.0.7  netmask 255.255.255.0  broadcast 10.0.0.255

[root@m01 ~]# ansible web01 -m shell -a "ifconfig eth0 | awk 'NR==2'"
web01 | CHANGED | rc=0 >>
        inet 10.0.0.7  netmask 255.255.255.0  broadcast 10.0.0.255

[root@m01 ~]# ansible web01 -m shell -a "ifconfig eth0 | awk 'NR==2 {print $2}'"
web01 | CHANGED | rc=0 >>
        inet 10.0.0.7  netmask 255.255.255.0  broadcast 10.0.0.255

script模块

#先写一个脚本
[root@m01 ~]# vim mkdir.sh 
#!/bin/bash
mkdir /tmp/test

#ansible操作远端执行本地脚本
[root@m01 ~]# ansible web_group -m script -a './mkdir.sh'
web01 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to web01 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to web01 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}
web02 | CHANGED => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to web02 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to web02 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

#查看脚本执行结果
[root@m01 ~]# ansible web_group -m shell -a 'ls -l /tmp'
web02 | CHANGED | rc=0 >>
total 0
drwx------ 2 root root 41 Jan  8 19:55 ansible_command_payload_0qlbXE
drwxr-xr-x 2 root root  6 Jan  8 19:54 test
drwx------ 2 root root  6 Jan  8 16:35 vmware-root_6294-734169251
drwx------ 2 root root  6 Jan  7 01:29 vmware-root_6295-1681199997

web01 | CHANGED | rc=0 >>
total 0
drwx------ 2 root root 41 Jan  8 19:55 ansible_command_payload_RQh96v
drwxr-xr-x 2 root root  6 Jan  8 19:54 test
drwx------ 2 root root  6 Jan  7 01:29 vmware-root_6290-725715238
drwx------ 2 root root  6 Jan  8 16:35 vmware-root_6294-734169251

yum_repository 模块

- name: Add repository
  yum_repository:
    name: epel
    description: EPEL YUM repo
    baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
    file: external_repos
    gpgcheck: no
    mirrorlist: http://mirrorlist.repoforge.org/el7/mirrors-rpmforge
    enabled: no
   
#ansible执行
[root@m01 ~]# ansible web01 -m yum_repository -a "name=nginx description='nginx repo' baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=no enabled=yes file=nginx"

[root@web01 yum.repos.d]# cat nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

name            #yum源里面[]的内容
description     #yum源里面的name
file            #yum源的名字

相关文章

  • KMP

    2020-01-10 https://www.zhihu.com/question/21923021 https:...

  • 2020-01-13

    2020-01-10 谢总、陈总莅临卢雪剪纸展览馆参观

  • 临时记录_C++容器相关

    - [2020-01-10 五 11:53] 第9章 顺序容器 vector,随机访问、大...

  • 临时记录_C++容器相关

    - [2020-01-10 五 11:53] 第9章 顺序容器 vector,随机访问、大...

  • 字符串距离

    2020-01-10 莱文斯坦距离 又称Levenshtein距离,是编辑距离(edit distance)的一种...

  • 2020-01-11

    2020-01-10 【日精进打卡第 656 天 【知~学习】 《六项精进》大纲 4 遍共 2480 遍 《大学》...

  • 善良

    高艳峰 信阳 网络中级九期 坚持分享第648天 2020-01-10 心怀善意,永远懂得理解别人的难处,才...

  • 2020-01-10

    2020-01-10 扬州市方圆建筑工程有限公司 377期利他2组 【日精进打卡第634天】 【知~背诵】 《六项...

  • 《科幻小说写作资料 汇总》2020-01-10更新《科幻之路》第

    《科幻小说写作资料 汇总》2020-01-10更新《科幻之路》第一卷 2020重制版 一览 点击链接查看原图,可以...

  • 母爱的羁绊

    作者:卡瑞尔.麦克布莱德(美) 阅读时间:2020-01-10(周五)开始 这是一本关于母亲与女儿之间相爱相杀的心...

网友评论

      本文标题:2020-01-10

      本文链接:https://www.haomeiwen.com/subject/nfxmactx.html