1.ansible 概述和运行机制
1.1 ansible 概述
Ansible 是一款为类 Unix 系统开发的自由开源的配置和自动化工具。它用 Python 写成,类似于 saltstack 和 Puppet。(集成化工具)。但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用 SSH 来和节 点进行通信。Ansible 基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使 用 YMAL 及 Jinja2 模板语言,更强的远程命令执行操作。
1.2 ansiblle 具有如下特点:
1、部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作;
2、默认使用 SSH 协议对设备进行管理;
3、主从集中化管理;
4、配置简单、功能强大、扩展性强;
5、支持 API 及自定义模块,可通过 Python 轻松扩展;
6、通过 Playbooks 来定制强大的配置、状态管理
7、对云计算平台、大数据都有很好的支持;
1.3 Ansible 工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以 使用 SVN 等来管理自定义模块及编排。
由上面的图可以看到 Ansible 的组成由 5 个部分组成:
Ansible : ansible 核心
Modules : 包括 Ansible 自带的核心模块及自定义模块
Plugins : 完成模块功能的补充,包括连接插件、邮件插件等
Playbooks : 剧本;定义 Ansible 多任务配置文件,由 Ansible 自动执行
Inventory : 定义 Ansible 管理主机的清单 [ˈɪnvəntri] 清单
connection Plugins:可以理解为ssh
2.实战-安装并配置 Ansible
2.1初始化环境
主机名: IP 地址: 角色:
djw1.cn 172.16.254.182 控制端
djw2.cn 172.16.254.186 被控端
djw3.cn 172.16.254.188 被控端
2.2相关环境初始化准备
[root@djw1 ~]# useradd -d /home/djw -m djw ;echo "123456" |passwd --stdin djw
[root@djw2 ~]# useradd -d /home/djw -m djw ;echo "123456" |passwd --stdin djw
[root@djw3 ~]# useradd -d /home/djw -m djw ;echo "123456" |passwd --stdin djw
[root@djw1 ~]# echo "djw ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
[root@djw3 ~]# echo "djw ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
[root@djw2 ~]# echo "djw ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
[root@djw1 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.254.182 djw1.cn djw1
172.16.254.186 djw2.cn djw2
172.16.254.188 djw3.cn djw3
[djw@djw1 ~]$ ssh-keygen
[djw@djw1 ~]$ ssh-copy-id -i .ssh/id_rsa.pub djw@djw1.cn
[djw@djw1 ~]$ ssh-copy-id -i .ssh/id_rsa.pub djw@djw2.cn
[djw@djw1 ~]$ ssh-copy-id -i .ssh/id_rsa.pub djw@djw3.cn
2.3安装ansible
Ansible 仓库默认不在 yum 仓库中,因此我们需要使用下面的命令启用 epel 仓库。
[root@djw1 ~]# yum install epel-release -y
[root@djw1 ~]# yum install -y ansible
安装完成后,检查 ansible 版本:
[root@djw1 ~]# ansible --version
ansible 2.9.21
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Nov 21 2019, 19:31:34) [GCC 8.3.1 20190507 (Red Hat 8.3.1-4)]
2.4 ansible的配置
Ansible 的配置文件存在优先级问题,默认状态下会使用/etc/ansible/ansible.cfg具体优先级关系 如下:
最高优先级:
当前目录下
./ansible.cfg
用户家目录,如果在当前目录下未找到配置文件则查找用户家目录是否存在配置文件。
~/.ansible.cfg
以上位置找不到配置文件就会选择默认值
/etc/ansible/ansible.cfg
需要说明的是 ansible 并没有服务的概念,修改配置文件后立即生效。
2.4.1创建第一个ansible
[root@djw1 ~]# mkdir djw
[root@djw1 ~]# cd djw/
[root@djw1 djw]# vim ansible.cfg
[default]
inventory = ./hosts
[root@djw1 djw]# vim hosts
[gdjw]
djw2.cn
djw3.cn
[djw@djw1 djw]$ ansible all --list
hosts (2):
djw2.cn
djw3.cn
[djw@djw1 djw]$ ansible gdjw --list
hosts (2):
djw2.cn
djw3.cn
使用 ping 模块检测节点是否在线。这里的 ping 命令不是我们 ansible 服务器去 ping 每一台主机, 是通过 ping 模块让列表中的机器 ping 服务端。-m 参数执行模块
[djw@djw1 djw]$ ansible all -m ping
djw3.cn | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
djw2.cn | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
3.ansible 基础命令介绍以及模块操作
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数
3.1ansible 用户提权操作
我们使用 become 进行提权操作。当然所有的提权都是我们前面配置好的 sudo 权限。
[djw@djw1 djw]$ ansible all -m command -a "id"
修改配置文件进行提权操作,可以看到都为root了。
[djw@djw1 djw]$ vim ansible.cfg
3.2ansible 模块操作
shell 模块:使用 shell 模块,在远程命令通过/bin/sh 来执行;所以,我们在终端输入的各种命 令方式,都可以使用。
[djw@djw1 djw]$ ansible all -m shell -a 'ps -aux|grep sshd'
scripts 模块也就是脚本模块,可以远程执行 ansible 服务器上的脚本。
[xuegod@xuegod63 xuegod]$ vim net.sh
#!/bin/bash
date
hostname
[xuegod@xuegod63 xuegod]$ ansible all -m script -a "net.sh"
copy 模块:实现主控端向目标主机拷贝文件,类似 scp 功能
把 ansible 主机上的/etc/hosts 文件复制到所有节点中
[djw@djw1 djw]$ ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts'
file 模块设置文件属性。
[djw@djw1 djw]$ ansible all -m file -a 'dest=/home/djw/sss.txt state=touch owner=root group=root mode=777'
验证:[djw@djw1 djw]$ ansible all -m shell -a 'ls -l /home/djw/'
get_url 模块实现远程主机下载指定 url 到本地,支持 sha256sum 文件校验。
[xuegod@xuegod63 xuegod]$ ansible all -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
如果 force=yyum 模块 linux 平台软件包管理es,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如 果一样,就不下载了。
yum 模块 linux 平台软件包管理
name 参数:必须参数,用于指定需要管理的软件包,比如 nginx。
state 参数:用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present, 其他可用值有 installed、latest、absent、removed,其中 installed 与 present 等效,latest 表示 安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。
[djw@djw1 djw]$ ansible all -m yum -a 'name=httpd state=lastest'
cron 模块远程主机 crontab 配置。
例如:增加每 30 分钟执行 ls /tmp
[djw@djw1 djw]$ ansible all -m cron -a "name='ls dir' minute='*/30' job='ls /tmp'"
验证:[djw@djw1 djw]$ ansible all -m shell -a 'crontab -l'
计划任务有一个需要注意的问题就是参数值如果存在空格需要使用单引号进行定界,
service 模块远程主机系统服务管理。
例如:远程启动 Apache 服务
[xuegod@xuegod63 xuegod]$ ansible all -m service -a "name=httpd state=restarted"
[djw@djw1 djw]$ ansible all -m shell -a 'systemctl status httpd'
user 模块远程主机用户管理
使用 user 模块设置密码存在一个问题,必须使用加密后的密码进行设置。这里先不讲命令行中怎么 设置密码,因为明文密码的使用存在安全隐患,后期我们通过 ansible-vault 对密码进行加密来解决安全 问题。
[djw@djw1 djw]$ ansible all -m user -a 'name=mk state=present uid=1080 home=/home/mk'
[djw@djw1 djw]$ ansible all -a "id mk"
后续查看文档:(扩展)
1.指定inventory的两种方式(用于动态主机清单中, -i参数脚本)
2.vim ~/.vimrc set ts=2 ai
3.remote_user:xuegod