一、Ansible简介
Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于Chef和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。
网址:https://www.ansible.com/
二、Ansible安装
(一)、安装epel源
[root@localhost ~]# yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
---清空yum缓存&安装ansible
[root@localhost ~]# yum clean all && yum install ansible -y
(二)安装ansible-tower
1、下载安装包:
[root@localhost ~]# wget http://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz
2、解压
[root@localhost ~]# tar -xf ansible-tower-setup-latest.tar.gz -C /usr/local/
3、修改配置
[root@localhost ~]# vi /usr/local/ansible-tower-setup-3.4.2-1/inventory
[tower]
localhost ansible_connection=local
[database]
[all:vars]
#### (1)配置管理员的密码:
admin_password='houjianjun'
pg_host=''
pg_port=''
pg_database='awx'
#### (2)配置postgresql的密码:
pg_username='houjianjun'
pg_password='houjianjun'
rabbitmq_username=tower
#### (3)配置rabbitmq的密码:
rabbitmq_password='houjianjun'
rabbitmq_cookie=cookiemonster
5、安装Tower:
[root@localhost ~]# /usr/local/ansible-tower-setup-3.4.2-1/setup.sh
常见错误:
1、fatal: [localhost]: FAILED! => {"changed": false, "msg": "CentOS 7.3.1611 is not a supported OS for a Tower installation. Supported OSes include Red Hat Enterp rise Linux 7.4+, CentOS 7.4+, or Ubuntu 16.04."}
解决:
升级7.4+
[root@localhost ~]# yum clean all
[root@localhost ~]# yum update
[root@localhost ~]# cat /etc/redhat-release
2、fatal: [localhost]: FAILED! => {"changed": false, "msg": "This machine does not have sufficient RAM to run Ansible Tower."}
解决:机器内存不足,增加内存
3、fatal: [localhost]: FAILED! => {"changed": false, "msg": "file not found: /var/l ib/awx/.tower_version"}
解决:
6、测试访问:
7、修改web界面登录密码
[root@localhost ~]# awx-manage changepassword admin
8、导入许可证
申请证书:
此时已经申请成功licenses。进入你邮箱查看就好了
!导入许可证](https://upload-images.jianshu.io/upload_images/14929498-7c370a25a37db58a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Organization 组织管理:
导航栏介绍:
viewes
Dashboard 仪表盘展示信息的
Jobs 跑过的任务记录
Schedules 计划任务
My View 查看用户的工作模版,和任务记录
resources
Templates 任务模版,配置调用playbook执行时的各种参数,从此处添加计划任务
Credentials 配置连接 机器/云主机api Key/自定义的凭证类型 的账号密码等信息
Projects 这里配置项目对应的playbook,可以从Git上拉取或从本地文件夹读取playbook
Inventories 资产清单
Inventory Scripts 自定义获取资产清单的脚本
access
Organizations 组织管理
Users 用户管理
Teams 用户组管理
Administration
Credential Types 自定义凭证类型,添加后可在Credentials中使用
Notifications 配置任务通知,支持电子邮件,Twillio电话等
Management Jobs 计划任务管理
Instance Groups 资产组管理
Applications 自定义应用
Settings 设置
9、Ansible Tower 3.2.x 企业版无限hosts
三、Ansible使用
(一)ansible-playbook安装JDK
1、添加配置
文件:/etc/ansible/ansible.cfg
2、编辑JDK roles,在/opt/ansible目录下创建jdk目录了和jdkinstall.yaml文件
(1)创建/opt/ansible目录:
[root@iz2ze78abfa21jjsp4u9wmz ~]# mkdir /opt/ansible
[root@iz2ze78abfa21jjsp4u9wmz ~]# cd /opt/ansible/
(2)创建以下目录:
[root@iz2ze78abfa21jjsp4u9wmz ansible]# mkdir jdk
[root@iz2ze78abfa21jjsp4u9wmz ansible]# mkdir jdk/files
[root@iz2ze78abfa21jjsp4u9wmz ansible]# mkdir jdk/tasks
(3)下载JDk:
[root@iz2ze78abfa21jjsp4u9wmz jdk]# wget https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
[root@iz2ze78abfa21jjsp4u9wmz jdk]# ls
jdk-8u201-linux-x64.tar.gz
(3)配置jdk所要安装的主机:
[root@iz2ze78abfa21jjsp4u9wmz /]# vi /etc/ansible/hosts
[webservers]
192.168.0.1 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
(4)创建文件:
[root@iz2ze78abfa21jjsp4u9wmz ansible]# vi /opt/ansible/jdk/tasks/jdk.yml
---
- hosts: webservers
tasks:
- name: "拷贝jdk"
copy: src=/opt/ansible/jdk/files/jdk-8u201-linux-x64.tar.gz dest=/usr/local
- name: "解压jdk"
shell: chdir=/usr/local tar zxf jdk-8u201-linux-x64.tar.gz
- name: "配置环境变量"
shell: /bin/echo {{ item }} >> /etc/profile && source /etc/profile
with_items:
- export JAVA_HOME=/usr/local/jdk1.8.0_201
- export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
- export PATH=\$JAVA_HOME/bin:\$PATH
~
(5)配置SSH用户root免密登陆
输入ssh-copy-id 机器2的ip
[root@iz2ze78abfa21jjsp4u9wmz /]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.2
(6)执行脚本:
[root@iz2ze78abfa21jjsp4u9wmz /]# ansible-playbook /opt/ansible/jdk/tasks/jdk.yml
PLAY [webservers] **************************************************************
TASK [Gathering Facts] *********************************************************
ok: [172.17.244.162]
TASK [拷贝jdk] *******************************************************************
ok: [172.17.244.162]
TASK [解压jdk] *******************************************************************
[WARNING]: Consider using the unarchive module rather than running 'tar'. If
you need to use command because unarchive is insufficient you can add 'warn:
false' to this command task or set 'command_warnings=False' in ansible.cfg to
get rid of this message.
changed: [172.17.244.162]
TASK [配置环境变量] ******************************************************************
changed: [172.17.244.162] => (item=export JAVA_HOME=/usr/local/jdk1.8.0_201)
changed: [172.17.244.162] => (item=export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar)
changed: [172.17.244.162] => (item=export PATH=\$JAVA_HOME/bin:\$PATH)
PLAY RECAP *********************************************************************
172.17.244.162 : ok=4 changed=2 unreachable=0 failed=0
(二)Ansible-playbook roles安装redis
(三)常用命令
本机执行测试:
[root@iz2ze78abfa21jjsp4u9wmz ansible]# ansible 127.0.0.1 -a 'date'
/usr/lib/python2.7/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)
127.0.0.1 | CHANGED | rc=0 >>
Sat Mar 9 17:29:18 CST 2019
(四)Playbooks脚本
1.playbook组织格式:YAML语言格式
playbooks是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行
(1)YAML简介
YAML:YAML Ain't Markup Language; Yet Another Markup Language;
(2)语法格式
1)任何书记结构都用缩进来标识,可以嵌套
2)每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ }和,分隔格式
3)列表用 - 标识
2.inventory参数:主机库ssh参数设置
ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行;
变量 | Center-aligned |
---|---|
ansible_ssh_port | 指定ssh端口 |
ansible_ssh_user | 指定ssh用户 |
ansible_ssh_pass | 指定ssh用户登录是认证密码,明文密码不安全 |
ansible_sudo_pass | 指明sudo时候的密码 |
主机组定义
定义主机清单
[webservers]
192.168.0.1 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
注意:在/etc/ansible/hosts中直接定义连接时候的密码不安全,一般建议基于ssh的密钥认证方式实现
测试主机连通性
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible 172.17.244.162 -m ping
172.17.244.162 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible webservers -m ping
172.17.244.162 | SUCCESS => {
"changed": false,
"ping": "pong"
}
这里 ansible 命令后面跟组名,也可以指定某个主机,-m 表示使用哪个模块。
执行远程指令
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible webservers -m command -a 'whoami'
172.17.244.162 | CHANGED | rc=0 >>
root
这里使用 command 模块在远程主机上运行 whoami,-a 用于指定模块参数。也可以使用 shell 模块。
批量执行命令
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible all -m command -a 'ls'
分组方式:
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible webservers -m command -a "uptime"
172.17.244.162 | CHANGED | rc=0 >>
18:25:33 up 1 day, 3:54, 2 users, load average: 0.09, 0.04, 0.05
正则匹配
vi /etc/ansible/hosts
[webservers]
192.168.20.1[2:4]
匹配 12 13 14 三台机器;
3.playbooks
(1)核心元素
Tasks任务、Variables变量、Templates模板、Handlers处理器、Roles角色
(2)playbooks中定义任务:
- name: task description 注释描述信息
module_name: module_args 声明模块:定义ansible模块参数
(3)ansible-playbook执行命令:
ansible-playbook <filename.yml> ... [options]
(四)常用模块使用
1、setup
用来查看远程主机的一些基本信息
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible webservers -m setup
2、ping
来测试远程主机的运行状态
[root@iz2ze78abfa21jjsp4u9wmz ~]# ansible webservers -m ping
172.17.244.162 | SUCCESS => {
"changed": false,
"ping": "pong"
}
3、file
设置文件的属性
相关选项如下:
force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
mode:定义文件/目录的权限
owner:定义文件/目录的属主
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:被链接的源文件路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:
directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
示例:
## 远程文件符号链接创建
# ansible webservers -m file -a "src=/etc/resolv.conf dest=/tmp/resolv.conf state=link"
4、copy
复制文件到远程主机
相关选项如下:
backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
content:用于替代“src”,可以直接设定指定文件的值
dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
directory_mode:递归设定目录的权限,默认为系统默认权限
force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
others:所有的file模块里的选项都可以在这里使用
src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
示例:
## 将本地文件“/etc/ansible/ansible.cfg”复制到远程服务器
# ansible webservers -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644"
5、command
在远程主机上执行命令
相关选项如下:
creates:一个文件名,当该文件存在,则该命令不执行
free_form:要执行的linux指令
chdir:在执行指令之前,先切换到该目录
removes:一个文件名,当该文件不存在,则该选项不执行
executable:切换shell来执行指令,该执行路径必须是一个绝对路径
示例:
# ansible webservers -m command -a "uptime"
6、shell
切换到某个shell执行指定的指令,参数与command相同。
与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw
示例:
## 先在本地创建一个SHELL脚本
# vim /tmp/rocketzhang_test.sh
#!/bin/sh
date +%F_%H:%M:%S
#chmod +x /tmp/rocketzhang_test.sh
## 将创建的脚本文件分发到远程
# ansible storm_cluster -m copy -a "src=/tmp/rocketzhang_test.sh dest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"
## 远程执行
# ansible webservers -m shell -a "/tmp/rocketzhang_test.sh"
7、更多模块
其他常用模块,比如:service、cron、yum、synchronize就不一一例举,可以结合自身的系统环境进行测试。
service:系统服务管理
cron:计划任务管理
yum:yum软件包安装管理
synchronize:使用rsync同步文件
user:系统用户管理
group:系统用户组管理
更多模块可以参考:
#ansible-doc –l