Ansible 部署应用
Ansible
Ansible 是基于 Python 开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署 变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷
Ansible 的基本架构六大件
Ansible core 核心引擎:即 Ansible 本身
Host Inventory 主机清单: 用来定义 Ansible 所管理主机, 默认是在 Ansible 的hosts 配置文件中定义被管理主机, 同时也支持自定义动态主机清单和指定其它配置文件的位置
Connect plugin 连接插件: 负责和被管理主机实现通信。除支持使用 SSH 连接被管理主机外, Ansible 还支持其它的连接方式, 所以需要有连接插件将各个主机用连接插件连接到 Ansible
Playbook( yaml, jinjia2) 剧本: 用来集中定义 Ansible 任务的配置文件, 即将多个任务定义在一个剧本中由 Ansible 自动执行, 可以由控制主机针对多台被管理主机同时运行多个任务
Core modules 核心模块:是 Ansible 自带的模块,使用这些模块将资源分发到被管理主机使其执行特定任务或匹配特定的状态
Custom modules 自定义模块: 用于完成模块功能的补充, 可借助相关插件完成记录日志、发送邮件等功能
Ansible与SaltStack的对比
(1)Ansible安装部署简单
(2)SaltStack响应速度快
(3)Ansible更安全
(4)对Windows的支持
(5)Ansible自身运维比较简单
部署ansible
角色 | 主机名 | IP地址 | 配置 |
控制主机 | ansible-node1 | 192.168.27.152 | 2c4g |
被管理主机 | ansible-node2 | 192.168.27.153 | 2c4g |
被管理主机 | ansible-node3 | 192.168.27.154 | 2c4g |
干净的环境,修改主机名
hostnamectl set-hostname ansible-node1
hostnamectl set-hostname ansible-node2
hostnamectl set-hostname ansible-node3
在第一台机器上安装Ansible
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum install -y ansible
#查版本号即为安装成功
ansible --version
ansible引用配置文件的优先级
# 优先级最高
ANSIBLE_CONFIG (一个环境变量)# 优先级次之
ansible.cfg (位于当前目录中)# 优先级次之
ansible.cfg (当前用户的家目录中)# 优先级最低
/etc/ansible/ansible.cfg
配置ansible的主机清单
vi /etc/ansible/hosts
#写在配置文件最后即可
192.168.27.153
192.168.27.154
控制主机清单的主机
ansible all -m ping
# all 为被控制机器的IP
# -m 操作的命令
# ping 测试网络是否通过
设置 SSH 无密码登录
为了避免 Ansible 下发指令时需要输入被管理主机的密码,可以通过证书签名达到 SSH
无密码登录。使用 ssh-keygen 产生一对密钥,并通过 ssh-copy-id 命令来发送生成的公钥
#生成密钥对
ssh-keygen -t rsa
#连接被控制端的IP
ssh-copy-id 192.168.10.102
取消密钥对验证
vi /etc/ansible/ansible.cfg
把密码写进主机清单 省去密码操作
[root@ansible-node1 ~]# cat /etc/ansible/hosts
192.168.27.153 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.27.154 ansible_ssh_user=root ansible_ssh_pass=123456
常用模块
[root@ansible-node1 ~]# ansible all -a 'hostname'
192.168.27.153 | CHANGED | rc=0 >>
ansible-node2
192.168.27.154 | CHANGED | rc=0 >>
ansible-node3
[root@ansible-node1 ~]#
[root@ansible-node1 ~]# ansible all -a 'free -h'
192.168.27.153 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 3.7G 175M 3.3G 11M 176M 3.3G
Swap: 2.0G 0B 2.0G
192.168.27.154 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 3.7G 177M 3.3G 11M 176M 3.3G
Swap: 2.0G 0B 2.0G
[root@ansible-node1 ~]#
定义组
# 定义组写在主机清单中 例如我创建的两个组规划机器
[root@ansible-node1 ~]# cat /etc/ansible/hosts
[master]
192.168.27.153 ansible_ssh_user=root ansible_ssh_pass=123456
[node]
192.168.27.154 ansible_ssh_user=root ansible_ssh_pass=123456
#操作组
ansible node -m ping
可省略command模块,其他模块都不可以
command是默认命令
还可以指定shell命令,用来操作Linux命令 (不可省略)
user模块
创建用户
ansible all -m user -a 'name=test'
删除用户
ansible all -m user -a 'name=test state=absent'
#present 表示添加 (省略状态时默认使用)
#absent 表示移除。
group组模块
#被管理组 db里所有主机创建 mysql 组,gid 为 306
ansible db -m group -a 'name=mysql gid=306 system=yes'
设置周期任务
添加周期任务计划
ansible all \
-m cron \
-a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
# name 周期任务的名字
列出周期任务
ansible all -m shell -a 'crontab -l'
copy 模块
Ansible 中的 copy 模块用于实现文件复制和批量下发文件。其中使用 src 来定义本地源文件路径;使用 dest 定义被管理主机文件路径;使用 content 则是使用指定信息内容生成目标文件
#将 本 地 文 件/etc/fstab 复 制 到 被 管 理组 db里 的 所 有 主 机上 的/tmp/fstab.ansible,所有者设置为 root,权限设置为 640
ansible all \
-m copy \
-a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640'
修改简单的内容
ansible all \
-m copy \
-a 'content="Hello Ansible Hi Ansible\n" dest=/tmp/test.ansible'
file模块
#设置被管理组 dbsrvs 里所有主机中/tmp/fstab.ansible 文件的所属主为 mysql, 所属组为 mysql,权限为 644。
ansible all \
-m file \
-a 'owner=mysql group=mysql mode=644 path=/tmp/fstab.ansible'
script模块
Ansible 中的 script 模块可以将本地脚本复制到被管理主机上进行运行。需要注意的是使用相对路径指定脚本位置
[root@ansible-node1 ~]# cat test.sh
#!/bin/bash
echo "ok"
[root@ansible-node1 ~]# chmod +x test.sh
[root@ansible-node1 ~]# ansible all -m script -a 'test.sh'
service模块
Ansible 中使用 service 模块来控制管理服务的运行状态。其中使用 enabled 表示是否开机自动启动,取值为 true 或者 false;使用 name 定义服务名称;使用 state 指定服务状态,取值有 started、stoped、restarted
ansible all \
-m service \
-a 'enabled=true name=chronyd state=started'
ansible all \
-m service \
-a 'enabled=true name=chronyd state=stopped'
yum 模块
切换另外两台的yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
安装模块
ansible all -m yum -a 'name=tree'
卸载模块
ansible all -m yum -a 'name=tree state=absent'
palybook模块
[root@ansible-node1 ~]# cat test.yaml
---
- hosts: all
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
- name: start httpd
service: name=httpd state=started
ansible-playbook test.yaml
更好的移植性(修改一下)
[root@ansible-node1 ~]# cat test.yaml
---
- hosts: all
vars:
package: httpd
remote_user: root
tasks:
- name: install {{ package }}
yum: name={{ package }} state=latest
- name: start {{ package }}
service: name={{ package }} state=started
[root@ansible-node1 ~]#