热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自动化运维三贱客之Ansible的安装和命令应用基础

ansible简介:ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现
ansible 简介 :

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible 基本框架 :

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

技术分享图片

Ansible 基本架构由六个部分构成 :

  • Ansible core 核心引擎。
  • Host inventory 主机清单 : 用来定义 ansible 所管理的主机 ,默认是在 ansible 的 hosts 配置文件中定义被管理的主机 ,同时也支持自定义动态主机清单和指定其他配置文件的位置。
  • Connection plugins 链接插件 : 负责和被管理主机实现通信。除支持使用 SSH 链接被管理主机外,ansible 还支持其他的链接方式,所以需要有链接插件将各个主机用链接插件连接到 ansible。
  • Playbooks (yaml,jinja2)剧本 : 用来集中定义 ansible 任务的配置文件,即将多个任务定义在一个剧本中由 ansible 自动执行,可以由控制主机针对多台被管理主机同时运行多个任务。
  • Core modules 核心模块 :是 ansible 自带的模块 ,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定的状态。
  • Custom modules 自定义模块 :用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能。

案例环境 :

角色 主机名 IP地址 组名
控制主机 node 1 192.168.217.137
被控制主机 node 2 192.168.217.138 webserver
被控制主机 node 3 192.168.217.139 mysql
被控制主机 node 4 192.168.217.140 mysql

安装部署 ansible 服务

1.在控制主机安装 ansible :

yum install -y epel-release  #安装epel源
yum install ansible -y     

ansible --version            #查看ansible版本

yum install tree -y

tree /etc/ansible/      #树状结构展示文件夹
/etc/ansible/
├── ansible.cfg   #ansible的配置文件
├── hosts         #ansible的主仓库,用于存储需要管理的远程主机的相关信息
└── roles         #角色

2.配置主机清单 :

cd /etc/ansible
vim  hosts        
[webserver]         #被管理主机分类  可以添加多个ip
192.168.217.138     
[mysql]
192.168.217.139
192.168.217.140

3.设置 SSH 推送公钥 :

[root@bogon ansible]# ssh-keygen -t rsa         #生成密钥 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   #密钥生成位置是否存在root家目录  回车即可
Created directory ‘/root/.ssh‘.  
Enter passphrase (empty for no passphrase):      #密钥验证的密码 
Enter same passphrase again: 
.......
The key‘s randomart image is:
+---[RSA 2048]----+
|. +=*O. .        |
|.+oo+o=  o       |
|.+   E.   B      |
|.      + o B     |
|      . S + . .  |
|       ..+o  . .o|
|        .* =  ..+|
|        .oO o  o.|
|        .oo=...  |
+----[SHA256]-----+
[root@bogon ansible]# ssh-copy-id root@192.168.217.138   #把公钥发送到被管理主机

[root@bogon ansible]# ssh-copy-id root@192.168.217.139   #公钥默认放在对方用户家目录下 .ssh
.....
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.217.139‘s password:        #对方root用户密码

4.设置免交互 :

[root@bogon ansible]# ssh-agent bash    #把bash挂到ssh-agent下面
[root@bogon ansible]# ssh-add           #添加私钥
Enter passphrase for /root/.ssh/id_rsa:        #密钥验证密码
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
#如果没有免交互,则使用 ansible 管理被管理主机是需要输入密钥验证密码。

Ansible 命令应用基础

Ansible 基本语法 :

ansible [-m module_name] [-a args]

: 对那些主机生效

[-m module_name] : 要使用的模块

[-a args] : 模块特有参数

1.command 模块 :

用于执行常见的linux命令(默认模块,不指定-m默认就是command)。

ansible-doc -s command       #查看模块的使用说明

(1).使用IP地址指定运行主机 :

[root@bogon ~]# ansible 192.168.217.138 -m command -a ‘date‘
192.168.217.138 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:43:45 CST

(2).使用被管理主机中的分类运行主机 :

[root@bogon ~]# ansible webserver -m command -a ‘date‘
192.168.217.138 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:45:40 CST

(3).在所有主机清单中的主机运行 :

[root@bogon ~]# ansible all -m command -a ‘date‘
192.168.217.138 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:47:11 CST

192.168.217.139 | SUCCESS | rc=0 >>
2018年 08月 02日 星期四 09:47:11 CST

2.cron 模块 :

Ansible 中的 cron 模块用于定义任务计划。其中有两种状态(state):present 表示添加(省略时默认使用)。absent 表示移除。

ansible-doc -s cron       #查看模块的使用说明

(1).添加任务计划 :

[root@bogon ~]# ansible webserver -m cron -a ‘minute="*/1" job="/bin/echo hello" name="test cron job"‘          #添加任务
192.168.217.138 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test cron job"
    ]
}
[root@bogon ~]# ansible webserver -a ‘crontab -l‘  #查看任务
192.168.217.138 | SUCCESS | rc=0 >>
#Ansible: test cron job
*/1 * * * * /bin/echo hello

(2).移除任务计划 :

[root@bogon ~]# ansible webserver -m cron -a ‘minute="*/1" job="/bin/echo hello" name="test cron job" state=absent‘
192.168.217.138 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}
[root@bogon ~]# ansible webserver -a ‘crontab -l‘
192.168.217.138 | SUCCESS | rc=0 >>

3.user 模块 :

Ansible 中的 user 模块用于创建用户和更改、删除已存在的用户。其中 name 选项用来指明创建的用户名称。

ansible-doc -s user      #查看模块的使用说明

(1).创建用户 :

[root@bogon ~]# ansible mysql -m user -a ‘name="user01"‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1001, 
    "home": "/home/user01", 
    "name": "user01", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1001
}

(2).删除用户 :

[root@bogon ~]# ansible mysql -m user -a ‘name="user01" state=absent‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "force": false, 
    "name": "user01", 
    "remove": false, 
    "state": "absent"
}

4.group 模块 :

Ansible 中的 group 模块用于对用户组进行管理。

ansible-doc -s group      #查看模块的使用说明

(1).创建 mysql 组,将 mysql 用户添加到 mysql 组 :

[root@bogon ~]# ansible mysql -m group -a ‘name=mysql gid=306 system=yes‘  #创建 mysql 组 指定gid 
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "gid": 306, 
    "name": "mysql", 
    "state": "present", 
    "system": true
}
[root@bogon ~]# ansible mysql -m user -a ‘name=mysql uid=306 system=yes  group=mysql‘      #创建用户  指定uid 指定组
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 306, 
    "home": "/home/mysql", 
    "name": "mysql", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": true, 
    "uid": 306
}

5.copy 模块 :

Ansible 中的 copy 模块用于实现文件的复制和批量下发文件。其中 src 定义本地路径,使用 dest 定义被管理主机文件路径。使用 content 则是通过指定信息内容来生成目标文件。

ansible-doc -s copy      #查看模块的使用说明

(1).将本地文件复制到被管理主机上 :

[root@bogon ~]# ansible mysql -m copy -a ‘src=/etc/fstab dest=/opt/abc.ansible owner=root mode=640‘    #属主、文件权限
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "checksum": "4b11a9d8a720fb2ea2b2bcbafef6c37a0621b9ef", 
    "dest": "/opt/abc.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "e826ed6cacb28bdb65d4af2defb77bf1", 
    "mode": "0640", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 595, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533176788.96-59671060453195/source", 
    "state": "file", 
    "uid": 0
}

(2).将 hello 写入 /opt/abc.ansible 文件中 :

[root@bogon ~]# ansible mysql -m copy -a ‘cOntent="hello" dest=/opt/abc.ansible‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "checksum": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d", 
    "dest": "/opt/abc.ansible", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "5d41402abc4b2a76b9719d911017c592", 
    "mode": "0640", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 5, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533177209.24-236200926193569/source", 
    "state": "file", 
    "uid": 0
}

6.file 模块 :

Ansible 中的 file 模块来设置文件属性。其中使用 path 指定文件路径,使用 src 定义源文件路径,使用 name 或 dest 来替换创建文件的符号链接。

ansible-doc -s file      #查看模块的使用说明

(1).设置文件 /opt/abc.ansible 的属主为 mysql ,属组为 mysql ,权限为644 :

[root@bogon ~]# ansible mysql -m file -a ‘owner=mysql group=mysql mode=644 path=/opt/abc.ansible‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "gid": 306, 
    "group": "mysql", 
    "mode": "0644", 
    "owner": "mysql", 
    "path": "/opt/abc.ansible", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 5, 
    "state": "file", 
    "uid": 306
}

(2).设置 /opt/abc.link 为文件 /opt/abc.ansible 的链接文件 :

[root@bogon ~]# ansible mysql -m file -a ‘path=/opt/abc.link src=/opt/abc.ansible state=link‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "dest": "/opt/abc.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 16, 
    "src": "/opt/abc.ansible", 
    "state": "link", 
    "uid": 0
}

7.ping 模块 :

在 Ansible 中使用 ping 模块来检测指定主机的连通性。

[root@bogon ~]# ansible all -m ping
192.168.217.139 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
192.168.217.138 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

8.service 模块 :

在 Ansible 中使用 service 模块来控制管理服务的运行状态。其中,使用 enabled 表示是否开机自启,取值为 true 或 false ;使用 name 定义服务名称;使用 state 指定服务状态,取值分别为 started、stoped、restarted。

ansible-doc -s service      #查看模块的使用说明

(1).查看 httpd 服务 :

[root@bogon ~]# ansible webserver -a ‘systemctl status httpd.service‘   #(centos 7 )
192.168.217.138 | FAILED | rc=3 >>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)
ansible webserver -a ‘chkconfig --list httpd‘  

(2).启动 httpd 服务并设置开机自启动 :

[root@bogon ~]# ansible webserver -m service -a ‘enabled=true name=httpd state=started‘
192.168.217.138 | SUCCESS => {
    "changed": true, 
    "enabled": true, 
    "name": "httpd", 
    "state": "started", 
    ........

9.shell 模块 :

在 Ansible 中的 shell 模块可以被管理主机上运行命令,并支持管道符号等功能的复杂命令。

ansible-doc -s shell      #查看模块的使用说明

创建用户使用无交互模式给用户设置密码。

[root@bogon ~]# ansible mysql -m user -a ‘name=user01‘
[root@bogon ~]# ansible mysql -m shell -a ‘echo abc123 | passwd --stdin user01‘
192.168.217.139 | SUCCESS | rc=0 >>
更改用户 user01 的密码 。
passwd:所有的身份验证令牌已经成功更新。

10.script 模块 :

在 Ansible 中的 script 模块可以将本地脚本复制到被管理主机上进行运行。需要注意的是使用相对路径来指定脚本。

ansible-doc -s script      #查看模块的使用说明
[root@bogon ~]# vim test.sh
[root@bogon ~]# chmod +x test.sh 
[root@bogon ~]# ./test.sh 
haha
[root@bogon ~]# ansible mysql -m script -a ‘test.sh‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.217.139 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.217.139 closed."
    ], 
    "stdout": "haha\r\n", 
    "stdout_lines": [
        "haha"
    ]
}

11.yum 模块 :

在 Ansible 中的 yum 模块负责在被管理主机上安装与卸载软件包 。使用 state 指定安装软件的状态,present、latest用来表示安装,absent 表示卸载。

ansible-doc -s yum      #查看模块的使用说明

(1).安装 zsh软件包 :

[root@bogon ~]# ansible mysql -m yum -a ‘name=zsh‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "Loaded plugins: fastestmirror, langpacks\nLoading mirror speeds from cached hostfile\n * base: mirrors.nju.edu.cn\n * extras: mirrors.nju.edu.cn\n * updates: mirrors.shu.edu.cn\nResolving Dependencies\n--> Running transaction check\n---> Package zsh.x86_64 0:5.0.2-28.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package        Arch              Version                 Repository       Size\n================================================================================\nInstalling:\n zsh            x86_64            5.0.2-28.el7            base            2.4 M\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 2.4 M\nInstalled size: 5.6 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : zsh-5.0.2-28.el7.x86_64                                      1/1 \n  Verifying  : zsh-5.0.2-28.el7.x86_64                                      1/1 \n\nInstalled:\n  zsh.x86_64 0:5.0.2-28.el7                                                     \n\nComplete!\n"
    ]
}

(2).卸载 zsh 软件包 :

[root@bogon ~]# ansible mysql -m yum -a ‘name=zsh state=absent‘
192.168.217.139 | SUCCESS => {
    "changed": true, 
    "msg": "", 
    "rc": 0, 
    "results": [
        "已加载插件:fastestmirror, langpacks\n正在解决依赖关系\n--> 正在检查事务\n---> 软件包 zsh.x86_64.0.5.0.2-28.el7 将被 删除\n--> 解决依赖关系完成\n\n依赖关系解决\n\n================================================================================\n Package       架构             版本                      源               大小\n================================================================================\n正在删除:\n zsh           x86_64           5.0.2-28.el7              @base           5.6 M\n\n事务概要\n================================================================================\n移除  1 软件包\n\n安装大小:5.6 M\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  正在删除    : zsh-5.0.2-28.el7.x86_64                                     1/1 \n  验证中      : zsh-5.0.2-28.el7.x86_64                                     1/1 \n\n删除:\n  zsh.x86_64 0:5.0.2-28.el7                                                     \n\n完毕!\n"
    ]
}

12.setup 模块 :

在 Ansible 中使用 setup 模块收集、查看别管理的主机的 facts (facts 是 ansible 采集被管理主机设备信息的一个功能)。每一个被管理主机在接受并运行管理命令之前,都会将自己的相关信息(操作系统、IP地址等 )发送给控制主机。

ansible-doc -s setup      #查看模块的使用说明
[root@bogon ~]# ansible mysql -m setup
192.168.217.139 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.122.1", 
            "192.168.217.139"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::702c:dff:a392:257c", 
            "fe80::129f:929e:aad4:8dde"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
......
#输出信息较多

自动化运维三贱客之 Ansible 的安装和命令应用基础


推荐阅读
  • Linux     系统安装
    Linux系统安装linux系统安装准备工作电脑、u盘、光盘、网络、硬盘主要使用光盘、网络虚拟化软件vmwarevi ... [详细]
  • python自学教程哪里好,python比较好的教程
    本文目录一览:1、想学python去哪里比较好? ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • .babelrc是用来设置转码规则和插件的,这种文件在window上无法直接创建,也无法在HBuilder中创建,甚至无法查看,但可以在sublimetext中创建、查看并编辑。当 ... [详细]
  • 九宫格计算. ... [详细]
  • 1.安装cordovapluginaddcordova-plugin-file-transfercordovapluginaddcordova-plugin-fi ... [详细]
  • MyBatis模糊查询和多条件查询一、ISmbmsUserDao层根据姓名模糊查询publicListgetUser();多条件查询publicList ... [详细]
  • vscode里的html标签导航的一系列问题
    哈喽,我今天带来的经验是,vscode在18年10月更新后的1.29以后,编辑html文档时,会发现最上面有个类似于HTML标签导航的玩意儿,可能部分同学和我一样不习惯用它们,现在 ... [详细]
  • NickLa制作了另伟大的教程。NickLa向我们展示了如何装饰,而无需编辑源图像的图像和照片画廊。诀窍是很简单。所有你需要的是一个额外的标签和应用背景图像创建的叠加 ... [详细]
  • Illustrator绘制逼真的愤怒的小鸟实例教程
    Illustrator教程: ... [详细]
  • 抓取百万知乎用户设计之实体设计
    一.实体的关系实体是根据返回的Json数据来设计的教育经历方面用户可以有很多教育经理,USER和education是一对多的关系,一个education对应一个education一 ... [详细]
  • 软件自动化测试的学习路线
    软件自动化测试的学习步骤软件测试交流群关注软件测试技术公众号获取阅读目录软件自动化测试的学习步骤自动化测试的本质自动化测试学习的误区自动化测试的职位自动化测试分类Web自动化 ... [详细]
  • FluxCD、ArgoCD或Jenkins X,哪个才是适合你的GitOps工具?
    GitOps是一种使用基于Git的工作流程来全面管理应用和基础设施的想法,其在最近获得了极大关注。新一代的部署工具更能说明这一点,它们将GitOps作为 ... [详细]
  • 云计算安全,主要面临哪些威胁?
    云计算是一种新的计算方式,它依托于互联网,以网络技术、分布式计算为基础,实现按需自服务、快速弹性构建、服务可测量等特点的新一代计算方式。然而,任何以互联网为基础的应用都存在着一定危 ... [详细]
  • 本文目录一览:1、学习Python之后可以做什么工作?有哪些方向? ... [详细]
author-avatar
手机用户2502891303_279
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有