Ansible基础

  

1、ansible架构

AnsibleAnsible核心程序。
HostInventory记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins连接插件,Ansible和Host通信使用

 

2、ansible任务执行模式

Ansible系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:

·ad-hoc模式使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令, 而且不需要保存起来的命令。就相当于bash中的一句话shell。
    ·
playbook模式是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作作的配置文件。 

 

3、Ansible命令执行过程

1、 加载自己的配置文件 默认/etc/ansible/ansible.cfg

2、 查找对应的主机配置文件, 找到要执行的主机或者组

3、 加载自己对应的模块文件, 如command

4、 通过ansible将模块或命令生成对应的临时py文件, 并将该文件传

输至远程服务器的

5、 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件

6、 给文件+x执行

7、 执行并返回结果

8、 删除临时py文件, sleep 0退出

简单理解就是Ansible在运行时,首先读取ansible.cfg中的配置,根据规则获取Inventory中的管理主机列表(/etc/ansible/hosts),并行的在这些主机中执行配置的任务,最后等待执行返回的结果。

 

4、ansible配置文件的查找顺序

(1)检查环境变量ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg)

(2)检查当前目录下的ansible.cfg配置文件

(3)~/.ansible.cfg,家目录下的隐藏文件

(4)/etc/ansible.cfg 检查etc目录的配置文件

 

5、ansible主机清单设置

ansible自动化运维_第1张图片

那我们也来定义一个组

image.png

Vim hosts

image.png

将要添加的IP地址添加进去


6、Ansible配置公私钥

首先先在管理机上生成秘钥

ansible自动化运维_第2张图片


生成完应该在根下的.ssh目录下,有一个公钥一个私钥

image009.png

然后我们将私钥发送到那两台需要批量管理的主机上

ansible自动化运维_第3张图片

另一台也一样: ssh-copy-id [email protected]

发完之后我们就可以无密码使用ssh登陆那两台机器了。

image015.png



Ansible常用模块

1、主机测试:

查看主机()

ansible自动化运维_第4张图片


连通性测试:

#ansible all -m ping 

ansible自动化运维_第5张图片

(可以在后面加 -v -vv -vvv查看详细内容)

 

2、 command模块

在远程主机执行命令(不支持|管道命令)

 

分别列出家目录下的列表:

ansible自动化运维_第6张图片

命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如”小于”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模块实现这些功能)。

 

command的一些参数功能:

ansible自动化运维_第7张图片

先切换目录,再执行命令:

ansible自动化运维_第8张图片

creates条件判断:

image027.png


3、shell模块

在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等 

ansible自动化运维_第9张图片

4、copy模块

复制文件到远程主机,可以改权限等

ansible自动化运维_第10张图片


(1) 复制文件

-a “src= dest= ”

ansible自动化运维_第11张图片

可以去后端机器上看一下,确实复制过去了:

image035.png


(2) 给定内容生成文件

-a "content= dest= " 

ansible自动化运维_第12张图片查看一下文件,确实复制成功:

image039.png

然后我们再来运行一次,测试一下backup备份功能,显示内容没变,没有操作(提示是绿色的)ansible自动化运维_第13张图片

如果将内容修改一下,显示内容改变了(而且提示是×××的):

ansible自动化运维_第14张图片

然后我们去查看一下文件:

image045.png


5file模块

设置文件属性

创建目录:-a “path=XXX state=directory

  ansible自动化运维_第15张图片

创建成功

        ansible自动化运维_第16张图片

创建软链接文件:-a “path=XXX src=XXX state=link

        ansible自动化运维_第17张图片

连接成功

        ansible自动化运维_第18张图片

删除文件:-a “path=XXX state=absent

        ansible自动化运维_第19张图片

        删除成功

        ansible自动化运维_第20张图片


ansible自动化运维_第21张图片


6fetch模块

从远程某主机获取文件到本地:

dest用来存放文件的目录,例如存放目录为backup,源文件目录名称为/etc/profile,在主机pythonserver中,那么保存下来的路径为/backup/pythonserver/etc/profile

Src在远程拉取的文件,并且必须是一个file,不能是目录 

ansible自动化运维_第22张图片

它会自动根据主机名创建文件夹,分开保存

ansible自动化运维_第23张图片


7cron模块

管理cron计划任务

ansible自动化运维_第24张图片


设置一个计划任务(如果是每天下午3点,就写成hour=15):

ansible自动化运维_第25张图片

可以使用command或者shell模块查看一下:

ansible自动化运维_第26张图片

设置成功

(如果已经有这个计划任务了就不会再加一次,会自动判断的;如果name一样但是内容不一样,会覆盖之前的。)

删除计划任务:

ansible自动化运维_第27张图片

查看一下,删除成功:

image.png



8yum模块

安装软件

ansible自动化运维_第28张图片

安装:

ansible自动化运维_第29张图片

卸载:

image.png


9service模块

服务程序管理

ansible自动化运维_第30张图片


我们再把vsftpd安装上,然后使用service模块启动它:

ansible自动化运维_第31张图片

去后端看一下:

image.png

确实启动起来了



10user模块

用户模块,管理用户帐号action: user 

ansible自动化运维_第32张图片


创建用户:

ansible自动化运维_第33张图片

去后端看一下,创建成功:

image.png



11group模块

用户组模块,添加或删除组 

ansible自动化运维_第34张图片



12script模块

在指定节点运行服务端的脚本

 

我们在控制端创建个脚本

image.png

加个执行权限,然后运行

ansible自动化运维_第35张图片

去后端机器上看一下,创建成功

image.png



13setup模块

ansible自动化运维_第36张图片

可以查看CPU相关:

ansible自动化运维_第37张图片

这个变量就叫做ansible_processor_vcpus



Ansible playbook

1playbook简介

执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook
       
就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
       
使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

 

2playbook格式

文件的第一行应该以 ”—” (三个连字符)开始,表明YMAL文件的开始。
在同一行中,#之后的内容表示注释,类似于shellpythonruby
YMAL
中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样
- apple - banana - orange等价于JSON的这种格式


[ “apple”, “banana”, “orange” ]
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。


playhostsvariablesrolestasks等对象的表示方法都是键值中间以”:”分隔表示,”:”后面还要增加一个空格。

house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

 

 

 3playbook内容

vim nginx.yml 编辑一个playbook

ansible自动化运维_第38张图片

文件一共有3部分:

hosts部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hostshosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中。
      remote_user指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。
      tasks指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

如果要执行的话,直接使用ansible-playbook nginx.yml即可。

 

4Playbook的核心元素

Hosts主机
Tasks
任务列表
Variables:
变量
Templates
包含了模板语法的文本文件;
Handlers
由特定条件触发的任务;

 

·Playbooks配置文件的基础组件
Hosts
:运行指定任务的目标主机;
remoute_user:
在远程主机上执行任务的用户;
sudo_user

tasks
:任务列表
模块,模块参数;
格式:
(1) action: module arguments
(2) module: arguments
注意:shellcommand模块后面直接跟命令,而非key=value类的参数列表;

 

·taghandlers

 (1) tag

            任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用-t指定进行调用;

                ansible自动化运维_第39张图片

            然后使用ansible-playbook nginx.yml -t startngx命令,就可以只执行启动服务的这段代码了

 

(2) handlers

        某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers

            ansible自动化运维_第40张图片

          我们配置一个handlers

            ansible自动化运维_第41张图片

        我们给copy nginx.conf加了个标签并且添加了一个任务,如果需要修改配置文件的话,就修改好之后只运行copyconf标签那部分,然后它在把配置文件推送过去之后就会触发这个restart nginx的任务,于是就执行下面的重启任务,就完成了一次配置文件的替换。

 

·变量

设置变量有四种方法

(1) facts:可直接调用;
    注意:可使用setup模块直接获取目标主机的facters

(2) 用户自定义变量:
 (a) ansible-playbook命令的命令行中的
    -e VARS, --extra-vars=VARS
 (b) playbook中定义变量的方法:
    vars:
    - var1: value1
    - var2: value2

(3) 通过roles传递变量;

(4) Host Inventory
 (a) 用户自定义变量
 (i) 向不同的主机传递不同的变量;
      IP/HOSTNAME varaiable=value var2=value2
 (ii) 向组中的主机传递相同的变量;
      [groupname:vars]
      variable=value
[web]
172.17.251.188
172.17.250.209
[web:vars]
rpmname=samba

 

我们修改刚才的playbook,将所有的nginx都换成变量rpmname

ansible自动化运维_第42张图片

然后我们运行的时候使用ansible-playbook nginx.yml -e rpmname=nginx命令,这样运行的结果就跟之前一样了。

这样设置了变量的话,我们想装哪个包就可以装哪个了

我们也可以将变量的值写到playbook中:

ansible自动化运维_第43张图片

这样就设置成功了,直接使用ansible-playbook nginx.yml运行即可。