Ansible的详细解读之【inventory 主机清单和playbook剧本】

  • 一、inventory 主机清单
  • 1.1 主机变量
  • 1.2 组变量
  • 1.3 组嵌套
  • 二、剧本(playbook)
  • 2.1 playbook介绍
  • 2.2 playbooks 的组成
  • 2.3 案例:编写httpd的playbook


一、inventory 主机清单

Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

如果是名称类似的主机,可以使用列表的方式表示各个主机
vim /etc/ansible/hosts
[webservers]
192.168.80.50:2222			#冒号后定义远程连接端口,默认是ssh的22端口
192.168.80.5[1:5]			#范围是:192.168.80.51到192.168.80.55

[dbservers]
db-[a:f].example.org		#支持匹配 a~f

inventory 中的变量

Inventory变量名

含义

ansible_host

ansible连接节点时的IP地址

ansible_port

连接对方的端口号,ssh连 接时默认为22

ansible_user

连接对方主机时使用的主机名。不指定时,将使用执行ansible或ansible-playbook命令的用户

ansible_passwd

连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效

ansible_ssh_private_key_file

指定密钥认证ssh连接时的私钥文件

ansible_ssh_common_args

提供给ssh、sftp、 scp命 令的额外参数

ansible_become

允许进行权限提升

ansible_become_method

指定提升权限的方式,例如可使用sudo/su/runas等方式

ansible_become_user

提升为哪个用户的权限,默认提升为root

ansible_become_password

提升为指定用户权限时的密码


1.1 主机变量

[webservers]
192.168.80.50 ansible_port=22 ansible_user=root ansible_password=abc123			#不建立将密码直接写入配置,不安全

1.2 组变量

[webservers:vars]				#表示为 webservers 组内所有主定义变量
ansible_user=root
ansible_password=abc1234

[all:vars]						#表示为所有组内的所有主机定义变量
ansible_port=22

1.3 组嵌套

[nginx]
192.168.80.50
192.168.80.60
192.168.80.70

[apache]
192.168.80.5[0:3]

[webservers:children]
nginx					#表示为 webservers 主机组中包含了nginx组和apache组内的所有主机
apache

二、剧本(playbook)

2.1 playbook介绍

____playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的tasks,可以让远端主机达到预期的状态。playbook是由一个或多个”play”组成的列表。 当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。


____ansible通过不同的模块实现相应的管理,管理的方式通过定义的清单文件(hosts)所管理的主机包括认证的方式连接的端口等。所有的功能都是通过调用不同的模块(modules)来完成不同的功能的。不管是执行单条命令还是play-book都是基于清单文件。


playbook格式:

  • playbook由YMAL语言编写。YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
  • 一个剧本里面可以有多个play,每个play只能有一个tasks,每个tasks可以有多个name。

2.2 playbooks 的组成

  1. Tasks:任务,即通过 task 调用 ansible 的模块将多个操作组织在一个playbook 中运行。
  2. Variables:变量
  3. Templates:模板
  4. Handlers:处理器,当 changed 状态条件满足时,(notify)触发执行的操作。
  5. Roles:角色

2.3 案例:编写httpd的playbook

vim test1.yaml
---     #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play     #定义一个play的名称,可省略
  gather_facts: false    #设置不进行facts信息收集,这可以加快执行速度,可省略
  hosts: webservers    #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
  remote_user: root    #指定被管理主机上执行任务的用户
  tasks:     #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
   - name: test connection    #自定义任务名称
     ping:     #使用 module: [options] 格式来定义一个任务
   - name: disable selinux
     command: '/sbin/setenforce 0'    #command模块和shell模块无需使用key=value格式
     ignore_errors: True     #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
   - name: disable firewalld
     service: name=firewalld state=stopped    #使用 module: options 格式来定义任务,option使用key=value格式
   - name: install httpd
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf    #这里需要一个事先准备好的/opt/httpd.conf文件
     notify: "restart httpd"    #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:     #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
   - name: restart httpd    #notify和handlers中任务的名称必须一致
     service: name=httpd state=restarted

① Ansible 管理端编写好playbook剧本

ansible 主机名 ansible 主机列表_playbook

② 在webservers端(client1)准备httpd模板配置文件

ansible 主机名 ansible 主机列表_linux_02


③ 在webservers端(client1)将准备好的httpd模板配置文件发送到Ansible管理端

ansible 主机名 ansible 主机列表_playbook_03


④ 确认被控制端的httpd服务是否安装,firewalld处于开启状态,本机的httpd模板文件准备完成并且路径和剧本配置一致

ansible 主机名 ansible 主机列表_运维_04

⑤ 执行playbook剧本

ansible 主机名 ansible 主机列表_linux_05


⑥ 检查被deservers控制端(client2)192.168.80.60的httpd服务和防火墙状态以及httpd配置文件

ansible 主机名 ansible 主机列表_playbook_06

ansible 主机名 ansible 主机列表_linux_07