Ansible(剧本,角色编写)

一、剧本(playbook)

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.playbooks的组成

**Tasks:**任务,即通过 task 调用 ansible 的模块将多个操作组织在一个playbook 中运行。

**Variables:**变量

**Templates:**模板

**Handlers:**处理器,当 changed 状态条件满足时,(notify)触发执行的操作。

**Roles:**角色

3.案例:编写httpd的playbook

(1)vim test1.yaml

---
- name: install apache
  hosts: webservers
  remote_user: root
  tasks:
  - name: test connection
    ping:
  - name: disable selinux
    command: '/usr/sbin/setenforce 0'
    ignore_errors: true
  - name: disable firewalld
    service: name=firewalld state=stopped
  - name: install httpd
    yum: name=httpd
  - name: copy configuration file for httpd
    copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: "restart httpd"
  - name: start httpd
    service: name=httpd state=started enabled=yes
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3GYpZJo0-1647754704509)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\3.bmp)]

在服务端准备http.conf文件

(在/etc/httpd/http.conf 复制一份文件到opt目录下 )

并且修改其中 端口 和server name 端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qejaMZg-1647754704510)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\0.1.bmp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BaW9RqWv-1647754704511)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\1.bmp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wxFsYXQd-1647754704511)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\2.bmp)]

(2)运行playbook 剧本

ansible-playbook test1.yaml

补充参数:
-k ( -ask-pass) :用来交互输入ssh密码
-K ( -ask-become-pass) :用来交互输入sudo密码
-u:指定用户

ansible-playbook test1.yaml --syntax-check
检查yaml文件的语法是否正确
ansible-playbook test1.yaml --list-task
#检查tasks任务
ansible-playbook test1.yaml --list-hosts
#检查生效的主机
ansible-playbook test1.yaml --start-at-task='install httpd'
#指定从某个task开始运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecFA58Fd-1647754704512)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\4.bmp)]

查看 客户端(192.168.100.142)端口8080是否开启

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qx04Arfn-1647754704513)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\5.bmp)]

4.定义,应用变量

例:

- name: second play
hosts: dbservers
remote_user: root
vars: #定义变量
- groupname: mysql #格式为 key: value
- username: nginx
tasks:
- name: create group
group: name={
   
   {groupname}} system=yes gid=306 #使用 {
   
   {key}} 引用变量的值
- name: create user
user: name={
   
   {username}} uid=306 group={
   
   {groupname}}
- name: copy file
copy: content="{
   
   {ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模块中可以获取facts变量信息

实操:运用变量编写一个设置用户 基本组和gid 号 以及统计webserver组中的ip信息

(1)vim test2.yaml

- name: second play
  hosts: dbservers
  remote_user: root
  vars:
  - groupname: ng
  - username: nb
  tasks:
  - name: create group
    group: name={
   
   {groupname}} system=yes gid=1314
  - name: create user join in group ng
    user: name={
   
   {username}} uid=1314 group={
   
   {groupname}} shell=/sbin/nologin
  - name: copy file content
    copy: content="{
   
   {ansible_default_ipv4}}" dest=/opt/ipv4.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6bkskqzo-1647754704514)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\6.bmp)]

(2)到其中一个客户机上面查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wmMqq7Z-1647754704514)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\7.bmp)]

在命令行中去指定变量

ansible-playbook test2.yaml -e "username=ZQH"

去客户端查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9xD2Tk6-1647754704515)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\9.bmp)]

5.指定远程主机sudo切换用户

---
- hosts: dbservers
remote_user: zhangsan
become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: root #指定sudo用户为root
执行playbook时:ansible-playbook test1.yml -K <密码>

6.when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

when实例:

- name: play3
  hosts: all
  remote_user: root
  tasks:
  - name: create dir
    file: path=/opt/play3 state=directory
    when: ansible_default_ipv4.address == "192.168.100.142"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6FRUjot-1647754704516)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\10.bmp)]

在这里插入图片描述

切换到142主机上查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kODaHVyV-1647754704518)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\12.bmp)]

你也可以指定主机名

when:inventory_hostname == "<主机名>"

7.迭代

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。

- name: play1
  hosts: dbservers
  gather_facts: false
  tasks:
    - name: create directories
      file:
        path: "{
   
   {item}}"
        state: directory
      with_items:
        - /tmp/test1
        - /tmp/test2
    - name: add users
      user: name={
   
   {item.name}} state=present groups={
   
   {item.groups}}
      with_items:
        - name: test1
          groups: wheel
        - name: test2
          groups: root

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3KosfwMW-1647754704518)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\13.bmp)]

运行脚本到客户机上查看

ansible-playbook demo2.yaml 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OBGJbC1f-1647754704519)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\14.bmp)]

8.Templates 模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

(1)首先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
Listen {
   
   {http_port}}            #42行,修改
ServerName {
   
   {http_servername}}  #95行,修改
DocumentRoot "{
   
   {http_rootdir}}" #119行,修改

(2).修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

 [webservers]
 192.168.100.142 http_port=192.168.100.142:80 http_servername=www.aa.com:80 http_rootdir=/etc/httpd/htdocs
 192.168.100.140 http_port=192.168.100.140:80 http_servername=www.bb.com:80 http_rootdir=/etc/httpd/htdocs

 [dbservers]
 192.168.100.142 http_port=192.168.100.142:80 http_servername=www.aa.com:80 http_rootdir=/etc/httpd/htdocs

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aS4Z5Njz-1647754704520)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\15.bmp)]

(3).编写 playbook

vim /opt/httpd.conf.j2

---
- hosts: all
  remote_user: root
  vars:
    - pkg: httpd
    - svc: httpd
  tasks:
    - name: install httpd package
      yum: name={
   
   {pkg}} state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify:
        - restart httpd
    - name: create root dir
      file: path=/etc/httpd/htdocs state=directory
    - name: start httpd server
      service: name={
   
   {svc}} enabled=yes state=started
  handlers:
    - name: restart httpd
      service: name={
   
   {pkg}} state=restarted

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GAjveN66-1647754704520)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\16.bmp)]

(4).运行脚本,到客户机查看配置文件是否被引用变量

vim /etc/httpd/conf/httpd.conf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cw7F2aFP-1647754704521)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\18.bmp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9rP52KZ-1647754704521)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\19.bmp)]

9.tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用–tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

实例:

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: touch file1
      file: name=/opt/file1 state=touch
      tags:
      - only
    - name: touch file2
      file: name=/opt/file2 state=touch

    - name: touch file3
      file: name=/opt/file3 state=touch

指定only标签运行

ansible-playbook webhosts.yaml --tags="only"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uu6uCrXZ-1647754704522)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\20.bmp)]

如果说要始终运行 加入always

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7CR1Epe-1647754704522)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\21.bmp)]

 ansible-playbook webhosts.yaml --tags="two"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vg5j6boi-1647754704523)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\22.bmp)]

10.Roles模块
Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

//roles 内各目录含义解释

●files
用来存放由 copy 模块或 script 模块调用的文件。

●templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。

●tasks
此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。

●handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。

●vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。

●defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。

●meta
此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

例:部署简化LAMP(f除开files目录和templates目录不需要创建main.yml文件,其余都要各个目录下都要创建)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iev1PVBv-1647754704523)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\23.bmp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dPwQDHE-1647754704524)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\24.bmp)]

(1)在 roles 目录中分别创建以各角色名称命名的目录

如mysql nginx 、。。。。

(2)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

(3)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

(4)编写apache模块

vim apache/tasks/main.yml

- name: install apache
  yum: name={
   
   {pkg}} state=latest
- name: start apache
  service: name={
   
   {svc}} enabled=yes state=started

vim apache/vars/main.yml

pkg: httpd
svc: httpd

(5)编写mysql模块

vim mysql/tasks/main.yml

- name: install mysql
  yum: name={
   
   {pkg}} state=latest
- name: start mysql
  service: name={
   
   {svc}} enabled=yes state=started

vim mysql/vars/main.yml

pkg:
- mariadb
- mariadb-server
svc: mariadb

(6)编写php模块

vim php/tasks/main.yml

- name: install php php-fpm
  yum: name={
   
   {pkg}} state=latest
- name: start php-fpm
  service: name={
   
   {svc}} enabled=true state=started

vim php/vars/main.yml

pkg:
- php
- php-fpm
svc: php-fpm

(7)编写roles

- hosts: dbservers
  remote_user: root
  roles:
   - apache
   - mysql
   - php

(8)运行脚本

ansible-playbook demo3.yaml 

这里出了一个小报错,在启动fpm的时候出现报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-psUW8yeZ-1647754704524)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\25.bmp)]

切换到142查看报错

查看报错日志

journalctl -xe

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILa8wMTk-1647754704525)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\26.bmp)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oa2XP8qY-1647754704525)(C:\Users\zhuquanhao\Desktop\截图命令集合\linux\Ansible\Ansible之playbook剧本\27.bmp)]

猜你喜欢

转载自blog.csdn.net/weixin_54059979/article/details/123611719