Ansible学习之基础(1)

Ansible和目前市面上一些其它的项目管理工具有很大的不同,它的设计初衷就是为了更方便、快捷的进行配置管理。它易于安装和使用、语法也非常简单易学。你可以用Ansible将平常复杂的配置工作变得简单,变得更加标准化更容易控制。

Ansible只需要在一台普通的服务器上运行即可,不需要在被管控的服务器上安装客户端。因为它是基于SSH的,Linux服务器离不开SSH, 所以Ansible不需要为配置工作添加额外的支持。 你可以通过命令行来使用Ansible,运行Ansible的服务器这里俗称“管理节点”;通过Ansible进行管理的服务器俗称“受控节点”。

管理节点依赖的东西比较少,列表如下:

  1. Python 2.6 或更高版本
  2. Paramiko(Python的SSH模块)
  3. PyYAML(Python的YAML解析器)
  4. Jinja2(Python的模板引擎)

受控节点如果是Python 2.4 或 Python 2.5 ,则需额外安装 Simplejson 模块。到Python的2.6或以上版本,就则内置了 Simplejson模块,不需要额外安装任何其它依赖。值得欣慰的是,目前主流的服务器上内置的Python版本绝多数都是 Python 2.6 以上版本。

第一章节包括如下内容

  1. 安装Ansible
  2. 配置Ansible
  3. 使用Ansible的命令行
  4. 怎样获得帮助

安装方法

通常大家都喜欢用各个系统自带的包管理工具去安装和维护软件包。但这样,你并不一定能获取到最新或最可靠的Ansible版本。所以,建议你使用pip来安装和管理Ansible。

Pip是专门用来管理Python模块的工具,Ansible会将每次正式发布都更新到pip仓库中。所以通过pip安装或更新Ansible,会比较稳妥的拿到最新稳定版。

如果你已经基于Ansible开发大量模块,你最好一直使用对应版本。此时不建议你升级到最新版本,以免由于不兼容等问题导致模块功能异常。

使用软件仓库安装Ansible

主要的Linux发行版都有自己的软件包管理系统,能帮你自动解决软件包的依赖关系。比如:

  • Fedora、RHEL、CentOS以及兼容的发行版:$ sudo yum -y install ansible
  • Ubuntu、Debian,以及兼容发行版:$ apt-get install ansible

使用pip安装Ansible

前面已经介绍使用pip来安装Ansible。需要注意的是,如果使用pip安装Ansible。升级操作系统时,并不会同时升级Ansible。另外,升级操作系统有可能损坏Ansible环境,毕竟它依赖Python。Pip的安装指令为:

$ pip install ansible

使用源码安装Ansible

最时尚的玩法是使用源码安装了。你会拿到最新版,但并非稳定版。所以,使用源码安装时要留意Bug,积极关注社区和版本更新。请从Github上获取最新代码,安装过程如下:

$ git clone git://github.com/ansible/ansible.git
$ cd ansible && sudo make install

Ansible设置

通常我们用Ansible拉取需要管理的“受控节点”的服务器列表,后续我们会介绍很多相关的方法。

默认情况下Ansible会读取 /etc/ansible 文件里的主机列表,内容为ini格式的。每个中括号里代表一个分组,其下的机器列表都归属于这个分组,直到出现下一个中括号为止。通常我们按组来执行任 务,同一组受控服务器应用相同的配置。一台服务器也可以归属到多个组,以完成多个功能角色的配置。低耦合、模块化,非常灵活! 我们来举个例子:将3台受控服务器划到WebServers组,机器名分别是Site01、Site02和Site01-dr。另外还有1个 Production组包含了Site01、Site02、Db01和Bastion。那么对应的配置文件 /etc/ansible 如下:

[WebServers]
Site01
Site02
Site01-dr

[Production]
Site01
Site02
Db01
Bastion

配置好主机列表之后,就可以开始执行批量任务了。Ansible自带了ping模块,可以测试“管理节点”和和“受控节点”之间的网络联通情况。

Linux服务器均使用SSH进行远程管理,SSH服务是服务器必备组件。Ansible在设计上简化使用成本,在“管理节点”上使用SSH连接 “受控节点”。通过创建SSH连接来发送指使并执行,达到配置管理的目的。这样避免了不同版本的操作系统、甚至不同发行版的操作系统下使用Agent带来 的兼容性问题。

首先,我们来赶紧体验一下Ansible的强大魅力。使用Ansible来测试“受控节点”的网络联通情况:

$ ansible Site01 -u root -k -m ping

回车后会提示你输入root密码,然后会打印如下结果:

Site01 | success >> {
changed”: false,
ping”: pong
}

如果你使用密钥方式登录SSH,去掉 -k 参数即可。可以为Ansible设置一个特定的用户,所有操作均以此用户来执行。甚至可以为每个“受控节点”设置各自不同的用户。

全局用户的设置见配置文件 /etc/ansible/ansible.cfg ,修改 [defaults] 段落里的 remote_user 的值即可。也可以通过修改 remote_port 来定义Ansible去使用非标准的22/SSH 端口来进行连接和管理。在没有给“受控节点”或“受控组”进行特定设置时,Ansible将默认使用全局设置。

可以通过设置 ansible_ssh_user 来用指定用户在“受控节点”上执行任务,还可以通过设置 ansible_ssh_host 来指定不同的主机或域名,SSH对应的端口也可以通过 ansible_ssh_port 来修改,同时你还能使用特定的密钥登录。以下示例中,我们在Site01上指定 root 用户运行,而在Site02上指定 nobody 用户运行;同时对上述提到的配置也进行了示范:

[WebServers]
Site01  ansible_ssh_user=root
Site02  ansible_ssh_user=nobody
Site01-dr   ansible_ssh_host=site01-dr.cm

[Production]
Site01  ansible_ssh_port=7722
Site02  
Db01    ansible_ssh_private_key_file=/key/.ssh.id_rsa
Bastion ansible_ssh_user=www

可能有些场景下,执行配置管理需要用到 root 权限。但由于安全原因,可能会限制 root 使用SSH登录。比如:Ubuntu系统默认就不能使用 root 直接SSH登录系统。Ansible设计时也考虑到此类场景,这种情况下我们只需要告诉Ansible使用sudo的方式执行那些需要 root 权限的配置任务。前提条件是执行Ansible任务的用户需要有 sudo 的权限。

要设定Ansible使用sudo,执行Ansible的任务的用户必须要有sudo权限。可以通过修改 /etc/sudoers 文件或 visudo 命令来完成,或者直接使用现在符合条件的用户。参数 –sudo 即告诉Ansible使用sudo来运行任务,如果sudo需要密码,则需要添加 -k 参数,或者在配置文件 /etc/ansible/ansible.cfg 中添加 ask_sudo_pass 的属性。

开始使用Ansible

Ansible使用键值方式接受参数,即传统的KV方式(key=value)。每次执行任务后,将以JSON格式返回结果。它可以解析复杂的参 数,或者用playbooks方式(第2章会讲解)。Ansible返回会明确指明运行是否成功、是否有变动以及失败时的错信息。

通常都用 playbooks 的方式来执行Ansible任务,少数情况下使用命令行模式运行。过去,我们用Ansible的ping模块来检查“受控节点”是否正常受控。而实际 上,ping模块仅仅执行了Ansible最核心的功能并检查了网络联通性,并未做其它实际性动作。

进而产生了 setup 模块,它不仅可以反馈“受控节点”的可用性,还会收集一些系统信息以供其它模块使用。Setup 模块定义了一系列的采集指令,比如:内核版本、机器名、IP地址等等,并将这些信息保存在内置变量,其它模块再执行任务时可以直接引用或用于判断条件。

准备好 hosts 信息后,我们来开始第1次尝试Ansible命令行吧:

$ansible MachineName -u root -k -m setup

以上指令就是通过Ansible向服务器 MachineName以root身份执行setup模块。如上所述,它能收集系统的基础信息,如下表:

字段名 参考值 含义
ansible_architecture    x86_64  受控节点系统框架
ansible_distribution    CentOS  受控节点的操作系统发行版
ansible_distribution_version    6.3 受控节点发行版本的版本号
ansible_domain  kisops.org  受控节点的主域名
ansible_fqdn    site01.kisops.org   受控节点的完整机器名
ansible_interfaces  [“lo”,”eth0”]   列出受控节点所有的网卡
ansible_kernel  2.6.32-431.5.1.el6.x86_64   受控节点的内核版本号
ansible_memtotal_mb 30099   受控节点总内存大小(兆)
ansible_processor_count 24  受控节点的CPU核心
ansible_virualization_role  guest   受控节点的身份:host为宿主机,guest为虚拟机
ansible_virtualization_type kvm 受控节点的虚拟化类型

Ansible的setup模块是用Python获取的。如果受控节点安装有facter或ohai模块,也能通过facter或ohai模块来取值。对应结果将是以 facter_ 或 ohai_ 开头的。

Ansible还有一个基础模块叫file,顾名思义是与文件相关的。它可以用于查看文件的属性、修改文件属性、查询文件是否被修改等等。以下为修改/etc/fstab的示例:

$ ansible MachineName -u root -k -m file -a path=/etc/fstab

结果如下:

MachineName | success >> {
changed”: false,
group”: root”,
mode”: 0644”,
owner”: root”,
path”: “/etc/fstab”,
size”: 779,
state”: file
}

再来看一个示例,在 /tmp 目录下以nobody用户的身份创建一个 ksops 的文件夹:

$ ansible MachineName -u root -k -m file -a path=/tmp/ksops state=directory mode=0755 owner=nobody

返回结果如下:

achineName | sucess >> {
changed”: true,
group”: root”,
mode”: 0755”,
owner”: nobody”,
path”: “/tmp/ksops”,
size”: 4096,
state”: directory

如果目录不存在或属性和预设的不一致,Changed的值就为True。如果相同(比如重复执行指令),Changed的值将变为False。

Ansible有很多模块的用法与file模块类似,比如copy模块。Copy模块的作用就是从“控制节点”上拷贝文件到“受控节点”上。比如将“控制节点”的 fstab 文件拷贝“受控节点”的 /tmp/fstab 下,对应的指令为:

$ ansible MachineName -m copy -a src=fstab  dest=/tmp/fstab mode=644 owner=root

如果是头一次运行,返回值可能是类似:

MachineName | success >> {
changed”: true,
dest”: “/tmp/fstab”,
group”: root”,
md5sum”: 866563b712d204d82876d1153d06c1f1”,
mode”: 0644”,
owner”: root”,
size”: 831,
src”: “/home/ksops/tmp/ansible-task-tmp/source”,
state”: file
}

Ansible有一个非常有用的模块是 command,相信很多人都需要它!Command模块就是“远程执行命令”,用它指执行Shell任务就是分分钟的事情了。而且脚本运行过程中还能使 用setup模块定义的变量,是不是超爽?! 相比Ansible的内置模块而言,Command模块无法通过返回值来判断命令是否执行成功。但Ansible添加了creates 和 removes 的属性,以此检查命令是否成功执行或者是否应该被执行。如果你定义了 creates 属性,当文件已存在时,它不会再执行。相反如果定义了 removes 属性,则只有文件存在的情况下命令才会被执行。比如:

$ ansible MachineName -m command -a rm -rfv /tmp/testfile removes=/tmp/testfile

如果“受控节点”上 /tmp/testfile 并不存在,Ansible则提示跳过,输出如下: MachineName | skipped

否则,如果文件存在,则返回成功:

ansibletest | success | rc=0 >>

实际上,基础的文件操作还是推荐使用Ansible的file模块。因为file模块能获取更多信息,执行状态等信息。同样file模块能创建或删除文件,比如以上用 command 模块执行的文件删除操作,用 file 模块的实现方式如下:

$ ansible MachineName -m file -a path=/tmp/testfile state=absent

针对需要使用到Shell命令的一些特性的场景,Ansible内置了 shell 模块。它可以处理重定向、管道输出、后台任务等功能,同时和 command 模块一样,它也支持 creates 属性。但是, shell 模块不支持 removes 属性。示例如下:

$ ansible MachineName -m shell -a ‘/opt/kingsoft/bin/monitor.sh > /data/log/ops/ksm.log creates=/data/log/ops/ksm.log

获取模块帮忙 Ansible的模块非常多,大家有需要可以去官网按需查看。与Ansible帮助文档相关的就是 ansible-doc 命令了,比如,列出所有模块和简要描述:

$ ansible-doc -l

如果要看指定模块的帮忙信息,以 file 模块为例:

$ ansible-doc file

很简单也很方便。


转载自:http://www.kisops.com/?p=23


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值