ansible简单入门

一、Ansible 简介

absible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。无客户端。
我们需要学一些Ansible的安装和一些基本概念,然后我们会开始研究一些真正有意思的东西-playbook配置管理,部署以及语法编排。我们会学习如何使用/usr/bin/ansible执行an-hoc并行命令,我们还会学习ansible的核心有什么样的模块可供使用,当然以后你也可以写你自己的模块。

二、基本架构

上图为ansible的基本架构,从上图可以了解到其由以下部分组成:

核心:ansible

核心模块(Core Modules):这些都是ansible自带的模块

扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块

插件(Plugins):完成模块功能的补充

剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行

连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件

主机群(Host Inventory):定义ansible管理的主机

三、Ansible部署

1.环境

[root@ansible ~]# vim /etc/hosts 
192.168.145.200 ansible 
192.168.145.201 host1 
192.168.145.207 host2 
192.168.145.208 host3
192.168.145.209 host4

2.安装ansible

服务器上

[root@ansible ~]# yum install -y epel-release  #安装epel源 
[root@ansible ~]# yum install -y ansible       #安装ansible

检查ansible是否安装成功

[root@ansible ~]# rpm -ql ansible               #列出所有文件     
# q指使用询问模式,当遇到任何问题时,rpm指令会先询问用户;l指显示套件的文件列表;c指只列出组态配置文件
[root@ansible ~]# rpm -qc ansible               #查看配置文件    
[root@ansible ~]# ansible --help                #查看ansible操作手册
[root@ansible ~]# ansible-doc -l                #查看所有模块
[root@ansible ~]# ansible-doc -s yum            #查看yum模块

3.ssh-key(可选)

为了让ansible能够免密控制其它服务器,将生成秘钥并拷贝到其它服务器(要进行控制的服务器上)

[root@ansible ~]# ssh-keygen          #生成秘钥
[root@ansible ~]# ssh-copy-id host1   #拷贝秘钥到其它服务器。注意,这里只拷贝了host1,其它机器没有拷贝
[root@ansible ~]# ssh-copy-id host2
[root@ansible ~]# ssh-copy-id host3
[root@ansible ~]# ssh-copy-id host4

4.ansible基础

①定义主机清单

在ansible服务器上

[root@ansible ~]# vim /etc/ansible/hosts   添加以下三行内容。没有添加主机清单的服务器,ansible会ping不通
host1
host2
host3
host4

②测试连通性

[root@ansible ~]# ansible localhost -m ping  # 测试对本地的连通性 
[root@ansible ~]# ansible host1 -m ping      #测试对host1的连通性

③简洁输出

[root@ansible ~]# ansible host1 -m ping -o  #-o指简洁输出(行输出)

④know_hosts

在ansible服务器上

[root@ansible ~]# ansible host2 -m ping      #结果会显示失败,因为host2上没有免密登录秘钥
[root@ansible ~]# ansible host2 -m ping -u root -k -o   #表明身份后即可成功

去掉(yes/no)的询问 (可选)

[root@ansible ~]# vim /etc/ssh/ssh_config  将下行内容注释解除,再将ask改为no
StrictHostKeyChecking no
[root@ansible ~]# systemctl restart sshd   #重启生效

⑤请注意ping和ssh的区别

ping   ICMP:网际消息管理协议
ssh    应用程安全登录协议  
实验如下:
关闭host1主机sshd进程,再在ansible服务器上ping一下host1服务器,发现可以Ping通
[root@ansible ~]# systemctl stop sshd
[root@ansible ~]# ping host1
再在ansible服务器上使用ansible对host1进行连通测试,结果却是失败的
[root@ansible ~]# ansible host1 -m ping 
 
结论:ansible的ping,是探测ssh程序是否连接,不是icmp协议

四、Inventory-主机清单

1.增加主机组

[root@ansible ~]# vim /etc/ansible/hosts  添加以下内容
[webserver]           #主机组名 
host1
host2
host3
host4
 
调用组。这里如果没有做免密,实验会报错,但是不影响该实验
[root@ansible ~]# ansible webserver -m ping -o    #-o指以行的形式展示

2.增加用户名和密码

[root@ansible ~]# vim /etc/absible/hosts
[webserver]             
host1 ansible_ssh_user='root' ansible_ssh_pass='666666'
host2 ansible_ssh_user='root' ansible_ssh_pass='666666'
host3 ansible_ssh_user='root' ansible_ssh_pass='666666'
host4 ansible_ssh_user='root' ansible_ssh_pass='666666'
#也可以这样正则写法:host[1:4] ansible_ssh_user='root' ansible_ssh_pass='666666'

3.增加端口

请将host1的sshd程序端口修改为2222(随机)

[root@host1 ~]# vim /etc/ssh/sshd_config 以下一行内容解除注释,并将22修改为2222
Port 2222   #1024~65535之间的端口都可以
[root@host1 ~]# systemctl restart sshd

在随机的host2服务器上对host1进行远程登录测试

[root@host2 ~]# ssh root@192.168.145.201 -p 2222  #再次远程登录host1时需要指定端口号才可以登录

如果想要ansible能够正常连接的话,需要在ansible里添加指定端口号

在ansible服务器上

[root@ansible ~]# vim /etc/ansible/hosts  添加以下内容 ansible_ssh_port='2222'
[webserver]             
host1 ansible_ssh_user='root' ansible_ssh_pass='666666' ansible_ssh_port='2222'  
host2 ansible_ssh_user='root' ansible_ssh_pass='666666'
host3 ansible_ssh_user='root' ansible_ssh_pass='666666'
host4 ansible_ssh_user='root' ansible_ssh_pass='666666'
 
最后进行连通测试,显示为成功,说明组变量设置成功
[root@ansible ~]# ansible webserver -m ping -o

4.组:变量

ansible内部变量可以帮助我们简化主机清单的设置,如下:

在ansible服务器上

[root@ansible ~]# vim /etc/ansible/hosts  内容如下
 [webserver]                        # webserver组
 host1  ansible_ssh_port='2222'  
 host2
 host3 
 host4 
 [webserver:vars]                   # webserver组的变量 
 ansible_ssh_user='root'
ansible_ssh_pass='666666' 
 
最后进行连通测试,显示为成功,说明组变量设置成功
[root@ansible ~]# ansible webserver -m ping -o

5.子分组

将不同的分组进行组合

在ansible服务器上
例子如下:
[root@ansible ~]# vim /etc/absible/hosts 内容如下
[apache]                     #apache组
host[1:2] 
 
[nginx]                      #nginx组
host[3:4]
 
[webserver:children]         # children指孩子
apache
nginx
 
[webserver:vars]            # webserver组的变量 
ansible_ssh_user='root'
ansible_ssh_pass='666666' 
 
最后进行连通测试,显示为成功。webserver调用了两个孩子apache和nginx组
[root@ansible ~]# ansible webserver -m ping -o

6.自定义主机列表

在ansible服务器上
[root@ansible ~]# pwd               #当前路径在/root
[root@ansible ~]# vim hostlist      #新建主机列表(清单)
[dockers]
host1
host2
[dockers:vars]
ansible_ssh_user='root'
ansible_ssh_pass='666666' 
 
这里可以假设 hostlist 这个文件是其它机器拷贝到ansible服务器上的,
请问:ansible如何使用它,命令如下:
ansible -i hostlist dockers -m ping -o    
# -i链接外部主机清单,hostlist文件名,dockers组名。如果放在其它路径,请打绝对路径

五、YAML-YAML Ain't Markup Language-非标记语言

1.语法

列表
fruits:
  -Apple
  -Orange
  -Strawberry
  -Mango
字典
martin:
  name: Martin D'vloper
 job: Developer     
 skill: Elite

2.示例

需求:通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程

这里实验的环境为"三、Ansible部署--1.环境"

在ansible服务器上
ansible all -m yum -a 'name=httpd state=removed' -o         #卸载服务器的所有httpd
ansible all -m yum -a 'name=httpd-tools state=removed' -o   #卸载服务器的所有httpd-tools
yum -y install httpd     #安装httpd
mkdir apache
cd apache
cp  /etc/httpd/conf/httpd.conf .
grep '^Listen' httpd.conf 
sed -ri 's/Listen 80/Listen 8080/' httpd.conf    

vim apache.yaml                      #编写剧本
- hosts: webserver
  tasks:                             #任务
  - name: install apache packages    #第一个任务名字(自定义)
    yum: name=httpd state=present    #第一个任务模块
  - name: copy apache conf           #第二个任务名字
    copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf  #第二个任务模块
    notify: restart apache service for xulei                          #引用处理程序(notify指通知)     
  - name: ensure apache is running   #第三个任务名字
    service: name=httpd state=started enabled=yes           #第三个任务模块  
  handlers:
  - name: restart apache service for xulei                           #任务 (定义处理程序)
    service: name=httpd state=restarted
测试剧本
ansible-playbook apache.yaml --syntax-check   #检查剧本语法是否正确
ansible-playbook apache.yaml --list-tasks     #列出剧本的任务名字
ansible-playbook apache.yaml --list-hosts     #列出剧本的主机名字
执行剧本 
ansible-playbook apache.yaml
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值