【Linux32-4】playbook详解(一)

1. playbook简介


  • Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常之强大的.
  • 简单来说,playbooks 是一种简单的配置管理系统与多机器部署系统的基础.与现有的其他系统有不同之处,且非常适合于复杂应用的部署.
  • Playbooks 可用于声明配置,更强大的地方在于,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
  • 我们使用 adhoc 时,主要是使用 /usr/bin/ansible 程序执行任务.而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范

2. playbook要求


2.1 语法结构


ymal中文文档官方


每一个 YAML 文件都是从一个列表开始. 列表中的每一项都是一个键值对, 通常它们被称为一个 “哈希” 或 “字典”. 所以, 我们需要知道如何在 YAML 中编写列表和字典


  • 文件的第一行应该以 - - -这三个连续字符开始(无空格),代表了YAML文件的开始
  • 在一行中,# 后面的内容代表注释,python,ruby,shell都是如此
  • YAML中的列表元素- 开头(一个横杠和一个空格),后面为元素内容
  • 在同一个列表中的元素应该保持相同缩进,否则会当作错误处理
  • 一个字典是由一个简单的键值对key: value表示,中间以 : 分割(冒号后面必须是一个空格)
  • 文件名称后缀为.yml.yaml

一个列表应有相同的缩进:
- list
- list
一个字典由简单的键值组成:
key: value
key: value
字典也可以用缩进表示:
---
{
    
    key: value,key: value,key: value,}

2.2 核心参数


  • hosts:主机组
  • tasks:任务列表
  • vars:变量,如下有几种设置方式
  • template:jinja2模板语法
  • tags:标签
  • handlers:由一定条件触发,用notify调用

---
- hosts: webservers
  remote_user: root	#远程用户
  sudo: yes
  sudo_user: postgres
  tasks:
    - name: test connection
      模块名:
      remote_user: yourname	#也可以在任务中单独设置远程用户
      notify: 触发任务名称
      tags:
      - 标签1
      - 标签2
  handlers:
    - name: 任务名
	  模块:
    - name: 任务名
      模块:

3. ansible-playbook命令参数


ansible-playbook:执行自动化任务.yml文件

执行格式:
ansible-playbook [options] XXX.yml

ansible-playbook
--syntax-check
检查.yml的语法
-C
预测试,不会改变目标主机的任何设置
--list-tasks
列出任务列表
--list-hosts
列出主机列表
--list-tags
列出标签
-t 标签名
执行指定任务
--skip-tags=标签名
除了指定的任务不执行,执行其他任务
--start-at-task=标签名
从指定任务开始执行

#检测语法
ansible-playbook --syntax-check playbook.yml
#列出主机
ansible-playbook --list-hosts playbook.yml
#列出任务
ansible-playbook --list-tasks playbook.yml
#执行
ansible-playbook playbook.yml
#从指定任务开始执行
ansible-playbook --start-at-task "任务名" playbook.yml
#从指定标签开始##tags定义标签名##
ansible-playbook -t 标签名 playbook.yml

4. ansible加密工具


ansible-vault:文件加密工具

ansible-vault [option] XXX.yml

ansible
create
创建
encrypt
加密
decrypt
解密
view
查看
edit
编辑加密文件
rekey
修改口令

#加密
ansible-vault encrypt userlist.yml
#查看加密文件
ansible-vault view userlist.yml
#解密
ansible-vault decrypt userlist.yml
#执行加密文件
ansible-playbook --ask-vault-pass user.yml

5. playbook示例


5.1 示例1:简单Apache服务


#webserver.yml
---
- hosts: test
  tasks:
  - name: 安装 apache
    dnf:
      name: httpd
      state: present
  - name: 开启 apache
    service:
      name: httpd
      state: started
      enabled: yes
  - name: 开启防火墙
    service:
      name: firewalld
      state: started
      enabled: yes
  - name: 防火墙规则添加Apache
    firewalld:
      service: http
      permanent: yes
      immediate: yes
      state: enabled
  - name: 创建index.html
    copy:
      src: index.html
      dest: /var/www/html/index.html

5.2 示例2:用playbook测试示例1的Apache实验


#test1.yml
---
- hosts: localhost
  become: no
  tasks:
  - name: 测试Apache
    uri:
      url: http://172.25.17.2
      return_content: yes
#test2.yml
---
- hosts: localhost
  become: no
  tasks:
  - name: 测试Apache,返回直
    uri:
      url: http://172.25.17.2
      return_content: yes
      status_code: 200
##test3.yml
---
- hosts: localhost
  become: no
  tasks:
  - name: 测试Apache,返回直
    uri:
      url: http://172.25.17.2
      return_content: yes
      status_code: 200
    register: result
  - debug:
      var: result
#test4.yml
---
- hosts: localhost
  become: no
  tasks:
  - name: 测试Apache,返回直
    uri:
      url: http://172.25.17.2
      return_content: yes
      status_code: 200
    register: result
  - debug:
      msg: "tesk ok! zy!"

5.3 示例3:简单数据库服务


#database.yml
---
- hosts: prod
  tasks:
  - name: 安装mariadb及python3-PyMySQL.noarch
    dnf:
      name:
      - mariadb-server
      - python3-PyMySQL.noarch
      state: present
  - name: 开启mariadb
    service:
      name: mariadb
      state: started
      enabled: yes
  - name: 允许通过数据库端口3306
    firewalld:
      service: mysql
      permanent: yes
      immediate: yes
      state: enabled
#在设置root登陆用户密码后,
#每次修改数据库操作均需 先登陆 再操作
  - name: 设置登陆用户root,密码为westos
    mysql_user:
      name: root
      password: westos
      login_unix_socket: /var/lib/mysql/mysql.sock
  - name: 清除虚拟用户
    mysql_user:
      login_user: root
      login_password: westos
      name: ''
      host: localhost
      state: absent
  - name: 创建数据库westos_db
    mysql_db:
      login_user: root
      login_password: westos
      name: westos_db
      state: present
  - name: 创建数据库用户zy,密码zy123
    mysql_user:
      login_user: root
      login_password: westos
      name: zy
      password: zy123
      priv: 'westos_db.*:ALL'
      state: present

4.4 示例4:自动化修改Apache端口号


  1. 复制Apache主配置文件httpd.conf到/mnt/ansible下,为copy模块的src源
  2. 通过修改此文件的端口号达到修改目标主机端口号

(也可在jinja2模板中设置变量达到修改端口号目的,省去每次进入文件中区寻找端口号配置修改的麻烦,具体操作见ansible之变量篇)


#Apache.yml
---
- hosts: test
  tasks:
  - name: 安装 apache
    dnf:
      name: httpd
      state: present
  - name: 配置Apache
    copy:
      src: httpd.conf
      dest: /etc/httpd/conf/httpd.conf
    notify: restart apache
  - name: 开启 apache
    service:
      name: httpd
      state: started
      enabled: yes
  - name: 开启 firewalld
    service:
      name: firewalld
      state: started
      enabled: yes
  - name: 通过 http
    firewalld:
      service: http
      permanent: yes
      immediate: yes
      state: enabled
  - name: 创建index.html
    copy:
      src: index.html
      dest: /var/www/html/index.html
  handlers:
    - name: 重启apache
      service:
        name: httpd
        state: restarted

猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/112209107