当前位置: 首页 > article >正文

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 ~]# 


http://www.kler.cn/a/376398.html

相关文章:

  • 【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!
  • C++之位算法
  • .NET 8 Web API 中的身份验证和授权
  • 《GBDT 算法的原理推导》 11-12计算损失函数的负梯度 公式解析
  • 【软服之家-注册安全分析报告-无验证方式导致安全隐患】
  • 大模型开发中将企业数据发送给Open AI是否有安全风险?
  • 数据结构(Java)—— 认识泛型
  • 河南省教育厅办公室关于举办2024年河南省高等职业教育技能大赛的通知
  • Java Collection/Executor DelayedWorkQueue 总结
  • MMSegmentation测试阶段推理速度非常慢的一种可能原因
  • 【前端基础】HTML 基础
  • 一文带你弄懂thermal governor IPA
  • 为什么大家都在学数字孪生呢?
  • Keras 3 示例:开启深度学习之旅
  • 【前端基础】CSS基础
  • Unity性能优化(简略版)
  • 刘艳兵-DBA023-控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息:
  • 微信小程序 - 数组 push / unshift 追加后数组返回内容为数字(数组添加后打印结果为 Number 数值类型)
  • 现代卷积神经网络(GoogLeNet+批量归一化+ResNet)
  • https和http的区别,及HTTPS的工作流程
  • windows临时安装solr
  • 2024 Rust现代实用教程 Error错误处理
  • 【tomcat系列漏洞利用】
  • 原生html+js+css+php多图上传带预览可增删判断图片大小和后缀
  • 用100行python代码制作俄罗斯方块游戏,俄罗斯方块游戏教程-附完整代码
  • ros与mqtt相互转换