目录
一、ansible 概述运行机制
官网地址
Aasible 基本架构
Ansible 任务执行方式
ansible 具有如下特点
二、安装并配置 Ansible 管理两个节点
环境拓扑
配置 ansible 源
1. Yum配置方法一:(无网络使用)
配置本地源
配置 ansible 本地源:
2.yum源配置方法二:(有网使用)
配置阿里网络源
配置 epel 源
3.安装 ansible
4.配置文件及说明
1.配置执行文件说明
5.定义主机清单 (inventory)
1.基于端口,用户,密码定义主机清单
配置主机清单
执行测试命令
2.基于ssh密钥来访问定义主机清单
配置ssh无密码访问
配置主机清单
执行命令测试
三、ansible 命令参数
1.ansible 命令语法
2.测试 -m 和 -a选项
检查 ansible 被管理节点的cpu 负载 (uptime)
给ansible 被管理节点增加用户
将df 命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中
测试 -m、-u、-k 选项
测试 -b
列出将执行该命令的主机
Ansible是Red Hat公司使用python研发的开源的自动化运维工具,类似于saltstack和Puppet这样老牌的自动化运维工具。
不同的优点在于不需要在节点中安装任何客户端,使用 SSH来和节点进行通信,所以被管理节点具备 SSH服务以及 python即可,就可实现自动化管理,管理节点只需安装 Ansible 工具,以及python,openssl 即可。
小节:
Ansible e是一个部署一群远程主机的工具,通过SSH协议实现远程节点和管理节点之间的通信。管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件,如:paramiko,PyYaml和jinja三个关键组件;
Ansible is Simple IT Automation
ansible 系统由管理节点和被管理节点组成,Ansible 在管理节点将 ansible 模块通 ssh 协议推送到被管理端执行。可以使用 SVN 、GIT 等来管理自定义模块及编排
图中可看到 ansible 由5部分组成
Ansible:核心程序,主程序
Modules:包括 核心模块 和 自定义模块,对被管理主机进行管理工作
Core Modules: ansible 执行任何管理任务,都是由 核心模块完成;Ansible管理主机先调用core Modules中的相关模块,然后指明管理Host Inventory(清单)中的主机,完成管理主机。
Custom Modules:自定义模块,完成 Ansible核心模块无法完成的功能,此模块支持任何语言编写
Plugins:模块功能补充,通过插件来实现记录日志,发送邮件或其他功能。
Connectior Plugins:连接插件,ansible 基于连接插件,通过ssh 协议连接到各个主机。
Host Inventory(清单): 记录由 ansible 管理的主机信息,包括端口、密码、IP等。
Playbooks:剧本 ,YAML格式文件,多个任务在一个文件中,定义需要调用某些模块来完成的功能定义,实现自动化部署文件。
ansible执行自动化任务,分为两种执行方式:
1.ad-hoc:即 ansible 命令,命令行界面,单条命令的批量执行,称为 ad-hoc,这种方式,主要用来进行功能测试,或者是简单的应用部署
2. playbook:剧本方式,把对远程主机执行的任何、操作,提前写到剧本文件当中,把多个想要执行的任务放到一个playbook中,多个任务在事务逻辑上最好是有上下联系的,通过多个任务可以完成一个总体的目标,剧本的方式使用于大型自动化部署应用。
Ad-Hoc、Ansible-playbooks,这两种方式没有本质的区别,只是应用的方式不同。
部署简单,在管理主机上部署 ansible 环境,被管理端只需要安装 ssh 和 python 2.5以上版本,这个对于类unix系统来说相当与无需配置。
1.部署简单,只需在管理端部署 ansible 环境,被管理端无需做任何操作
2.默认使用 SSH 协议对设备进行管理
3.易读的语法,基于 yaml 语法编写 playbook
4.模块化设计,调用特定的模块来完成特定的任务
5.基于 Python 语言实现,由Paramiko(python的一个可并发连接ssh主机功能库),PyYAML 和Jinja2(模板化)三个关键模块实现。
6.支持playbook剧本,连续任务按先后设置顺序完成剧本文件中的内容
7.幂等性,一个任务执行一遍和执行n遍效果一样,不会因为重复执行带来意外情况。意味着在同一台服务器上多次执行同一个playbook是安全的。
8.对云环境中都有很好的支持
主机 | IP | 角色 | 安装软件 |
Ansible | 192.168.1.11 | Ansible 管理服务器 | Ansible |
Clent 1 | 192.168.1.12 | Clent | |
Clent 2 | 192.168.1.13 | Clent |
注: 运行 ansible 时,需关闭 selinux,或者让 selinux 放行Ansible的操作
vim /etc/yum.repos.d/centos7.repo
[centos7]
name=centos7
baseurl=file:///mnt
enabled=1
gpgcheck=0
mount /dev/sr0 /mnt
vim /etc/yum.repos.d/ansible.repo
[ansible]
name=ansible
baseurl=file:///root/ansible
enabled=1
gpgcheck=0
最后上传软件包,解压
地址:http://mirrors.aliyun.com
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
Ansible软件默认不在centos的光盘yum仓库中,因此我们需要配置 epel 仓库
yum install -y epel-release
注:Centos-7.repo提供了centos7官方发行版提供的软件包,epel源提供除了官方发行版以外的额外的软件包,适用于RHEL、CentOS和Scientific Linux。
对于安装Ansible来说,我们只需要在管理节点上安装即可,被管理节点除了保证有python和开启了sshd服务以外,不需要任何操作。
yum install -y ansible
通过 rpm -ql ansible 可以看到有很多文件,主要是配置文件和和可执行文件,以及所依赖的python库文件。
ansible 主配置文件:/etc/ansible/ansible.cfg
这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改
主机清单文件:/etc/ansible/hosts
这个配置文件就是默认主机清单配置文件,可通过ansible.cfg重新定义的
清单文件保存着,对管理的主机的信息。
如:定义一组主机 [web_servers] 其中不能包含特殊字符下划线可以,其他特殊字符都不可以使用
除了以上两个重要的配置文件还有三个重要的可执行文件分别是:
ansible 主执行程序,一般用于命令行下执行。
ansible-playbook 执行 playbook(剧本)中的任务
ansible-doc 获取各模块的帮助信息
在前面了解了ansible的两种运行方式后,如果想要进行测试,需要将被管理的主机添加到/etc/ansible/hosts里
ansible基于ssh连接指定的远程主机,可以写端口,用户,密码
vim /etc/ansible/hosts
文件 /etc/ansible/hosts 维护着Ansible中被管理服务器的清单。书写格式可以参 考/etc/ansible/hosts文件的注释说明。在文件最后追加以下内容
[web_server]
192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.1.13 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
中括号里的web_servers是组名,组名下方为该组包括的主机,每行定义一个主机,组名需唯一,每个组里的主机一般运行着同一个服务,而组中的一台主机则可以同时属于几个不同的组。
ansible_ssh_port:指定ssh端口(如果是默认端口22,此参数可以省略)
ansible_ssh_user:指定 ssh 用户
ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)
ansible_sudo_pass:指明 sudo 时候的密码
ansible -i /etc/ansible/hosts web_server -m ping
-i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
-m # 指定使用的ping模块 默认使用的是
web_server #在主机清单文件中定义的组名
第一次ssh登录一台机器都需要在ansible服务器上保存目标主机的fingerprint指纹,也就是我们看到的这个页面
解决方法:
方法1:
只需简单的配置下ansible 服务即可,通过ansible.cfg进行配置调整,一般情况下,ansible配置文件存放在/etc/ansible/ansible.cfg
注:/etc/ansible/ansible.cfg:ansible的主配置文件
vim /etc/ansible/ansible.cfg
意思是将公钥认证检查关闭,这样就可以正常访问节点了
注:这里使用了 -m 参数,采用 ping 模块进行检测目标主机的存活性,返回值是 pong 则是正常
方法2:
手动连接一下 /etc/anaible/hosts 主机清单中的主机,这样就可以在ansible 服务器保存目标主机的fingerprint指纹。后期可以正常连接了
ssh [email protected]
ansible -i /etc/ansible/hosts web_servers -m ping
如果对/etc/ansible/hosts中的对所有主机执行操作,可执行:
ansible all -m ping
我们可以为 /etc/ansible/hosts中的主机起别名,方便我们识别主机
[web_server]
nginx01 ansible_ssh_host=192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
nginx02 ansible_ssh_host=192.168.1.13 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
ansible_ssh_host:指定将要连接的远程主机名或者IP
ansible_connection:与主机的连接类型,如不修改默认使用ssh
再次测试,由刚才的IP地址,变成了现在的主机别名
还要注意一件事情,在Inventory中定义的主机,在Ansible执行时,将会全部变成运行时的变量,变量名为等号前的值,变量值为等号后的值,例如ansible_ssh_host=192.168.1.128,其中ansible_ssh_host就是变量名,192.168.1.128就是变量值
一般来说,在/etc/ansible/hosts中使用明文密码不安全,所以增加主机无密码访问(基于密钥对验证)。在Ansible服务端生成密钥,并且复制公钥到节点中。
复制公钥到节点中
for ip in 12 13 ; do ssh-copy-id [email protected].$ip ; done
vim /etc/ansible/hosts
修改web-server为以下内容
[web_server]
nginx01 ansible_ssh_host=192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root
nginx02 ansible_ssh_host=192.168.1.13 ansible_ssh_port=22 ansible_ssh_user=root
如果ssh监听默认端口,主机清单文件也可以按下面的方式写,默认执行使用root用户进行连接远程主机
[web_servers]
nginx01 ansible_ssh_host=192.168.1.12
nginx02 ansible_ssh_host=192.168.1.13
ping 模块检查网络连通性
ansible -i /etc/ansible/hosts web_server -m ping
ansible web_server -m ping
不指定配置文件,默认使用/etc/ansible/hosts文件
ansible --help #查看帮助
Usage: ansible
例如:ansible [组名] [-i 主机名称] [-m 模块名称] [-a 模块参数]
ansible 详细参数:
-v #详细模式,命令执行成功,输出详细结果 (-vv -vvv -vvvv)
- i #指定清单文件(hosts)路径,不指定默认路径在/etc/ansible/hosts
-m #指定使用的module(模块),默认使用 command模块
- a #指定module 模块参数
- u #ssh连接的用户名,默认用root,ansible.cfg中可以配置
- k #提示输入 ssh 登录密码,当使用密码验证的时候使用
-s,--sudo:远程执行命令时使用 sudo 方式,相当于linux 系统下的 sudo命令
-U SUDO_USERNAME,sudo到哪个用户,默认为root
注意:上述的-s和-U选项在新版中已经失效。新版本选项如下两项:
-s,--sudo 被改成 -b,--become
-U,--sudo-user被改成 --become-user
-K --ask-become-pass:使用 --become 或者 --become-user 时使用的密码认证(即提示输入sudo密码,当不是 NOPASSWD模式时使用)
-C # 用于测试 ,不会真正的执行
-f FORKS, --forks=FORKS:并行线程数量,当有数量巨大的机器需要配置,可以使用高并发线程,默认是5个。
--list-host:只打印有哪些主机会执行这个命令,不会实际执行
ansible-doc 详细参数:
ansible-doc -l 列出所有模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s,
ansible web_server -m command -a "uptime"
说明:-m 指定ansible 要调用的模块;-a 指定具体命令, 省略-m选项,默认使用command模块
也可以把主机清单组名写到最后,这样方便阅读命令
ansible -a "uptime" web_server
ansible -m command -a "useradd user1" web_server
ansible -m command -a"grep user1 /etc/passwd" web_server
ansible web_server -m shell -a "echo "user1:123456" | chpasswd"
ansible -m command -a "df -hT" web_server > /tmp/command-output.txt
修改/etc/ansible/hosts文件,内容如下
[web_server]
192.168.1.12
192.168.1.13
-m 指定ping 模块,以user1用户执行 ping存活检测,如果不指定用户,在远程机器上默认是以root用户执行
ansible 192.168.1.12 -m ping -u user1 -k
SSH password: #此处写user1密码
192.168.1.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
注意:IP需要在/etc/ansible/hosts提前里面配置,如果想在多个主机测试,这里可以改成all或组名,当然,前提是需要在hosts文件配置好。
以user1用户sudo到root执行ping存活检测。这种方式需要在远程主机的/etc/sudoers文件中配置user1用户,如果没有配置NOPASSWD,则需要加上-K选项
远程主机/etc/sudoers文件添加如下:
visudo
user1 ALL=(root)NOPASSWD: ALL
ansible 192.168.1.12 -m ping -u user1 -k -b
SSH password: #此处输入user1 密码
192.168.1.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
把上述的user1 ALL=(root)NOPASSWD: ALL换成user1 ALL=(root) ALL,再次执行
发现报错了,这个时候由于远程机器的user1用户不能免密到root用户,所以,执行方式改成如下,加-K(大写)选项
ansible 192.168.1.12 -m ping -u user1 -k -b -K
ansible all -a "ls" --list-hosts
总结:ansible指定要执行操作的被管理节点或组
1.指定执行器
注意:ip需要在/etc/ansible/hosts提前里面配置
#指定 192.168.1.*/24段的所有机器
ansible 192.168.1.* -m ping
#指定12、 13两台机器
ansible 192.168.1.12:192.168.1.13 -m ping
2.使用分组过滤
指定[web_server]组
#指定A和B两个组
A:B
#指定在A组但不在B组
A:\!B
#指定同时在A组和B组
A:\&B