Ansible剧本

时间:2020-02-23 14:29:38  来源:igfitidea点击:

Ansible中的剧本以YAML格式编写。
它是一种人类可读的数据序列化语言。
它通常用于配置文件。
它也可以用于存储数据的许多应用程序中。

对于Ansible,几乎每个YAML文件都以列表开头。
列表中的每个项目都是键/值对的列表,通常称为"哈希"或者"字典"。
因此,我们需要知道如何在YAML中编写列表和字典。

列表的所有成员都是以""(破折号和空格)开头的相同缩进级别的行。
更复杂的数据结构是可能的,例如字典列表或者混合字典,其值是列表或者两者的混合。

例如有关道路上的部门的列表:

departments:
- marketing
- sales
- solutions
- content writing
- support
- product

现在让我给你一个字典的例子:

-USA
-continent: North America
-capital: Washington DC
-population: 319 million

主机和用户:

对于剧本中的每个剧本,我们都可以选择基础结构中要定位的计算机以及要完成任务的远程用户。
要将主机包含在Ansible列表中,我们将使用主机的IP地址。

通常,主机是由冒号分隔的一个或者多个组或者主机模式的列表。
远程用户只是用户帐户的名称。

变量:

Ansible使用先前定义的变量来使剧本和角色具有更大的灵活性。
它们可用于遍历一组给定的值,访问各种信息(例如系统的主机名),并用特定值替换模板中的某些字符串。

Ansible已经定义了丰富的变量集,每个系统都有各自的变量。
只要Ansible将在系统上运行,就会收集有关该系统的所有事实和信息并将其设置为变量。

但是有一个命名变量的规则。
变量名称应为字母,数字和下划线。
变量应始终以字母开头。
例如。
wamp_21,port5是有效的变量名,而01_port,_server无效。

任务:

通过任务,我们可以将配置策略的各个部分分解为较小的文件。
任务包括从其他文件中提取。
Ansible中的任务几乎具有其英文含义。

例如:安装<package_name>,更新<software_name>等。

处理程序:

处理程序就像Ansible剧本中的常规任务一样,但是仅在Task包含notify指令并且还指示它已更改某些内容时才运行。
例如,如果更改了配置文件,则引用该配置文件的任务可能会通知服务重新启动处理程序。

让我为我们提供一个剧本示例,它将启动Apache httpd服务器程序:

--
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

我希望该示例将使我们与我上面提到的剧本组件的所有描述相关联。
如果我们仍然不清楚,请不要担心,所有疑问都将在本教程 的后面部分得到澄清。

这都是关于剧本的。
我们将编写的剧本。
但是Ansible也为我们提供了广泛的模块,我们可以使用它们。

Ansible教程模块

Ansible中的模块是幂等的。
从RESTful服务的角度来看,要使操作(或者服务调用)具有幂等性,客户端可以重复进行相同的调用,同时产生相同的结果。
换句话说,发出多个相同的请求与发出单个请求具有相同的效果。

Ansible中有不同类型的模块

  • 核心模块

  • 添加模块

核心模块

这些是Ansible核心团队维护的模块,并将始终随Ansible一起提供。
与"额外"Repo中的请求相比,它们还将对所有请求获得更高的优先级。

这些模块的源代码由Ansible在GitHub上的Ansible-modules-core托管。

添加模块

这些模块当前随Ansible一起提供,但将来可能会单独提供。
它们也主要由Ansible社区维护。
非核心模块仍然可以完全使用,但是对于问题和请求请求的响应率可能会略低。

随着时间的流逝,流行的"额外"模块可能会升级为核心模块。

这些模块的源代码由Ansible在GitHub上的Ansible-modules-extras托管。

例如:远程管理模块中的Extras模块之一是ipmi_power模块,它是远程计算机的电源管理器。
它需要python 2.6或者更高版本以及pyghmi才能运行。

我们可以通过编写一个即席命令来使用此模块,就像我在下面编写的一样:

ipmi_power : name ="test.domain.com" user="localhost" password="xyz" state="on"

Ansible教程返回值

Ansible模块通常返回一个数据结构,该数据结构可以注册到变量中,或者在Ansible程序输出时直接看到。
每个模块可以选择记录其自己的唯一返回值。

返回值的一些示例是:

  • 更改:任务执行任何更改时,返回布尔值。

  • 失败:如果任务失败,则返回一个布尔值

  • msg:它返回一个字符串,其中包含传递给用户的通用消息。

Ansible教程AdHoc命令

Adhoc命令是执行某些操作的简单一行命令。
使用Ansible命令运行的模块是adhoc命令。

例如:

ansible host -m netscaler -a "nsc_host=nsc.example.com user=apiuser password=apipass"

上面的adhoc命令使用netscaler模块来禁用服务器。
Ansible中提供了数百个模块,我们可以其中引用和编写即席命令。

好了,所有理论解释都足够,让我动手为我们解释Ansible。

Ansible教程动手

我要写一本手册,在我的节点/主机上安装Nginx。

让我们开始 :)

步骤1:使用SSH连接到主机。
为此,我们需要生成一个公共SSH密钥。

使用以下命令:

ssh-keygen

如我们在上面的快照中所见,命令ssh-keygen生成了一个公共SSH密钥。

步骤2:下一个任务是在主机上复制公共SSH密钥。
为此,请使用以下命令:

ssh-copy-id -i root @ <主机的IP地址>

上面的快照显示了将SSH密钥复制到主机。

步骤3:在列表中列出主机/节点的IP地址。

使用以下命令:

vi/etc/ansible/hosts

这将打开一个vi编辑器,我们可以其中列出主机的IP地址。
现在这是库存。

步骤4:让我们执行ping操作以确保已建立连接。

上面的快照确认控制计算机和主机之间已建立连接。

步骤5:现在让我们写一个剧本,在主机上安装Nginx。
我们可以在vi编辑器中编写剧本。
为此,只需使用以下命令创建剧本:

vi <文件名> .yml

下面的快照显示了我的剧本,用于安装以YAML格式编写的Nginx。

剧本的任务在YAML中定义为字典列表,并自上而下执行。
如果我们有多个主机,则在继续进行下一个任务之前,将针对每个主机尝试每个任务。
每个任务都定义为字典,可以具有多个键,例如" name"或者" sudo",它们表示任务的名称以及它是否需要sudo特权。

设置了一个变量server_port,该变量在TCP端口8080上侦听传入的请求。

其中第一个任务是获取用于安装Nginx的必要软件包,然后进行安装。
在内部,Ansible将检查目录是否存在,如果不存在则创建该目录,否则将不执行任何操作。

下一个任务是配置Nginx。
在Nginx中,上下文包含配置详细信息。

其中模板是一个可以部署在主机上的文件。
但是,模板文件还包含一些参考变量,这些参考变量是从定义为Ansible剧本的一部分的变量或者从主机收集的事实中提取的。
包含配置详细信息的事实将从源目录中提取并复制到目标目录中。

此处的处理程序定义仅在通知任务或者状态更改时才执行的动作。
在此剧本中,我们定义了以下通知:重启Nginx处理程序,一旦将文件和模板复制到主机,它将重新启动Nginx。

现在,保存文件并退出。

步骤6:现在,使用以下命令运行此剧本:

ansible-playbook <文件名> .yml

我们可以在上面的屏幕截图中看到我们的任务正在执行;正在安装Nginx。

步骤7:让我们检查一下我的主机上是否安装了Nginx。
使用以下命令:

ps waux | grep nginx

我们可以在上面的屏幕截图中看到不同的进程ID 3555和103316正在运行,这确保Nginx在主机上运行。