ansible简易入门

工作中要使用ansible进行自动化部署,这两天花了点时间看了下ansible的文档,也稍稍体验了下,后面会用于项目实战,这里将实验过程中的一些经验记录下来方便后续查阅。

什么是ansible

ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。

所有的这几个目标本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。——批量的在远程服务器上执行命令

Ansible提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务。这就像是库和框架的关系一样。

Ansible是基于 paramiko 开发的。这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。因此fabric和ansible还有一个共同点就是不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

快速安装

我实验过程中管理主机的操作系统是macOS 10.13.3,托管主机的操作系统是CentOS 6.7,IP是10.211.55.10。

管理主机上安装ansible

1

brew install ansible

托管主机上安装ansible

# 启用epel源,并修改地址至sng源镜像地址
yum install -y http://mirror-sng.oa.com/epel/epel-release-latest-6.noarch.rpm
sed -i 's/^mirrorlist/#mirrorlist/g' /etc/yum.repos.d/epel.repo
sed -i 's/^#baseurl=http:\/\/download.fedoraproject.org\/pub\/epel/baseurl=http://mirror-sng.oa.com/epel/g' /etc/yum.repos.d/epel.repo

yum install -y ansible

到管理主机执行命令简单测试一下

mkdir ansible_test
cd ansible_test

# 创建hosts文件
echo '
[centos6.7]
10.211.55.10
' > hosts

# 创建ansible配置文件,指定hosts文件使用当前目录下的hosts文件
echo '
[defaults]
inventory=./hosts
' > ansible.cfg

# 使用ansible执行一条ad-hoc命令,按照指示输入托管主机的root密码即可
ansible all -m ping -u root -k

使用ansible

主机与组

Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts,也可在ansible.cfg里指定inventory。

除默认文件外,你还可以同时使用多个 inventory 文件,也可以从动态源,或云上拉取 inventory 配置信息.详见 动态 Inventory.

详见inventoryformat

Patterns

在Ansible中,Patterns 是指我们怎样确定由哪一台主机来管理. 意思就是与哪台主机进行交互. 但是在:doc:playbooks 中它指的是对应主机应用特定的配置或执行特定进程.

ad-hoc命令里使用patterns:

1

ansible <pattern_goes_here> -m <module_name> -a <arguments>

playbook里使用patterns:

# example.yml里会指定不同role对应的patterns,参见https://github.com/ansible/ansible-examples/blob/master/tomcat-memcached-failover/site.yml
ansible-playbook example.yml

设置公钥认证登录托管主机

每次执行命令时都要输入密码显然很难进行自动化部署,因此在实际使用一般会设置公钥认证。

在管理主机上输入以下命令

ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -N ''  # 生成本地的ssh登录密钥
ssh-add $HOME/.ssh/id_rsa
ssh-copy-id -i $HOME/.ssh/id_rsa root@10.211.55.10  # 输入托管主机的root密码
echo '
host_key_checking = False' >> ansible.cfg  # 禁用对key信息的确认提示

后面就不用再输入托管主机的密码了,可直接远程执行命令了。

1

ansible all -m ping -u root

ad-hoc 命令

ad hoc——临时的,在ansible中是指需要快速执行,并且不需要保存的命令。说白了就是执行简单的命令——一条命令。对于复杂的命令后面会说playbook。

ansible有许多模块,默认是 ‘command’,也就是命令模块,我们可以通过 -m 选项来指定不同的模块.

执行命令

ansible all -m command -a '/bin/echo hello' -u root
ansible all -m shell -a 'free -m' -u root

command 模块不支持 shell 变量,也不支持管道等 shell 相关的东西.如果你想使用 shell相关的这些东西, 请使用’shell’ 模块.两个模块之前的差别请参考 模块相关 .

文件传输

# 拷贝文件
ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"
# 修改文件的属主和权限
ansible all -m file -a "dest=/srv/foo/a.txt mode=600"
ansible all -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
# 创建目录
ansible all -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
# 删除目录(递归的删除)和删除文件
ansible all -m file -a "dest=/path/to/c state=absent"

管理软件包

# 确认一个软件包已经安装,但不去升级它
ansible webservers -m yum -a "name=acme state=present"
# 确认一个软件包的安装版本
ansible webservers -m yum -a "name=acme-1.5 state=present"
# 确认一个软件包还没有安装
ansible webservers -m yum -a "name=acme state=absent"

用户与用户组

使用 ‘user’ 模块可以方便的创建账户,删除账户,或是管理现有的账户

# 创建账户
ansible all -m user -a "name=foo password=<crypted password here>"
# 删除账户
ansible all -m user -a "name=foo state=absent"

管理服务

# 确认某个服务已经启动
ansible webservers -m service -a "name=httpd state=started" 
# 重启某个服务
ansible webservers -m service -a "name=httpd state=restarted"
# 确认某个服务已经停止
ansible webservers -m service -a "name=httpd state=stopped"

限时后台任务

# 后台执行长时间任务,其中 -B 1800 表示最多运行30分钟, -P 60 表示每隔60秒获取一次状态信息.
ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff"
# 前面执行后台命令后会返回一个 job id, 将这个 id 传给 async_status 模块,可查询任务的执行状态
ansible web1.example.com -m async_status -a "jid=488359678239.2844"

Playbooks

Playbooks 简介

Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常之强大的.

简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.

Playbooks 可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.

我们使用 adhoc 时,主要是使用 /usr/bin/ansible程序执行任务.而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范.

playbooks就是按“约定大于配置“的方式组织需要远程执行的命令,先放在下一篇详细说明了,详见Playbooks 介绍Playbook 角色(Roles) 和 Include 语句

参考

  1. http://www.ansible.com.cn/docs/
  2. https://www.the5fire.com/ansible-guide-cn.html
  3. https://github.com/ansible/ansible-examples

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Kirito的技术分享

研究优雅停机时的一点思考

最近瞥了一眼项目的重启脚本,发现运维一直在使用 kill-9<pid> 的方式重启 springboot embedded tomcat,其实大家几乎一致认为...

2.2K80
来自专栏cs

linux学习笔记三

文件组成 linux文件系统的运行和操作系统的文件组成有关,文件系统会将文件权限,属性放在inode(索引节点)中,至于实际的数据则放在block快中。另外还有...

383120
来自专栏AI科技大本营的专栏

详解CPU漏洞对机器学习的影响:几乎所有卷积层都受影响,QR分解降速37%

作者 | Mikel Bober-Irizar 翻译 | 刘畅 编辑 | Donna (备注:KPTI 在计算机中指 Kernel page-table iso...

31980
来自专栏cs

linux学习笔记五

笔记摘抄自《linux操作系统基础及应用》 ---- 作业控制 正在执行的一个或者多个程序可形成一个作业。使用管道命令和重定向命令,一个作业可以启动多个进程...

35260
来自专栏cs

linux学习笔记二

基本文件系统。 1.0 ext4文件系统 windows一般是NTFS,早期的FAT32,DOS是FAT文件系统,linux大多数发行版采用ext4文件系统。...

42660
来自专栏cs

linux学习笔记四

进程(process)是程序实体运行的过程,是系统进行资源分配和调度的独立单位,或者说是一个程序在处理机上的一次执行活动。 区分一下进程和程序 ---- 1....

393140
来自专栏cs

linux学习六

网络服务 常用网络服务器软件 服务类型 软件名称 服务类型 软件名称 NFS 服务 NFS DNS服务 DNS Web服务 Apache Ma...

30690
来自专栏算法修养

把Asp.Net Core 2.0部署在Linux上,使用Nginx代理服务器,并且用Systemctl命令以服务的方式监听项目

在Linux上部署.net core 2.0程序: 第一步:配置Nginx代理 在/etc/nginx/sites-available/default 中添加 ...

43860
来自专栏AI科技大本营的专栏

AI一分钟 | “钢铁侠”马斯克冒冷汗直面跳票尴尬;Apollo2.0确定下个月初出征美国,李彦宏发力全球梦

一分钟AI 马斯克Twitter例行明体察民情,尴尬地请大家继续等待Autopilot 2.0,和升级的Linux OS系统。 Apollo2.0将揭开面纱!百...

31860
来自专栏cs

linux学习笔记一

基础命令。 ---- shell命令的格式: 命令名 [选项] [参数] 选项前面有一个减号–,与参数区分(参数没有减号)。 如 ls -ah。 root@...

347110

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励