天天看点

ansible

ansible

ansible
ansible
ansible

通过前面的介绍我们知道,ansible是基于ssh协议来进行数据传输,ssh连接一般有两种方法,一种是使用密码密钥,一种是使用公私密码免密码登录,为了顺利使用ansible,下面配置基于公私密码免密码登录

ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行;

1)ping:探测目标主机是否存活;

2)command:默认模块,可省略。在远程主机上进行操作命令

-a 'command'

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

-a 'command' 运行shell命令

注意:command和shell模块的核心参数直接为命令本身;而其它模块的参数通常为“key=value”格式;

4)copy:复制文件到远程主机

用法:(1) 复制文件 -a "src= dest= "(2) 给定内容生成文件 -a "content= dest= "

5)file:文件管理

用法:(1) 创建目录:-a "path= state=directory" (2) 创建链接文件:-a "path= src= state=link" (3) 删除文件:-a "path= state=absent“

6)cron:管理周期性计划任务

用法:-a ' minute= hour= day= month= weekday= job= name= user= state={present|absent}'

7)hostname:设置主机名

用法:name=

8)yum:使用yum包管理器完成程序包管理

用法:(1) -a "name= state={present|latest}" 安装程序包,(2) -a "name= state=absent" 删除程序包

9)service:控制服务

用法:-a 'name= state={started|stopped|restarted} enabled=(是否开机自动启动) runlevel='

10)group:添加或删除组

用法:-a 'name= state={present|absent} gid= system=(系统组)'

11)user:管理组帐号

用法:-a 'name= state={present(创建)|absent(删除)} force=(是否强制操作删除家目录) system= uid= shell= home='

12)script:运行脚本

用法:-a '/path/to/script'运行脚本

13)setup:获取指定主机的facts变量;

playbooks是ansible更强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行

yaml类似于半结构化数据,声明式配置;可读性较高的用来表达资料序列的格式,易于与脚本语言交互

1)任何数据结构都用缩进来标识,可以嵌套

2)每一行是一个键值数据key:value,冒号隔开。若想在一行标识需要用{ }和,分隔格式

3)列表用 – 标识

1)核心元素

2)基础组件:

3)playbook定义任务: playbook的存储在*.yaml文本中,需要创建一个yaml文件

ansible

4)ansible-playbook执行命令:

5)playbook---variables 变量

6)templates:模板

文本文件,内部嵌套有模板语言脚本(使用模板语言编写)模板文件中可使用jinja2表达式,表达式要定义在{{}},也可以简单地仅执行变量替换;

语法:

7)条件测试

在某task后面添加when子句即可实现条件测试功能;when语句支持jinja2语法;

有的时候在特定的主机需要跳过特定的步骤,例如在安装包的时候,需要指定主机的操作系统类型,或者是当操作系统的硬盘满了之后,需要清空文件等,可以使用when语句来做判断 。when关键字后面跟着的是python的表达式,在表达式中你能够使用任何的变量或者fact,当表达式的结果返回的是false,便会跳过本次的任务

示例:当系统版本是centos6和7时各使用不同的命令

8)循环:迭代,需要重复执行的任务;在task中调用内置的item变量;在某task后面使用with_items语句来定义元素列表;

元素:列表有两种方式; 字符串和字典

循环迭代:基于字符串列表给出元素示例:

循环迭代:基于字典列表给元素示例:

9)roles:角色

当单个playbook文件越来越大的时候,我们就需要重新来组织playbooks了。我们可以将一个大的playbook拆成若干个小的 playbook文件,然后通过include的方式,在主配置文件中将这些零碎的小文件包含进来,这叫做playbook的包含。我们也可以按照一定的 规则将执行的某一类型任务放在一个目录里,并在这个目录中再次对这个playbook按照 tasks,handlers,files,templates,vars等类型划分成若干文件,将对应文件存放在对应的目录中,这种组织方式就叫做 playbook的roles。

以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;

role_name/

files/:存储由copy或script等模块调用的文件; tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用; handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用; vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用; templates/:存储由template模块调用的模板文本; meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用; default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

在playbook中调用角色的方法: - hosts: hosts remote_user: username roles: - role1 - role2 - { role: role3, variable: value, ...} - { role: role4, when: condition }

1)基础示例

正式使用时我们最好先预运行下看有没有错误

没有问题就可以正式运行命令脚本了

ansible

2)handlers:由特定条件触发的tasks;

只有其关注的条件满足时,才会被触发执行的任务;

调用及定义方式:

handlers示例:

ansible

3)tags:给指定的任务定义一个调用标识;

tags示例:

ansible
ansible
ansible
ansible

4)variables示例(1)

ansible

4)variables示例(2):向不同的系统传递不同的变量

编辑剧本

编辑hosts文件,将变量赋值到hosts对应的主机后,实现不同主机安装不同的程序包

4)variables示例(3):在hosts文件中向一个主机组赋值变量

5)templates:模板;示例1

第一步:ansible主机编辑配置文件作为要使用templates传递的文件;以nginx的配置文件中的cpu核心数为例

第二步:编辑playbook调用templates模块

第三步:执行playbook命令

第四步:在对应的被管控主机上查看配置文件中的变量是否是响应的值

5)templates:模板;示例2:定义一个名为nginx.yaml的模版剧本,完成安装nginx程序包,复制配置文件,启动服务,定义tags通知处理器完成服务重载

第一步:在ansible主机的/etc/ansible/hosts文件中定义一个nginx组

第二步:写一个nginx专用的yaml文件,注意:在安装程序包的时候依赖与远程主机的yum源,如果没有yum源的话,可以使用shell模块让远程主机先下载一个程序包,然后再执行后续的安装任务,在安装任务时指明yum: name=绝对路径来进行

第三步:提供一个.j2结尾的nginx配置文件,里边写上自己需要的配置

第四步:执行ansible-playbook命令,运行nginx.yaml

第五步:在远程主机查看是否生效

6)循环迭代:基于字符串列表给出元素示例:

7)循环迭代:基于字典列表给元素示例:

8)roles示例nginx

8)relos示例memcached

8)relos示例mysqk