暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

03-Ansible模块介绍

佐伊猫玖 2020-09-11
241

1.什么是Ansible

Ansible 是 python 中的一套模块,系统中的一套自动化工具,只需要使用 ssh 协议连接及可用来系统管理、自动化执行命令等任务。

2.为什么需要Ansible?

批量管理功能:


 1. 可以实现批量系统操作配置
 2. 可以实现批量软件服务部署
 3. 可以实现批量文件数据分发
 4. 可以实现批量系统信息收集

管理服务意义:


 1. 提高工作的效率(部署综合架构)  
 2. 提高工作准确度
 3. 减少维护的成本
 4. 减少重复性工作

安装部署简单:


 1. 没有配置文件(不需要配置)
 2. 不需要启动服务
 3. 客户端没有需要部署任务

同类型软件对比

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


3.如何学习Ansible?

 1.官方文档
 2.帮助文档
 3.其他人写好的文档

4.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安装部署

Ansible的安装部署十分简单,只需要yum安装就行

 #1.安装epel
 [root@m01 ~]# wget -O etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 


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

第三章 Ansible主机清单

/etc/ansible/hosts 主机资产清单文件,用于定义被管理主机的认证信息, 例如 ssh 登录用户名、密码以及 key相关信息。


 1.主机支持主机名通配以及正则表达式,例如 web[1:3].oldboy.com 代表三台主机
 2.主机支持基于非标准的 ssh 端口,例如 web1.oldboy.com:6666
 3.主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
 4.主机组支持指定变量[group_name:vars],同时支持嵌套组[game:children]
 
 支持组对组

1.指定主机组相关配置


 #主机组
 [root@m01 ~]# cat /etc/ansible/hosts
 [webserver]
 172.16.1.31
 172.16.1.41
 #主机+端口+密码
 [webserver]
 172.16.1.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
 172.16.1.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
 #对整个主机组都生效的变量
 [webserver:vars]
 ansible_ssh_pass='123456'
 
 #针对所有webserver组都生效的变量
 [webserver:vars]      
 ansible_ssh_pass='123456'
   
 #两个组配置children
 [cc:children]
 web
 nfs
   
 #针对所有组的变量
  [all:vars]
 ansible_password='123456'
 
 
 

配置文件详解

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


第四章 Ansible常用模块

Ansible ad-hoc

什么是ad-hoc?

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


ad-hoc模式的使用场景

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

Ansible-doc帮助手册

 [root@m01 ~]# ansible-doc -l        # 查看所有模块说明
 [root@m01 ~]# ansible-doc copy      # 查看指定模块方法
 [root@m01 ~]# ansible-doc -s copy   # 查看指定模块参数
 -jjson格式显示所有模块信息
 -l 列出所有的模块
 -s 查看模块常用参数


0.如何学习模块

ansible官方网站:

 https://docs.ansible.com/

模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"

1.ping模块

应用场景:
测试主机和ansible之间的连通性
举例:
对webserver主机组测试是否连通


 ansible webserver -m ping

2.command 简单模块

应用场景:
类似shell,但是只能执行简单的命令,复杂的命令和有些符号并不能识别,用的比较少
01.查看主机名,可以执行成功


 [root@m01 ~]# ansible webserver -m ping       
 172.16.1.41 | SUCCESS => {
     "ansible_facts": {
         "discovered_interpreter_python": "/usr/bin/python"
    },
     "changed": false,
     "ping": "pong"
 }
 172.16.1.31 | SUCCESS => {
     "ansible_facts": {
         "discovered_interpreter_python": "/usr/bin/python"
    },
     "changed": false,
     "ping": "pong"
 }

02.使用awk拼接查看主机IP执行失败


 [root@m01 ~]# ansible webserver -m command -a "ifconfig eth0|grep 10"     
 172.16.1.31 | FAILED | rc=255 >>
 SIOCSIFADDR: 没有那个设备
 eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code
 
 172.16.1.41 | FAILED | rc=255 >>
 SIOCSIFADDR: 没有那个设备
 eth0|grep: ERROR while getting interface flags: 没有那个设备non-zero return code

3.shell 万能模块

万能模块,所有命令都可以执行,和本地执行效果一样
01.使用管道查询IP地址


 [root@m01 ~]# ansible webserver -m shell -a "ifconfig eth0|grep 10.0.1"
 172.16.1.41 | CHANGED | rc=0 >>
         inet 10.0.1.41  netmask 255.255.255.0  broadcast 10.0.1.255
 
 172.16.1.31 | CHANGED | rc=0 >>
         inet 10.0.1.31  netmask 255.255.255.0  broadcast 10.0.1.255

02.批量执行脚本
在其他主机上创建一个脚本,内容为打印主机名


 cat > echo.sh << EOF 
 #!/bin/bash
 echo "$(hostname)"
 EOF

然后使用ansible的shell模块批量执行


 [root@m01 ~]# ansible webserver -m shell -a "/bin/bash root/echo.sh"
 172.16.1.41 | CHANGED | rc=0 >>
 backup
 
 172.16.1.31 | CHANGED | rc=0 >>
 nfs01

4.copy 拷贝文件

01.拷贝m01的hostsname文件到其他主机的/opt目录下

 [root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/etc/hostname dest=/opt"

02.在传输文件时修改文件属主和属组信息

 ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ owner=oldboy group=oldboy"

03.在传输文件时修改文件的权限信息

 ansible 172.16.1.31 -m copy -a "src=/root/rsync.password dest=/etc/ mode=0600"

04.创建文件并直接写入内容

 ansible 172.16.1.31 -m copy -a "content='1' dest=/etc/rsync.password mode=0600"

05.复制目录
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制

 ansible 172.16.1.31 -m copy -a "src=/data dest=/data"

src后面目录有/: 只将目录下面的内容都进行远程传输复制

 ansible 172.16.1.31 -m copy -a "src=/data/ dest=/data"

06.在目标主机本地执行copy操作

 ansible all -m copy -a "src=/etc/hostname dest=/opt remote_src=yes


参数说明:


 src #推送数据的源文件信息
 dest #推送数据的目标路径
 backup #对推送传输过去的文件,进行备份
 content #直接在远程主机被管理文件中添加内容,会覆盖原文件内容
 group #将本地文件推送到远端,指定文件属组信息
 owner #将本地文件推送到远端,指定文件属主信息
 mode #将本地文件推送到远端,指定文件权限信息
 remote_src:   在目标主机本地执行copy操作
 
 template:变量

5.file 设置文件属性

01.创建文件夹

 ansible web -m file -a "path=/root/oldboy state=directory"

02.创建文件并更改属性

 ansible oldboy -m file -a "path=/root/test.txt state=touch mode=777 owner=root group=root"

03.创建软链接

 ansible oldboy -m file -a "src=/root/.ssh/  path=/xiaoming_link state=link"

04.删除文件

 ansible web -m -a "path=/opt/xiaoming.txt state=absent"

05.创建文件的同时-可以指定属主权限

 ansible -m file -a "path=/tmp/xiaoming  state=touch  owner=www  group=www mode=600"

06.递归更改目录授权

 ansible all -m file -a "path=/opt/data owner=zhangya group=zhangya recurse=yes


参数说明:

 path #指定远程主机目录或文件信息
 recurse #递归授权
 
 state  # 状态
       directory #在远端创建目录
       touch #在远端创建文件
       link #linkhard 表示创建链接文件
       absent #表示删除文件或目录
       mode #设置文件或目录权限
       owner #设置文件或目录属主信息
       group #设置文件或目录属组信息
       hard     #创建硬连接,需要和src配合使用
       recurse:  #递归修改 yes no

6.script模块

 vvvvv 显示详细过程 执行 蓝色
 [root@m01 ~]# ansible wb-m script -a "/server/scripts/yum.sh"


 # 编写脚本
 [root@m01 ~]# mkdir -p server/scripts
 [root@m01 ~]# cat server/scripts/yum.sh
 #!/usr/bin/bash
 yum install -y iftop
 #在本地运行模块,等同于在远程执行,不需要将脚本文件进行推送目标主机执行
 [root@m01 ~]# ansible wb-m script -a "/server/scripts/yum.sh"

7.cron定时任务模块

创建测试脚本:

 [root@m01 ] # cat  echo_hostname.sh
 #!/bin/bash
 echo "$(date +%F)_$(hostname)" >> tmp/hostname.txt

01.创建一条定时任务

 ansible web -m cron -a "minute=* hour=* day=* month=* weekday=* job='/bin/sh/server/scripts/test.sh'"

02.注释定时任务信息,防止重复

 ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash opt/echo_hostname.sh" disabled=yes

02-1.打开一条注释信息

 ansible all -m cron -a 'name="echo_hostname" minute="*/5" job="/bin/bash opt/echo_hostname.sh" disabled=no'


 ansible oldboy -m cron -a "name='cron01' job='/bin/sh server/scripts/test.sh'"

03.删除相应定时任务(只要写名字)

 ansible all -m cron -a 'name="None" state=absent'#删除Node
 ansible oldboy -m cron -a "name='ansible cron02' minute=0 hour=0 job='/bin/sh
 /server/scripts/test.sh' state=absent"

04.注释相应定时任务,使定时任务失效

 ansible oldboy -m cron -a "name='ansible cron01' minute=0 hour=0 job='/bin/sh/server/scripts/test.sh' disabled=no"

参数

 job     #指定需要执行的任务
 minute   #分钟
 hour     #小时
 day     #天
 month   #月
 weekday #周
 name     #对计划任务进行描述
 state:
    absetn   #删除计划任务
    disabled=yes #注释



8.user用户模块

01.创建用户指定uid,gid,不创建家目录也不允许登陆

 ansible web -m user -a "name=oldgirl uid=888 group=888 shell=/sbin/nologin  create_home=no"

02.创建普通用户,允许登录设置密码为123456

官网文档

 如何为用户模块生成加密密码?
 Ansible ad-hoc命令是最简单的选项:
 
 ansible all -i localhost, -m debug -a "msg={{ '密码' | password_hash('sha512', '密码') }}"
 大多数Linux系统上可用的mkpasswd实用程序也是一个不错的选择:
 
 mkpasswd --method=sha-512
 如果您的系统上未安装此实用程序(例如,您正在使用macOS),那么您仍然可以使用Python轻松生成这些密码。首先,确保 已安装Passlib密码哈希库:
 
 pip install passlib
 库准备就绪后,可以按以下方式生成SHA512密码值:
 
 python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"


 https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#howdo-i-generate-encrypted-passwords-for-the-user-module

对密码进行加密

注意变量

 [root@m01 ~]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', '123456') }}" localhost | SUCCESS => {    "msg": "$6$123456$37mxvJGRzjWxgD3HYl.bKq4aUXrcYV8mk0pxmqg8ARv3t9ke5ZM/NBbwTkx1FDcn LhrOX3jQc6L/NKAohhQJn/" }

剧本方式执行

 [root@m01 ~] # cat  useradd.yaml 
 - hosts: web01
  tasks:
  - name: useraddpass
    user:
      name: xiaoming2      
      password: '$6$123$g5ateLQLXjS9urJNqpW3i.vmDCXpIP7H0NWfrh6CJSTJUZwmULaTKR7iyZG8ZLIBHmkJAc91gHmCwdkFwovkQ/'
 
 


参数说明:


   name        #指定用户的名字
       
          home        #指定用户的家目录
          uid         #指定用户的uid
          group       #指定用户的用户组
          groups      #指定用户的附加组
          password    #指定用户的密码
          shell       #指定用户的登录shell
          create_home #是否创建用户家目录,默认是yes no
          remove      #删除用户时,指定是否删除家目录
 state:
       absent    #删除用户

9.group组模块

01.创建用户组

 ansible oldboy -m group -a "name=oldzhang gid=888 state=present"

参数说明:


 name #指定创建的组名
 gid #指定组的 gid
 state
 absent #移除远端主机的组
 present #创建远端主机的组(默认)

10.yum模块

  ansible  web  -m yum -a "name=httpd state=installed"

1-列出所有已安装的软件包

 [root@ansible ~]# ansible web  -m yum -a 'list=installed'

2-列出所有可更新的软件包

 [root@ansible ~]# ansible 1 web  -m yum -a 'list=updates'

####3-列出所有的yum仓库

 [root@ansible ~]# ansible  web  -m yum -a 'list=repos'

####4-只下载软件包并到指定目录下

 [root@ansible ~]# ansible web -m yum -a 'name=httpd download_only=yes download_dir=/tmp'

####5-安装软件包

 [root@ansible ~]# ansible  web  -m yum -a 'name=httpd state=installed'

####6-卸载软件包

 [root@ansible ~]# ansible  web  -m yum -a 'name=httpd state=removed'

7-重指定URL地址安装rpm 包

 yum install nginx -y
 sed -i '38,87d' /etc/nginx/nginx.conf
 cat >/etc/nginx/conf.d/yum.conf <<EOF
 server {
  listen 80;  
    server_name localhost;
    location / {  
    root /data/yum;  
    charset utf-8,gbk;
    autoindex on;    
    autoindex_localtime on;    
    autoindex_exact_size off;
    }
  }
  EOF
  mkdir /data/yum chown -R nginx:nginx /data/yum
  cd /data/yum
  wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.01.el7.ngx.x86_64.rpm
  nginx -t systemctl restart nginx
  curl 127.0.0.

从管理机安装软件

 ansible all -m yum -a "name=http://10.0.0.61/nginx-1.10.01.el7.ngx.x86_64.rpm state=latest"


参数说明:


 name       #指定要安装的软件包名称
 download_dir    #指定下载软件包的存放路径,需要配合download_only一起使用
 download_only   #只下载软件包,而不进行安装,和yum --downloadonly一样
 
 list:
    installed   #列出所有已安装的软件包
    updates     #列出所有可以更新的软件包
    repos       #列出所有的yum仓库
 state:  
    installed, present   #安装软件包(两者任选其一都可以u哦那个第二个)
    removed, absent      #卸载软件包
    latest      #安装最新软件包

11.service.systemd服务管理

 ansible oldboy -m service -a "name=nfs state=stopped enabled=yes"
 [root@m01 ~] # ansible backup -m service -a "name=rsyncd state=restarted enabled=yes"
 ansible backup -m service -a "name=rsyncd state=started enabled=yes"

参数说明:

 name # 定义要启动服务的名称
 state # 指定服务状态
 started #启动服务
 stopped #停止服务
 restarted #重启服务
 reloaded #重载服务
 enabled #开机自启

12.mount远程nfs本地也装nfs

本地机器必须支持这个命令;安装nfs

1-挂载一个目录并写入fastab

 ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=mounted"
 

2--只写入fastab 但是不挂载

 ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present"

3-写入fastab但是不挂载

 ansible web -m mount -a "src=172.16.1.31:/data path=/data fstype=nfs state=present

4-卸载已经挂载的目录并删除fstab条目

 ansible web -m mount -a "path=/data state=absent

5-卸载已经挂载的目录但是不删除fstab条目

 ansible web -m mount -a "path=/data state=unmounted

状态解释

 src # 需要挂载的
 path #本地挂载目录
 state
      present # 开机挂载,仅将挂载配置写入/etc/fstab
      mounted # 挂载设备,并将配置写入/etc/fstab
      unmounted # 卸载设备,不会清除/etc/fstab 写入的配置
      absent # 卸载设备,会清理/etc/fstab 写入的配置-如果挂载目录空的会删除目录
       fstype=nfs
        remounte #强制重新挂载

13.unarchive解压

01.解压远程服务器的压缩包到指定目录

 ansible 172.16.1.31 -m unarchive -a "src=/opt/sys.tar.gz dest=/opt/ remote_src=yes"

02.把本地文件解压到目标机器指定目录


 ansible 172.16.1.31 -m unarchive -a "src=/opt/log.tar.gz dest=/opt/" 

14.archive压缩

01.压缩单个文件

 ansible 172.16.1.31 -m archive -a "path=/var/log/message ,,,,,dest=/tmp/log.tar.gz format=gz force_archive=true" 

02压缩文件到指定目录

 ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.tar.gz

03 压缩文件到指定目录格式

 ansible all -m archive -a "path=/opt/*.txt dest=/tmp/opt.zip format=zip"


 ansible 172.16.1.31 -m archive -a "path=/var/log/message  dest=/tmp/log.tar.gz format=gz force_archive=true" 

15.setup 获取主机信息

01.直接执行获取主机信息

 ansible 172.16.1.31 -m setup

02.只将主机某个信息打印出来


 [root@m01 /server/scripts/test]# ansible 172.16.1.41 -m setup -a "filter=ansible_all_ipv4_addresses"              
 172.16.1.41 | SUCCESS => {
     "ansible_facts": {
         "ansible_all_ipv4_addresses": [
             "172.16.1.41",
             "10.0.1.41"
        ],
         "discovered_interpreter_python": "/usr/bin/python"
    },
     "changed": false
 }

16.get_url下载模块

下载  文件weget

 [root@ansible ~] # ansible web -m get_url -a 'url=http://47.114.186.72/xiazai/video_2020-02-15_19-03-52.mp4   dest=/tmp mode=0644' -i hosts 
 

参数

 url             #指定下载地址
 dest           #指定下载的目录
 mode           #指定权限
 checksum       #校验加密算法
    md5
    sha256 注意http

17.Ansible防火墙模块

 #修改配置文件关闭selinux,必须重启
 [root@m01 ~]# ansible web_group -m selinux -a 'state=disabled' -i ./hosts
 #临时关闭
 [root@m01 ~]# ansible web_group -m shell -a 'setenforce 0' -i ./hosts
 [root@m01 ~]# ansible web_group -m shell -a 'getenforce' -i ./hosts


##16.查看帮助

 ansible-doc -l
 ansible-doc copy


第六章 Ansible输出信息颜色解释


 01. 绿色信息:  查看主机信息/对主机未做改动
 02. 黄色信息: 对主机数据信息做了修改
 03. 红色信息: 命令执行出错了
 04. 粉色信息: 忠告信息
 05. 蓝色信息: 显示ansible命令执行的过程



文章转载自佐伊猫玖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论