1.Ansible自动化管理工具

1.Ansible基本概述

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

2.Ansible的功能

1)批量执行远程命令,可以对N多台主机同时进行命令的执行
2)批量配置软件服务,可以进行自动化的方式配置和管理服务。
3)实现软件开发功能,jumpserver底层使用ansble来实现的自动化管理0
4)编排高级的IT任务,Ansible的playbook是一门编程语言,可以用来描绘一套IT架构。

3.Ansible的特点

1.容易学习,无代理模式,不像saltstack既要学服务端又要学习客户端,还要学习服务端与客户端之间的通讯协议
2.操作灵活,体现在Ansible有较多的模块,提供了丰富的功能,playbook则提供了类似于编程语言的复杂功能
3.简单易用,体现在Ansible —个命令可以完成很多事情
4.安全可靠,因为Ansible使用了SSH协议进行通汛,既稳定又安全
5.可移植性高,可以将写好的playbook拷贝至任意机器进行执行

4.Ansible 基础架构

控制端 被控端 inventory ad-hoc playbook 连接协议
1.Ansible自动化管理工具_第1张图片

5.Ansible的安全配置

2.1.Ansible安装

外网地址 内网地址 角色
10.0.0.61 172.16.1.61 Ansible控制端
10.0.0.7 172.16.1.7 Ansible被控端
10.0.0.8 172.16.1.8 Ansible被控端

1.先安装epel源(提供最新的ansible)
[root@cheng ~]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2.安装Ansible

1.通过yum进行安装
[root@manager ~]# yum install ansible -y

2.查看ansible的版本
[root@manager ~]# ansible --version
ansible 2.8.5
  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, Jun 20 2019, 20:27:34) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

3.ansible的配置文件,配置文件可以随意放,但有查找顺序

$ANSIBLE_CONFIG
ansible.cfg                 #当前目录下面查找
.ansible.cfg                #当前用户的家目录下查找
/etc/ansible/ansible.cfg

[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

4.ansible 优先级验证

[root@manager ~]# export
ANSIBLE_CONFIG="/tmp/ansible.cfg"
[root@manager ~]# touch /tmp/ansible.cfg

[root@manager ~]# mkdir /project1
[root@manager ~]# cd /project1/
[root@manager project1]# touch ansible.cfg
[root@manager project2]# ansible --version
ansible 2.8.5
config file = /project1/ansible.cfg

[root@manager /]# mkdir /project2
[root@manager /]# cd /project2/
[root@manager project2]# touch ansible.cfg
[root@manager project1]# ansible --version
ansible 2.8.5
config file = /project2/ansible.cfg

[root@manager tmp]# touch ~/.ansible.cfg
[root@manager tmp]# ansible --version
ansible 2.8.5
config file = /root/.ansible.cfg

6.Ansible Ineventory主机清单

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

[root@manager project1]# cat hosts
#方式一、主机+端口+密码
[webservers]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'

#方式二、主机+端口+密码
[webservers]
web[1:2].cheng ansible_ssh_pass='123456'

#方式三、主机+端口+密码
[webservers]
web[1:2].cheng
[webservers:vars]
ansible_ssh_pass='123456'

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

1.先创建公钥和私钥
[root@manager project1]# ssh-keygen -C [email protected]
2.下发公钥至被控端
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub
[email protected]
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub
[email protected]

#方式一、主机+端口+密钥
[root@manager ~]# cat hosts
[webservers]
172.16.1.7
172.16.1.8

#方式二、别名+主机+端口+密钥
[webservers]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8 ansible_ssh_port=22

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

[lbservers] #定义lbservers组
172.16.1.5
172.16.1.6
[webservers] #定义webserver组
172.16.1.7
172.16.1.8
[servers:children]  #定义servers组包括两个子组
[lbservers,webserver]
lbservers
webserver

[root@manager project1]# ansible webservers --list-hosts -i hosts
hosts (2):
  172.16.1.7
  172.16.1.8
  
PS:如果控制端和被控制端第一次通讯,需要先添加指纹信息,那如果机器特别多少的情况下怎么办?
仅需开启ansible中的 host_key_checking = False

7.Ansible Ad-Hoc

1.常用模块

1.Ansible自动化管理工具_第2张图片

command         #执行命令  默认 不支持管道
shell           #执行命令 支持管道
yum_reposity    #yum仓库配置
yum             #yum安装软件
get_url         #和linux的wget一致
copy            #拷贝配置文件
service|systemd #启动服务
user            #属主
group           #属组
file            #创建目录 创建文件 递归授权
mount           #挂载
cron            #定时任务
firewalld       #防火墙
selinux         #selinux

2.使用过程中需要先了解ansible-doc帮助手册

[root@manager project1]# ansible-doc -l        # 查看所有模块说明
[root@manager project1]# ansible-doc copy      # 表示指定模块方法
[root@manager project1]# ansible-doc -s copy   # 表示指定模块参数

3.command默认执行bash命令模块,模块不支持重定向或管道

ansible webservers -a "ps axu|grep nginx" -i hosts #不支持管道(简单命令)

4.shell模块,如果需要一些管道操作,则使用shell

ansible webservers -m shell -a "ps axu|grep nginx" -i hosts #支持管道

5.yum安装软件模块

yum:
state:
    present 安装
    absent 卸载
    latest 最新
    enablerepo #指定使用按个仓库
    disablerepo #排除使用哪个仓库

1.安装最新的httpd服务
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=latest disablerepo=webtatic-php" -i hosts

2.移除httpd服务
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=absent disablerepo=webtatic-php" -i hosts

3.安装httpd指定从按个仓库安装
- name: install the latest version of Apache from
the testing repo
[root@manager project1]# ansible webservers -m yum -a "name=httpd state=latest enablerepo=testing" -i hosts

4.通过URL方式进行安装
[root@manager project1]# ansible webservers -m yum -a "name=https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.0-1.el7.x86_64.rpm state=present disablerepo=webtatic-php" -i hosts

- name: install nginx rpm from a local file (软件包必须在被控端主机)
5.在本地做软件升级操作
[root@manager project1]# ansible webservers -m yum -a "name=/root/zabbix-agent-4.0.0-2.el7.x86_64.rpm state=present disablerepo=webtatic-php" -i hosts

6.copy文件拷贝模块

copy:
    src     #本地路径,可以是相对,可以是绝对
    dest    #目标位置
    owner   #属主
    group   #属组
    mode    #权限
    backup  #备份

1.拷贝文件至被控节点【前提必须在控制端准备好对应的文件】
[root@manager project1]# ansible webservers -m copy -a "src=./file/ansible.cheng.com.conf dest=/etc/nginx/conf.d/ansible.cheng.com.conf owner=root group=root mode=644" -i hosts

2.对远端已有文件进行备份,按照时间信息备份【控制端可作修改】
[root@manager project1]# ansible webservers -m copy -a "src=./file/ansible.cheng.com.conf dest=/etc/nginx/conf.d/ansible.cheng.com.conf owner=root group=root mode=644 backup=yes" -i hosts

3.向被控端主机写入数据,并且会覆盖远端文件内原有数据信息
[root@manager project1]# ansible webservers -m copy -a "content='hello word' dest=/tmp/test.html" -i hosts

在这里插入图片描述

7.ansible管理服务的启动与停止,使用service、systemd

state:
    started         #启动
    stopped         #停止
    restarted       #重启
    reloaded        #重载
    enabled     #是否开机自启
        yes     #是
        no      #否

1.启动nginx服务并加入开机自启
[root@manager project1]# ansible webservers -m systemd -a "name=nginx state=restarted enabled=yes" -i hosts

2.停止http服务
[root@manager project1]# ansible webservers -m systemd -a "name=httpd state=stopped" -i hosts

8.file文件创建模块

1.创建 /code/ansible
path:         #指定远程主机目录或文件
recurse:      #递归授权  yes|no
state:        #状态
    directory       #在远端创建目录
    touch           #在远端创建文件
    link            #创建链接文件
    absent          #表示删除文件或目录
    mode            #设置文件或目录权限
    owner           #设置文件或目录属主
    group           #设置文件或目录属组

2.准备站点
[root@manager project1]# ansible webservers -m file -a "path=/code/ansible state=directory mode=755 owner=www group=www" -i hosts

3.准备站点代码【前提在控制端准备index.html文件】
[root@manager project1]# ansible webservers -m copy -a "src=./file/index.html dest=/code/ansible/index.html owner=www group=www mode=644" -i hosts

9.group组模块、user模块

#group  整数int  小数 flot dasdsa str  真|假 bool
#user
name        #名称
uid         #uid
group       #组名或gid
create_home #是否创建家目录
system      #是否作为系统组
shell       #指定登录shell
state
present
absent
remove
groups
append
password    #给用户添加密码(记得单引号

1.创建gid为666的www组
[root@manager project1]# ansible webservers -m group -a "name=www gid=666 state=present" -i hosts

2.程序使用  www  666 666 /sbin/nologin  不创建家目录/home
[root@manager project1]# ansible webservers -m user -a "name=www uid=666 group=666 create_home=no shell=/sbin/nologin state=present" -i hosts

3.正常用户  xiang 1000 1000 /bin/bash  /home/xiang
[root@manager project1]# ansible webservers -m user -a "name=xiang" -i hosts

4.移除用户xiang,并删除家目录所有内容
[root@manager project1]# ansible webservers -m user -a "name=xiang state=absent remove=yes" -i hosts

5.创建 other用户.有两个附加组root bin,创建家目录,指定登录shell,设定密码123
    5.1将明文密码进行hash加密,然后进行用户创建
[root@manager project1]# ansible all -i localhost, -m debug -a "msg={{ '123'| password_hash('sha512', 'mysecretsalt') }}"
localhost | SUCCESS => {
    "msg": "$6$mysecretsalt$gIIYs0Xgc7sSQkH.zKaz8/AfaMomYzR1QZYtccwmJcUt8VpLq4D055UCCX4MlwgePOP80ZRwhppvBF72RIAVi/"
}
    5.2创建
[root@manager project1]# ansible webservers -m user -a 'name=other groups='root,bin' create_home=yes shell=/bin/bash password="$6$mysecretsalt$gIIYs0Xgc7sSQkH.zKaz8/AfaMomYzR1QZYtccwmJcUt8VpLq4D055UCCX4MlwgePOP80ZRwhppvBF72RIAVi/"' -i hosts

10.mount挂载模块

1.提前准备好nfs服务端【web进行测试】
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/zrlog 172.16.1.0/24
/data/zh   172.16.1.0/24
/data/edu  172.16.1.0/24

2.用管理端操作被控端,让被控端挂载nfs存储数据
state:
    present     #写入/etc/fstab【开机挂载,仅将挂载配置写入/etc/fstab】
    absent      #卸载/etc/fstab【卸载设备,会清理/etc/fstab写入的配置】
    mounted     #临时挂载【挂载设备,并将配置写入/etc/fstab】
    unmounted   #卸载当前挂载【卸载设备,不会清除/etc/fstab写入的配置】

3.挂载过程中,如果目录不存在,则会创建该目录
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=mounted" -i hosts

4.卸载当前挂载的
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=unmounted" -i hosts

5.卸载/etc/fstab
[root@manager project1]# ansible webservers -m mount -a "src=172.16.1.31:/data/word path=/test_wordpress fstype=nfs opts=defaults state=absent" -i hosts

11.crond定时任务模块

minute  #分
hour    #时
day     #日
month   #月
week    #周
job     #写具体执行的任务【执行+脚本路径】

1.使用ansible添加一条定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test_jop minute=00 hour=02 job="/bin/bash /server/scripts/client_data_server.sh && >/dev/null/"' -i hosts

[root@web01 ~]# crontab -l
#Ansible: test_jop
00 02 * * * /bin/bash /server/scripts/client_data_server.sh && >/dev/null/

2.使用ansible添加每分钟执行的定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test job="/bin/bash /server/scripts/test.sh &> /dev/null"' -i hosts

[root@web01 ~]# crontab -l
#Ansible: test
* * * * * /bin/bash /server/scripts/test.sh &> /dev/null

3.删除test定时任务
[root@manager project1]# ansible webservers -m cron -a 'name=test job="/bin/bash /server/scripts/test.sh &> /dev/null" state=absent' -i hosts

12.Firewalld模块

firewalld:
service             #指定开放或关闭的服务名称
port                #指定开放或关闭的端口
masquerade          #开启地址伪装
immediate           #临时生效
permanent           #是否添加永久生效
state               #开启或是关闭

zone                #指定配置某个区域
rich_rule           #配置富规则
source              #指定来源IP

1.启动firewalld防火墙
[root@manager project1]# ansible webservers -m systemd -a "name=firewalld state=started" -i hosts

2.开放http服务
[root@manager project1]# ansible webservers -m firewalld -a "service=http state=enabled" -i hosts

3.开放8888端口
[root@manager project1]# ansible webservers -m firewalld -a "port=8888/tcp state=enabled" -i hosts

4.只允许172.16.1.31网段
[root@manager project1]# ansible webservers -m firewalld -a "source=172.16.1.31/32 zone=trusted state=enabled permanent=no" -i hosts

ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1/32 service name=http accept" state=enabled' -i hosts


5.使用端口方式  2222
[root@manager project1]# ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=10.0.0.1/32 port port="2222" protocol=tcp accept" state=enabled' -i hosts

13.selinux模块

1.关闭selinux
[root@manager project1]# ansible webservers -m selinux -a "state=disabled" -i hosts

2.官方语法:
- name: Disable SELinux
  selinux:
    state: disabled

14.get_url文件下载模块

url         #文件在网络上的具体位置
dest        #下载到被控端的哪个目录下
checksum    #校验(md5  sha256)

1.通过get_url下载文件或者软件
[root@manager project1]# ansible webservers -m get_url -a "url=https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/dejavu-serif-fonts-2.35-6.el8.noarch.rpm dest=/tmp mode=777" -i hosts

2.下载一个文件前先进行md5校验,通过则下载,不通过则失败
[root@manager project1]# wget https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/ed-1.14.2-4.el8.x86_64.rpm
[root@manager project1]# md5sum ed-1.14.2-4.el8.x86_64.rpm 
[root@manager project1]# ansible webservers -m get_url -a "url=https://mirrors.tuna.tsinghua.edu.cn/centos/8.0.1905/BaseOS/x86_64/os/Packages/ed-1.14.2-4.el8.x86_64.rpm dest=/tmp mode=777 checksum=md5:7f0d0501be51652645704f3f551cbdba" -i hosts

15.yum_repository模块

yum_repository模块可以管理远程主机上的yum仓库。
模块参数

参数 说明
name 必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID
baseurl 设置yum仓库的baseurl
description 设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容。
file 设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为".repo"配置文件的文件名前缀,同一个'.repo'配置文件中可以存在多个yum源
enabled 设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。
gpgcheck 设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能。
gpgcakey 当gpgcheck参数设置为yes时,需要使用此参数指定验证包所需的公钥
state 默认值为present,当值设置为absent时,表示删除对应的yum源
1.自定义下载源并设置仓库的名称【在被控主机上设置ID为aliEpel的yum源,
   仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo】

[root@manager project1]# ansible webservers -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=http://mirrors.aliyun.com/epel/7/$basearch' -i hosts
172.16.1.8 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "repo": "aliEpel", 
    "state": "present"
}
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "repo": "aliEpel", 
    "state": "present"
}

2.检验下载的阿里源

[root@manager project1]# ansible webservers -a "ls /etc/yum.repos.d/" -i hosts
172.16.1.8 | CHANGED | rc=0 >>
aliEpel.repo
CentOS-Base.repo
epel.repo
nginx.repo
php.repo

172.16.1.7 | CHANGED | rc=0 >>
aliEpel.repo
CentOS-Base.repo
epel.repo
nginx.repo
php.repo

3.删除/etc/yum.repos.d文件中的aliEpel源

[root@manager project1]# ansible webservers -m yum_repository -a "name=aliEpel file=aliEpel state=absent" -i hosts
172.16.1.7 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "repo": "aliEpel", 
    "state": "absent"
}
172.16.1.8 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "repo": "aliEpel", 
    "state": "absent"
}

你可能感兴趣的:(1.Ansible自动化管理工具)