学习是一个逐步发现自己无知的过程!

ansible快速入门

在早期常见的自动化运维工具中,常见的有puppet,saltstack,ansible等软件,目前常用的就是ansible和saltsack 2款工具。saltstack与puppet都是基于C/S模式工作的,他们需要安装服务端与客户端,基于Python编写,加入MQ消息同步,可以是执行命令和执行结果高效返回,但执行过程需要等客户端返回。所以如果客户端没有及时返回或响应,就可能导致部分机器没有执行结果。目前用的较少。

ansible 概述

Ansible是一款自动化运维工具,基于python开发,集合了众多运维工具(puppet,chfengine,chef,func,fabric)的有点,实现了批量系统配置,批量程序部署,批量运行命令等功能。

Ansible是一种安装在控制节点上的无代理自动化工具。Ansible从控制节点远程管理机器和其他设备(默认情况下,通过ssh协议)。Ansible与Saltstack均是基于Python语言开发,Ansible只需要在一台普通的服务器上运行即可,不需要在客户端服务器上安装客户端。因为Ansible是基于SSH远程管理,而Linux服务器大都离不开SSH,所以Ansible不需要为配置工作添加额外的支持。

Ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是Ansible所运行的模块,Ansible只是提供一种框架。主要包括:

  • 连接插件connection plugins:负责和被监控端实现通信;
  • host inventory:指定操作的主机,是一个配置文件里面定义的主机;
  • 各种核心模块,command模块,自定义模块;
  • 借助于插件完成记录日志邮件等功能;
  • playbook:剧本执行多个任务时,非必须可以让节点一次性运行过个任务;

ansible架构图

file

是什么要使用ansible

  • 提高工作效率

  • 提高工作准确度

  • 减少维护成本

  • 减少重复性工作

ansible 功能

  • 可以实现批量系统操作配置

  • 可以实现批量软件服务部署

  • 可以实现批量文件数据分发

  • 可以实现批量系统信息收集

ansible 优点

  • 管理端不需要重启服务程序(no server)
  • 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
  • 受控端不需要安装软件程序(libselinux-python)
  • 受控端不需要重启服务程序(no agent)
  • 服务程序管理操作模块众多(module)
  • 利用剧本编写来实现自动化(playbook)
  • 支持sudo 普通用户

ansible工作机制

file

# 由上面的图可以看到 Ansible 的组成由 5 个部分组成:

#Ansible :    ansible核心
#Modules :    包括 Ansible 自带的核心模块及自定义模块
#Plugins :    完成模块功能的补充,包括连接插件、邮件插件等
#Playbooks :  剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行
#Inventory :  定义 Ansible 管理主机的清单  [ˈɪnvəntri] 清单

ansible工作流程图

file

ansible安装

官方安装步骤

# Centso 需要设置EPEL仓库
[root@ansible_server~]# yum install epel-release

# 使用yum 安装ansible 
[root@ansible_server~]# yum install ansible

# 查看ansible 安装版本
[root@ansible_server~]# ansible --version
ansible 2.9.25
  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)]

ansible 常用参数

# ansible 命令参数

# anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
ansible详细参数:
 -v,-verbose            # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
 -i PATH, -inventory=PATH  #  指定 host 文件的路径,默认是在 /etc/ansible/hosts 
inventory  [ˈɪnvəntri]  库存
 -f NUM,-forks=NUM      # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
 -m NAME,-module-name=NAME    #   指定使用的 module 名称,默认使用 command模块
 -a,MODULE_ARGS         #指定 module 模块的参数
 -k,-ask-pass           #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证
 -sudo                  # 指定使用 sudo 获得 root 权限
 -K,-ask-sudo-pass      #提示输入 sudo 密码,与 -sudo 一起使用
 -u USERNAME,-user=USERNAME          # 指定移动端的执行用户
 -C,-check             #测试此命令执行会改变什么内容,不会真正的去执行

# ansible-doc详细参数:
    ansible-doc -l          #列出所有的模块列表
    ansible-doc -s 模块名    #查看指定模块的参数  -s,   snippet  [ˈsnɪpɪt]   片断

 [root@ansible_server~]#  ansible-doc -s service

#列出模块使用简介
 [root@ansible_server~]# ansible-doc -l   

# 指定一个模块详细说明
 [root@ansible_server~]# ansible-doc -s fetch   

 # 查询模块在剧本中应用方法
 [root@ansible_server~]# ansible-doc fetch      
  • Ansible基于多模块管理,常用的Ansible工具管理模块包括:commandSHELLscriptyumcopyfileasyncdockercronmysql_userpingsysctluseracladd_hosteasy_installhaproxy .....

  • command 不支持管道付,可以使用shell模块

  • 可以使用ansible-doc -l more查看ansible支持的模块,也可以查看每个模块的帮助文档,ansible-doc modulename

自定义主机清单

[root@jenkins ~]# cd /etc/ansible/
[root@jenkins ansible]# ls
ansible.cfg  hosts  roles

# ansible默认的hosts示例文件
[root@jenkins ansible]# cat hosts 
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the '#' character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups

# Ex 1: Ungrouped hosts, specify before any group headers.

## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10

# Ex 2: A collection of hosts belonging to the 'webservers' group

## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110

# If you have multiple hosts following a pattern you can specify
# them like this:

## www[001:006].example.com

# Ex 3: A collection of database servers in the 'dbservers' group

## [dbservers]
## 
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57

# Here's another example of host ranges, this time there are no
# leading 0s:

## db-[99:101]-node.example.com

# 备份默认文件,这是个好习惯
[root@jenkins ansible]# cp hosts hosts.bakcup
[root@jenkins ansible]# ls
ansible.cfg  hosts  hosts.bakcup  roles
[root@jenkins ansible]# > hosts
[root@jenkins ansible]# cat hosts

# 写入主机IP
[root@jenkins ansible]# cat hosts
[docker]
10.211.55.66

[nginx]
10.211.55.20

# 本机也可以自己管理自己
[manager]
127.0.0.1

基于SSH免密登陆

# 第一个历程: 创建秘钥对(管理端服务器)  
    sh-keygen -t 秘钥的类型(dsa|rsa)
#第二个历程: 将公钥进行分发(被管理端服务器)
    ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.5

# 本地生成rsa 密钥对
[root@ansible ~]# ssh-keygen   # 一路回车
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    
Enter passphrase (empty for no passphrase):                 
Enter same passphrase again:                                
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:HhsjmGY6DJoSREojVpJmSI63vuoXKy6sK2ESh/eQJr0 root@ansible_server
The key's randomart image is:
+---[RSA 2048]----+
|+Bo.             |
|X+o              |
|==..             |
|=.B. o           |
|o*.+= . S        |
|+BE=.  o =       |
|B.= o   o        |
|+o =             |
|X=+              |
+----[SHA256]-----+

# 上传到被管理端
[root@web01 ~]# ssh-copy-id root@10.211.55.22
[root@web01 ~]# ssh-copy-id root@10.211.55.20
[root@web01 ~]# ssh-copy-id root@10.211.55.66

ansible模块使用

ping模块

Ansible最基础的模块为ping模块,主要用于判断远程客户端是否在线,用于ping本身服务器,返回值为changed,ping。

ansible 实现自己管理自己

# ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。
格式:
ansible_ssh_port:指定ssh端口   
ansible_ssh_user:指定 ssh 用户 
ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)  
ansible_sudo_pass:指明 sudo 时候的密码

[root@jenkins ~]# cat /etc/ansible/hosts
[docker]
10.211.55.66

[nginx]
10.211.55.20

[manager]
127.0.0.1 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123

# 同时还可以基于SSH 免密登录,2种方式选一种。
# 将自己的密钥拷贝到本地,然后ssh 连接一下即可。

[root@jenkins ~]# ssh-copy-id root@127.0.0.1

ansible 测试整个网段的连通性

# ping 某一个网段
[root@jenkins ~]# ansible 10.211.55.* -m  ping
10.211.55.66 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
10.211.55.20 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

# 路径是可以省略的  -i ,因为默认路径就是 /etc/ansible/hosts
[root@jenkins ~]# ansible -i /etc/ansible/hosts "docker" -m ping
10.211.55.66 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

shell 模块

模块参数介绍

# Ansible shell模块主要用于远程客户端上执行各种Shell命令或者运行脚本,远程执行命令通过/bin/sh环境来执行,支持比command更多的指令,Shell模块使用详解:

# 常用参数
chdir                   执行命令前,切换到目录;
creates                 当该文件存在时,则不执行该步骤;
executable              换用shell环境执行命令;
free_form               需要执行的脚本;
removes                 当该文件不存在时,则不执行该步骤;
warn                    如果在ansible.cfg中存在告警,如果设定了False,不会警告此行。

通过ansible执行远程命令

  • [ansible命令 主机组名 -m 指定模块 -a 运行的shell指令]
# 查看docker服务器上的nginx服务
[root@jenkins ~]# ansible docker -m shell -a "ps -ef|grep nginx"
10.211.55.20 | CHANGED | rc=0 >>
root       769   750  0 17:45 ?        00:00:00 nginx: master process nginx -g daemon off;
101        824   769  0 17:45 ?        00:00:00 nginx: worker process
101        825   769  0 17:45 ?        00:00:00 nginx: worker process
root       950   945  0 17:47 pts/1    00:00:00 /bin/sh -c ps -ef|grep nginx
root       952   950  0 17:47 pts/1    00:00:00 grep nginx

# 查看docker服务器上运行的容器
[root@jenkins ~]# ansible docker -m shell -a "docker ps"
10.211.55.20 | CHANGED | rc=0 >>
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
5fd796d37d3c   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   80/tcp    pensive_jang
[root@jenkins ~]# 

# 批量修改密码
# 通通过shell 远程批量修改密码
[root@jenkins ~]# ansible www -m shell -a "echo 123456|passwd --stdin root"
10.211.55.5 | CHANGED | rc=0 >>
Changing password for user root.
passwd: all authentication tokens updated successfully.
10.211.55.6 | CHANGED | rc=0 >>
Changing password for user root.
passwd: all authentication tokens updated successfully.

ansible command模块

模块参数介绍

# Ansible command模块为ansible默认模块,主要用于执行Linux基础命令,可以执行远程服务器命令执行、任务执行等操作。Command模块使用详解:

Chdir                   执行命令前,切换到目录;
Creates                 当该文件存在时,则不执行该步骤;
Executable              换用shell环境执行命令;
Free_form               需要执行的脚本;
Removes                 当该文件不存在时,则不执行该步骤;
Warn                    如果在ansible.cfg中存在告警,如果设定了False,不会警告此行。

执行远程命令,查看磁盘空间

[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.20 -m command -a "df -h"
10.211.55.20 | CHANGED | rc=0 >>
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G  8.9M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   38G  8.8G   30G   24% /
/dev/sda1               1014M  185M  830M   19% /boot
tmpfs                    379M     0  379M    0% /run/user/0
overlay                   38G  8.8G   30G   24% /var/lib/docker/overlay2/33a9c21c133e532ea560b258423f35d2e132c05c2c44a69ea88849a6e6cbabf8/merged

# 写hosts定义的组名,效果相同
[root@jenkins ~]# ansible docker -m command -a "df -h"
10.211.55.20 | CHANGED | rc=0 >>
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G  8.9M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   38G  8.8G   30G   24% /
/dev/sda1               1014M  185M  830M   19% /boot
tmpfs                    379M     0  379M    0% /run/user/0
overlay                   38G  8.8G   30G   24% /var/lib/docker/overlay2/33a9c21c133e532ea560b258423f35d2e132c05c2c44a69ea88849a6e6cbabf8/merged

执行远程命令下载资源

# 检查服务器上是否有安装包
[root@jenkins ~]# ansible docker -m command -a "ls /opt"
10.211.55.20 | CHANGED | rc=0 >>
containerd

# 在docker服务器上执行远程下载命令
[root@jenkins ~]# ansible docker -m command -a "wget https://www.baidu.com "
......
10.211.55.20 | CHANGED | rc=0 >>
......
正在解析主机 www.baidu.com (www.baidu.com)... 36.152.44.95, 36.152.44.96
正在连接 www.baidu.com (www.baidu.com)|36.152.44.95|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2443 (2.4K) [text/html]
正在保存至: “index.html”

copy模块

模块参数介绍

# Ansible copy模块主要用于文件或者目录拷贝,支持文件、目录、权限、用户组功能,copy模块使用详解:

# 常用参数
src             Ansible端源文件或者目录,空文件夹不拷贝;
content         用来替代src,用于将指定文件的内容,拷贝到远程文件内;
dest                客户端目标目录或者文件,需要绝对路径;
backup          # 拷贝之前,先备份远程节点上的原始文件;backup=yes
directory_mode  用于拷贝文件夹,新建的文件会被拷贝,而老旧的不会被拷贝;
follow          支持link文件拷贝;
force           覆盖远程主机不一致的内容;
group           设定远程主机文件夹的组名;
mode            指定远程主机文件及文件及的权限;
owner           设定远程主机文件夹的用户名,拥有者。

将ansible服务器上的文件拷贝到其他服务器

#将ansible 服务器上的http 安装包远程 拷贝到 10.0.0.5 服务器上,且权限设置为 755
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m command -a "ls" 
10.211.55.66 | CHANGED | rc=0 >>

[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m copy -a "src=/root/index.html dest=/root mode=755"
10.211.55.66 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "checksum": "3aea39f7fdb8c7878086ca0dbefe1f2312f5012d", 
    "dest": "/root/index.html", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "43b5317b353ec84cd09c621e7d906552", 
    "mode": "0755", 
    "owner": "root", 
    "size": 2443, 
    "src": "/root/.ansible/tmp/ansible-tmp-1644894035.28-10005-59052388919023/source", 
    "state": "file", 
    "uid": 0
}

# 查看10.211.55.66 文件是否拷贝成功
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m command -a "ls -l"
10.211.55.66 | CHANGED | rc=0 >>
总用量 4
-rwxr-xr-x 1 root root 2443 2月  15 11:00 index.html

# 查看同一个www组中的 10.211.55.67 是否也有
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.67 -m command -a "ls" 
10.211.55.67 | CHANGED | rc=0 >>

yum模块

模块参数介绍

#Ansible yum 模块主要用于软件的安装、升级、卸载,支持红帽.rpm软件的管理,YUM模块使用详解:
# 常用参数
conf_file                       设定远程yum执行时所依赖的yum配置文件
disable_gpg_check               安装软件包之前是否坚持gpg  key;
name                            需要安装的软件名称,支持软件组安装;
update_cache                    安装软件前更新缓存;
enablerepo                      指定repo源名称;
skip_broken                     跳过异常软件节点;
state                           #软件包状态,包括:installed、present、latest、absent、removed。

远程卸载安装

# 远程在 10.0.0.6 服务器上安装 httpd 服务
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m yum -a "name=httpd state=installed"

# 远程启动 httpd 服务
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m command -a "systemctl start httpd"
10.211.55.66 | CHANGED | rc=0 >>

# 远程查看http服务进程
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m shell -a "ps -ef |grep httpd"
10.211.55.66 | CHANGED | rc=0 >>
root      9191     1  0 13:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    9192  9191  0 13:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    9193  9191  0 13:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    9194  9191  0 13:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    9195  9191  0 13:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    9196  9191  0 13:38 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root      9453  9448  0 15:59 pts/1    00:00:00 /bin/sh -c ps -ef |grep httpd
root      9455  9453  0 15:59 pts/1    00:00:00 grep httpd

# 停止 httpd 服务
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m command -a "systemctl stop httpd"
10.211.55.66 | CHANGED | rc=0 >>

# 远程卸载 httpd
[root@jenkins ~]# ansible -i /etc/ansible/hosts 10.211.55.66 -m yum -a "name=httpd state=removed"

file模块

模块参数介绍

# Ansible file模块主要用于对文件的创建、删除、修改、权限、属性的维护和管理,File模块使用详解:

# 常用参数介绍
src                    Ansible端源文件或者目录;
follow                 支持link文件拷贝;
force                  覆盖远程主机不一致的内容;
group                  设定远程主机文件夹的组名;
mode                   指定远程主机文件及文件及的权限;
owner                  设定远程主机文件夹的用户名;
path                   目标路径,也可以用dest,name代替;
state                 #状态包括:file、link、directory、hard、touch、absent;
attributes             文件或者目录特殊属性。

创建远程目录

# 在 docker 服务器上 /tmp 目录下面创建一个rivers的目录,名字为 rivers,属主为root
[root@jenkins ~]# ansible docker -m file -a "path=/tmp/rivers state=directory mode=640 owner=root"
10.211.55.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0640", 
    "owner": "root", 
    "path": "/tmp/rivers", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}

# 查看常见的目录
[root@jenkins ~]# ansible docker -m command -a "ls /tmp/rivers"
10.211.55.20 | CHANGED | rc=0 >>

# path表示目录的名称和路径, state=directory表示创建目录

创建远程脚本文件

#在/tmp/script.sh文件
[root@jenkins ~]# ansible docker -m file -a "path=/tmp/script.sh state=touch mode=777"
10.211.55.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/script.sh", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

# path表示目录的名称和路径, state=touch 表示创建文件

cron

cron模块介绍

# Ansible cron模块主要用于添加、删除、更新操作系统Crontab任务计划,Cron模块使用详解:

# 常用参数
name                        任务计划名称;
cron_file                   替换客户端该用户的任务计划的文件;
minute                      分( 0-59 ,* ,*/2 );
hour                        时( 0-23 ,* ,*/2 );
day                         日( 1-31 ,* ,*/2 );
month                       月( 1-12 ,* ,*/2 );
weekday                     周( 0-6 或 1-7 ,* );
job                         任何计划执行的命令,state要等于present;
backup                      是否备份之前的任务计划;
user                        新建任务计划的用户;
state                       指定任务计划present、absent。

创建任务同步时间

# docker 服务器 自动同步 阿里云
[root@jenkins ~]# ansible docker -m cron -a "name=uptime minute=0 hour=2 job='ntpdate ntp.aliyun.com >/dev/null 2>&1'"
10.211.55.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": [
        "None", 
        "uptime"
    ]
}

# 检查定时任务
[root@jenkins ~]# ansible docker -m shell -a "crontab -l"
10.211.55.20 | CHANGED | rc=0 >>
#Ansible: uptime
0 2 * * * ntpdate ntp.aliyun.com >/dev/null 2>&1
[root@jenkins ~]# 

# 如何删除定时任务
# 1 查看当前有的定时任务
[root@jenkins ~]# ansible docker -m shell -a "crontab -l"
10.211.55.20 | CHANGED | rc=0 >>
#Ansible: uptime
0 2 * * * ntpdate ntp.aliyun.com >/dev/null 2>&1

# 2 根据名称删除定时任务
[root@jenkins ~]# ansible docker -m cron -a "name=uptime state=absent"
10.211.55.20 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "envs": [], 
    "jobs": []
}

user模块

模块介绍

# Ansible user模块主要用于操作系统用户、组、权限、密码等操作,user模块使用详解:
system                              默认创建为普通用户,为yes则创建系统用户;
append                              添加一个新的组;
comment                             新增描述信息;
createhome                          给用户创建家目录;
force                               用于删除强制删除用户;
group                               创建用户主组;
groups                              将用户加入组或者附属组添加;
home                                指定用户的家目录;
name                                表示状态,是否create、remove、modify;
password                            指定用户的密码,此处为加密密码;
remove                              删除用户;
shell                               设置用户的shell登录环境;
uid                                 设置用户id;
update_password                     修改用户密码;
state                               用户状态,默认为present表示新建用户。absent表示删除

模块常见用法

# 创建用户
# 在docker 服务器上创建一个普通用户 nidaye。name=用户名
[root@jenkins ~]# ansible docker -m user -a "name=nidaye"
# 创建虚拟用户
[root@jenkins ~]# ansible docker -m user -a "name=apache shell=/sbin/nologin"

[root@jenkins ~]# ansible docker -m shell -a "id nidaye"
10.211.55.20 | CHANGED | rc=0 >>
uid=1000(nidaye) gid=1000(nidaye) 组=1000(nidaye)

# 删除用户
[root@jenkins ~]# ansible docker -m user -a "name=nidaye state=absent force=yes"

service模块

模块介绍

# Ansible service模块主要用于远程客户端各种服务管理,包括启动、停止、重启、重新加载等,service模块使用详解:

# 常用参数
enabled             是否开启启动服务;
name                服务名称;
runlevel                服务启动级别;
arguments           服务命令行参数传递;
state                   服务操作状态,状态包括started, stopped, restarted, reloaded。

模块常见用法

# 重启服务
[root@jenkins ~]# ansible docker -m service -a "name=docker state=restarted"

# 设置服务启动级别
# 远程开机启动nfs服务,设置3,5级别自动启动
root@jenkins ~]# ansible -k all -m service  -a  "name=nfs  enabled=yes  runlevel=3,5"
SSH password: 
[WARNING]: Ignoring "runlevel" as it is not used in "systemd"
[WARNING]: Ignoring "runlevel" as it is not used in "systemd"
[WARNING]: Ignoring "runlevel" as it is not used in "systemd"

synchronize模块

模块介绍

# Ansible synchronize模块主要用于目录、文件同步,基于Rsync命令同步目录,Synchronize模块使用详解:

# 常用参数
compress                        开启压缩,默认为开启;
archive                         是否采用归档模式同步,保证源和目标文件属性一致;
checksum                        是否效验;
dirs                            以非递归的方式传输目录;
links                           同步链接文件;
recursive                       是否递归yes/no;
rsync_opts                      使用rsync 的参数;
copy_links                      同步的时候是否复制连接;
delete                          删除源中没有而目标存在的文件;
src                          源目录及文件;
dest                            目标目录及文件;
dest_port                       目标接受的端口;
rsync_path                      服务的路径,指定 rsync 命令来在远程服务器上运行;
rsync_timeout                   指定rsync操作的IP超时时间;
set_remote_user                 设置远程用户名;
--exclude=.log                  忽略同步.log结尾的文件;
mode                        同步的模式,rsync同步的方式PUSH、PULL,默认都是推送push。

模块常见用法

# 将本地/tmp/目录下载的所有文件同步到docker服务器的/tmp/目录(增量同步)
[root@jenkins ~]# ansible docker -m synchronize -a 'src=/tmp/ dest=/tmp/'

# 完全同步,在末尾加上delete=yes,会强制将docker服务器的/tmp/目录完全同步意味着会删除多余的文件。
[root@jenkins ~]# ansible docker -m synchronize -a 'src=/tmp/ dest=/tmp/ delete=yes'

ansible playbook

playbook -剧本介绍

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。

通过Playbook任务,能够集中管理多个任务,将多个任务关联起来,从而实现更加复杂工作,满足生产环境的各个需求,提高运维人员管理服务器效率。

Playbook剧本的产物YAML文件,类似XML接口(Tomcat)文件,内部有固定语法、参数等,要掌握常用的YAML语法编写,掌握满足运维管理方向的语法即可。

  • 核心元素

Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色

语法格式

Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:

  • 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。
  • 如果项目属于其他项目的子项,其缩进量必须大于父项。
  • 只有空格字符可用于缩进,不允许使用tab键。约定俗成的缩进量一般是一级2个空格。
  • Playbook开头的一行由三个破折号(---)组成,这是文档开始标记。其末尾可能使用三个圆点(...)作为文档结束标记,尽管在实践中这通常会省略。

playbook是一个不同于使用ansible命令行执行方式的模式,功能更强大更灵活。
1、在playbooks 中常见的定义任务:
name: task description #任务描述信息;
module_name: module_args #需要使用的模块名字: 模块参数;
files: 存放需要同步到异地服务器的源码文件及配置文件;
handlers: 当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置文件,handlers ;
meta:角色定义,可留空;
tasks:需要进行的执行的任务;
templates:用于执行lamp安装的模板文件,一般为脚本;
vars:本次安装定义的变量;

playbook是由一个或多个"play"组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。

github上提供了大量的实例供大家参考 https://github.com/ansible/ansible-examples

# 运行 lnmp文件
[root@jenkins ~]# ansible-playbook lnmp.yml

# 检查lnmp 语法
[root@jenkins ~]# ansible-playbook --syntax-check lnmp.yml

playbook常用组件

  • Tatget 定义Playbook的远程主机组
    • 常用参数:
    • hosts 定义远程主机组;
    • user 执行该任务的用户;
    • sudo 设置为yes的时候,执行任务时用root权限;
    • sudo_user 指定sudo的普通用户;
    • connection 默认基于ssh连接客户端;
    • gather_facks 获取远程主机facts基础信息;
  • Variable 定义Playbook时用的变量
    • 常用参数:
    • vars 定义格式,变量名: 变量值;
    • vars_files 指定存放变量的文件;
    • vars_prompt 用户交互模式自定义变量;
    • setup 模块去远程主机的值;
  • Task 定义远程主机上执行的任务列表
    • 常用参数:
    • name 任务名称,即屏幕显示信息;
    • action 定义执行的动作;
    • copy 复制本地文件到远程主机;
    • template 复制本地文件到远程主机,可以引用本地变量;
    • service 定义服务的状态;
  • Handler 当服务的配置文件发生变化时需要进行的操作,比如: 重启服务,重载配置;

Playbook示例

  • 示例一
# 
[root@jenkins playbook]# vim installbak.yaml
---
- hosts: 10.211.55.66
  remote_user: root

  tasks:
    - name: install tools
      yum: name=htop,iftop state=installed
    - name: run ing
      shell: netstat -lntp;
...

# 运行语法检查
[root@jenkins playbook]# ansible-playbook --syntax-check installbak.yaml 

playbook: installbak.yaml

# 执行任务,可以看到我们上面写的name就是每一个任务的名字
[root@jenkins playbook]# ansible-playbook installbak.yaml 

PLAY [10.211.55.66] ********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [10.211.55.66]

TASK [install tools] *******************************************************************************
ok: [10.211.55.66]

TASK [run ing] *************************************************************************************
changed: [10.211.55.66]

PLAY RECAP *****************************************************************************************
10.211.55.66               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 示例二(这里用到了handlers)
---
- hosts: 10.211.55.66
  remote_user: root
  tasks:
    - name: install package
      yum: name=pcre-devel,openssl,openssl-devel,gd-devel,gcc,gcc-c++ state=installed
    - name: echo -e "\033[44;37m 判断是否存在nginx安装目录 \033[0m"
      file: path=/usr/local/nginx stat=directory
      notify:
        - nginx start
        - nginx install
  handlers:
    - name: nginx install
      shell: cd /opt/; wget http://nginx.org/download/nginx-1.20.2.tar.gz;tar xf nginx-1.20.2.tar.gz;
    - name: nginx start
      shell: nginx
...

示例三

  • 使用ansible playbook创建用户
# 使用 user 模块批量创建rivers01、02、03用户
# author rivers
- hosts: 10.211.55.66
  remote_user: root
  tasks:
  - name: Add User list.
    user: name={{ item }} state=present
    with_items:
       - rivers01
       - rivers02
       - rivers03

  - name: check system user
    shell: num= `tail -3 /etc/passwd|grep -c rivers`; if [ $num ge 3 ]; then echo is ok!; fi

ansible 调优

ansible配置文件说明

# Ansible默认配置文件为/etc/ansible/ansible.cfg,配置文件中可以对ansible进行各项参数的调整,包括并发线程、用户、模块路径、配置优化等,如下为Ansible.cfg常用参数详解:

[defaults]                                  通用默认配置段;
inventory      = /etc/ansible/hosts             被控端IP或者DNS列表;
library        = /usr/share/my_modules/         Ansible默认搜寻模块的位置;
remote_tmp     = $HOME/.ansible/tmp       Ansible远程执行临时文件;
pattern        = *                      对所有主机通信;
forks          = 5                      并行进程数;
poll_interval  = 15                         回频率或轮训间隔时间;
sudo_user      = root                       sudo远程执行用户名;
ask_sudo_pass = True                    使用sudo,是否需要输入密码;
ask_pass      = True                        是否需要输入密码;
transport      = smart                      通信机制;
remote_port    = 22                     远程SSH端口;
module_lang    = C                      模块和系统之间通信的语言;
gathering = implicit                        控制默认facts收集(远程系统变量);
roles_path= /etc/ansible/roles              用于playbook搜索Ansible roles;
host_key_checking = False                   检查远程主机密钥;
#sudo_exe = sudo                            sudo远程执行命令;
#sudo_flags = -H                            传递sudo之外的参数;
timeout = 10                                SSH超时时间;
remote_user = root                          远程登陆用户名;
log_path = /var/log/ansible.log                 日志文件存放路径;
module_name = command                   Ansible命令执行默认的模块;
#executable = /bin/sh                       执行的Shell环境,用户Shell模块;
#hash_behaviour = replace                   特定的优先级覆盖变量;
#jinja2_extensions                          允许开启Jinja2拓展模块;
#private_key_file = /path/to/file               私钥文件存储位置;
#display_skipped_hosts = True               显示任何跳过任务的状态;
#system_warnings = True                 禁用系统运行ansible潜在问题警告;
#deprecation_warnings = True                Playbook输出禁用“不建议使用”警告;
#command_warnings = False                   command模块Ansible默认发出警告;
#nocolor = 1                            输出带上颜色区别,开启/关闭:0/1; 
pipelining = False                          开启pipe SSH通道优化;
[accelerate]                                accelerate缓存加速。
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
accelerate_daemon_timeout = 30
accelerate_multi_key = yes

ansible优化配置文件

# 关闭shell 检测密钥
# 在ansible 配置文件中加入以下代码:
host_key_checking = False

# 关闭dns解析
# 使用OpenSSH服务时,默认服务器端配置文件UseDNS=YES状态,该选项会导致服务器根据客户端的IP地址进行DNS PTR反向解析,得到客户端的主机名,然后根据获取到的主机名进行DNS正向A记录查询,并验证该IP是否与原始IP一致。关闭DNS解析
sed  -i  '/^GSSAPI/s/yes/no/g;/UseDNS/d;/Protocol/aUseDNS no' /etc/ssh/sshd_config
/etc/init.d/sshd restart

# ansible 加速
# SSH pipelining是一个加速 Ansible 执行速度的简单方法,SSH pipelining 默认是关闭的,关闭是为了兼容不同的 sudo 配置,主要是requiretty 选项。
如果不使用Sudo建议开启该选项,打开此选项可以减少Ansible 执行没有文件传输时,SSH在被控机器上执行任务的连接数。使用Sudo操作的时候, 必须在所有被管理的主机上将配置文件/etc/sudoers中requiretty选项禁用。
sed    -i    '/^pipelining/s/False/True/g'    /etc/ansible/ansible.cfg
赞(0)
未经允许不得转载:劉大帥 » ansible快速入门

你的评论可能会一针见血! 抢沙发

登录

找回密码

注册