ansible学习之旅(初识play-book)

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: ansible学习之旅(初识play-book)

简介

playbook是一个由yaml语法编写的文本文件,由play和task两部分组成

play: 主要定义要操作的主机或主机组

task: 主要定义对主机或主机组具体的执行任务,可以是一个或多个

playbook是由一个或多个play组成,可以包含多个task任务,可以理解为多个不同的模块共同完成一件事情


playbook与ad-hoc的区别

playbook是对ad-hoc的编排方式

playbook可以持久运行,而ad-hoc是临时性的

playbook适合复杂任务,而ad-hoc只能做快速简单的任务

playbook可以控制任务的执行顺序


playbook语法格式

playbook是yaml语法书写,结构清晰,可读性强

demo

[root@k81 an]# cat > y1.yaml <<EOF
---
- name: test-playbook # play的名字
  hosts: ubuntus # 被控端主机
  remote_user: root # 被控端的用户
  vars: # 变量
    file_name: xiaohu # 定义一个该playbook可用的变量
  tasks: # 任务
  - name: Installed nginx-server # 任务名
    apt:  # 模块,这边是Ubuntu系统所以用的apt,如对端是rhel系列需要修改为yum模块
      name: nginx
      state: present
  - name: Systemd nginx-server 
    systemd: 
      name: nginx
      state: started
      enabled: yes 
EOF
## 在执行playbook之前我们可以检查一下playbook的语法,类似于shell中检查sh -n xxx.sh
[root@k81 an]# ansible-playbook --syntax y1.yaml 
## 模拟执行playbook
[root@k81 an]# ansible-playbook y1.yaml -C
## 真正执行playbook
[root@k81 an]# ansible-playbook y1.yaml


从零开始编写playbook

我们为play新建一个项目文件夹,后续操作在这个文件夹进行

[root@k81 an]# mkdir playbook
[root@k81 an]# cd !$
cd playbook
[root@k81 playbook]# cp /etc/ansible/{ansible.cfg,hosts} .
[root@k81 playbook]# ls
ansible.cfg  hosts
[root@k81 playbook]# sed -i 's@#inventory      = /etc/ansible/hosts@inventory      = ./hosts@' ansible.cfg 
[root@k81 playbook]# vim ansible.cfg 
[root@k81 playbook]# ansible --version
ansible 2.9.27
  config file = /an/playbook/ansible.cfg
# 可以看到配置文件已经是当前目录下的ansible.cfg了


开始之前

playbook的主机组的书写方式

[root@k81 an]# cat except.yaml 
- hosts: all  #所有组
  tasks:
  - name: debug
    debug: msg="test"
[root@k81 an]# cat except.yaml 
- hosts: all:!k8s   # 排除k8s组
  tasks:
  - name: debug
    debug: msg="test"
[root@k81 an]# cat except.yaml 
- hosts: all:!k8s:!db   # 排除k8s组和db组
  tasks:
  - name: debug
    debug: msg="test"


第一个playbook开始

简单写一个服务

我们以安装一个nfs服务器为第一个例子

[root@k81 playbook]# cat > exports.j2  <<EOF
/ansible_test 10.10.21.0/24(rw,all_squash,anonuid=7777,anongid=7777)
EOF
# 先准备一个nfs的配置文件
[root@k81 playbook]# cat nfs.yaml 
---
- hosts: ub1
  tasks:
  - name: 0. Configure apt
    apt_repository:
      repo: 'deb http://mirrors.ustc.edu.cn/ubuntu/ {{ ansible_distribution_release }} main restricted universe multiverse'
      state: present
      update_cache: yes
  - name: 1. Install nfs-server
    apt:
       name: nfs-kernel-server # rhel下为nfs-utils
       state: present
  - name: 2. Configure nfs-server
    copy:
      src: ./exports.j2
      dest: /etc/exports
  - name: 3. Init user and group
    user: 
      name: test
      uid: 777
      shell: /sbin/nologin
      create_home: no
  - name: 4. Init nfs-server
    file:
      path: /ansible_test
      state: directory
      owner: test
      group: test
      mode: "0755"
  - name: 5. Start nfs-server
    systemd: 
      name: nfs
      state: started
      enabled: yes
[root@k81 playbook]# vim nfs.yaml 
## 编写一个playbook
[root@k81 playbook]# cat nfs.yaml 
---
- hosts: ub1
  tasks:
  - name: 0. Configure apt
    apt_repository:
      repo: 'deb http://mirrors.ustc.edu.cn/ubuntu/ {{ ansible_distribution_release }} main restricted universe multiverse'
      state: present
      update_cache: yes
  - name: 1. Install nfs-server
    apt:
       name: nfs-kernel-server # rhel下为nfs-utils
       state: present
  - name: 2. Configure nfs-server
    copy:
      src: ./exports.j2
      dest: /etc/exports
  - name: 3. Init user and group
    user: 
      name: test
      uid: 7777
      shell: /sbin/nologin
      create_home: no
  - name: 4. Init nfs-server
    file:
      path: /ansible_test
      state: directory
      owner: test
      group: test
      mode: "0755"
  - name: 5. Start nfs-server
    systemd: 
      name: nfs-kernel-server # rhel下为nfs
      state: started
      enabled: yes


引入新的配置

如果nfs已经是启动状态,再把systemd的state设置started,那么修改配置文件并不会生效,因此我们需要新引进一个handlers的模块


在Ansible中,handlers是一种特殊的任务,在任务执行完成后,如果有任何任务通知该handler,则该handler将被触发。handlers通常用于在某些特定的任务完成后,执行一些额外的操作,例如重新启动服务或重新加载配置文件。


Handlers的触发是通过notify关键字来实现的。在任务中,使用notify关键字来通知handlers。


那么我们就可以来根据原来的playbook文件进行修改了

........
  - name: 2. Configure nfs-server
    copy:
      src: ./exports.j2
      dest: /etc/exports
    notify: Restart nfs-server # 在修改了配置文件之后触发handlers
........
  handlers: # handlers与tasks同级别,一般写在playbook的最后面
  - name: Restart nfs-server  # 这任务名一定要和notify一致
    systemd:
      state: restarted
      name: nfs-kerner-server

然后我们可以测试一下,不修改exports.j2运行playbook和修改了再运行

[root@k81 playbook]# echo "###" >> exports.j2
[root@k81 playbook]# ansible-playbook nfs.yaml 
....
PLAY RECAP ********************************************************************************************************************************************************************************
ub1                        : ok=8    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
## 可以看到这次changed=2
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7月前
|
运维 关系型数据库 Shell
小白带你学习linux自动化运维ansible
小白带你学习linux自动化运维ansible
197 0
小白带你学习linux自动化运维ansible
|
Shell 网络安全 开发工具
|
运维 网络安全 数据安全/隐私保护
ansible学习之旅(入门篇)
ansible学习之旅(入门篇)
416 0
|
应用服务中间件 网络安全 开发工具
学习ansible常用模块这篇就够了(剧本)(二)
学习ansible常用模块这篇就够了(剧本)
116 0
|
运维 应用服务中间件 Shell
学习ansible常用模块这篇就够了(剧本)(一)
学习ansible常用模块这篇就够了(剧本)
229 0
|
运维 Shell 网络安全
|
数据安全/隐私保护 Memcache
ansible学习之旅(其它特性)
ansible学习之旅(其它特性)
62 0
|
Kubernetes 负载均衡 Docker
ansible学习之旅(ansible依托kubeadm安装一个简单的k8s集群)
ansible学习之旅(ansible依托kubeadm安装一个简单的k8s集群)
130 0
|
存储 JSON 缓存
ansible学习之旅(facts变量)
ansible学习之旅(facts变量)
144 0
ansible学习之旅(初识变量)
ansible学习之旅(初识变量)
69 0