Ansible自动化运维工具playbook使用(二)

playbook

playbook介绍

playbook剧本是由一个或多个ansible模块组成的列表。playbook的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色,task实际是调用ansible的一个module,将过个task组织在一个playbook中,既可以让他们 联合起来,按事先编排的机制执行预定义的动作,playbook文件是采用yaml格式编写的

playbook命令

格式:

ansible-playbook <filename.yaml> [options]

常见选项:

选项 详解
–C、–check 预执行,不会真正执行,用来检测playbook是否有错
–list-hosts 列出运行任务的主机
–list-tags 列出tag
–list-task 列出task
–limit 只针对主机列表中的主机执行
-t 指定执行某个tags
-v,-vv 显示执行过程

playbook核心组件

  • hosts:执行任务的远程主机列表
  • tasks:任务集
  • variables:内置变量或自定义变量在playbook中调用
  • templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • handlers和notify:由特定条件出发的操作,满足条件才执行,否则不执行
  • tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。

核心组件用法

hosts组件

hosts:playbook中的每一个paly的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中(/etc/ansible/hosts)

[nginx]
192.168.0.182
[httpd]
192.168.0.178
[web]
192.168.0.178
192.168.0.182
[ssh]
192.168.0.178:22

playbook案例:

- hosts: httpd
- host: web:!nginx

remote_user组件

remote_user:可用于host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于paly、全局或某任务;此外,可以再sudo时使用sudo_user指定sudo时切换的用户

playbook案例:

- hosts: web
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: test
      sudo: yes
      sudo_user: usertest

task列表和action组件

playbook的主体部分是task list,其中有一个或多个task,各个task按次逐个在hosts中指定的所有主机上执行,即所有主机上完成第一个task后再开始第二个task。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个task都应该有name,用于playbook的执行结果输出,建议其内容能清晰地描述任务。如果未提供name,则action的结果将用于输出。

task两种格式:

  1. action:module arguments
  2. module:arguments 建议使用
    注意:shell和command模块后面跟命令,而非key=value
    范例:
- hosts: web
  remote_user: root
  tasks:
    - name: install web service
      yum: name=httpd
    - name: start web service
      service: name=httpd state=started enable=yes
- hosts: web
  remote_user: root
  tasks:
    - name: ls file
      shell: ls /opt/

编写一个简单的playbook

- hosts: web
  remote_user: root
  tasks:
    - name: "安装httpd服务"
      yum: name=httpd
    - name: "复制配置文件"
      copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
    - name: "复制主页文件"
      copy: src=/opt/index.html dest=/var/www/html/
    - name: "启动服务"
      service: name=httpd state=started enable=yes

playbook中使用handlers和notify

handler本质是task list,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化是才会采取一定的操作。而notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行同样的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
范例:

- hosts: web
  remote_user: root
  tasks:
    - name: "安装httpd服务"
      yum: name=httpd
    - name: "复制配置文件"
      copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
    - name: "复制主页文件"
      copy: src=/opt/index.html dest=/var/www/html/
      notify: restart httpd
    - name: "启动服务"
      service: name=httpd state=started enable=yes
  handlers:
    - name: restart httpd
      service: name=httpd state=restart

通过再次执行这个playbook来改变httpd服务的配置文件时notify会进行监听,当配置文件改变时就执行名称为restart httpd的handlers

playbook中的tags使用

在playbook中可以利用tags组件为特定的task指定标签,当再次执行playbook时可以指定某一个tags的task执行,而非执行整个playbook

范例:

- hosts: web
  remote_user: root
  tasks:
    - name: "安装httpd服务"
      yum: name=httpd
    - name: "复制配置文件"
      copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
    - name: "复制主页文件"
      copy: src=/opt/index.html dest=/var/www/html/
      tags: conf
      notify: restart httpd
    - name: "启动服务"
      service: name=httpd state=started enable=yes
  handlers:
    - name: restart httpd
      service: name=httpd state=restart
ansible-play -t conf http.yaml

playbook中使用变量

变量名称仅能以字母、数字和下划线组成,且只能以字母开头

范例:

http_port=80

变量的调用方式:通过{ { http_port }}调用变量,注意花括号前后要有空格,有时用"{ { http_port }}"调用才生效

  • 定义变量方式

通过命令行定义变量:

ansible-playbook -e http_port=80
  • 在playbook中定义变量
- hosts: web
  remote_user: root
  gather_facts: no
vars:
  - http_port: 80
  - name: httpd
  tasks:
    - name: "安装httpd服务"
      yum: name=httpd
    - name: "复制配置文件"
      copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
    - name: "复制主页文件"
      copy: src=/opt/index.html dest=/var/www/html/
      tags: conf
      notify: restart httpd
    - name: "启动服务"
      service: name=httpd state=started enable=yes
  handlers:
    - name: restart httpd
      service: name={
    
    {
    
     name }} state=restart

playbook中when的使用

playbook中when用来进行判断是否满足执行条件,如果满足就执行,不满足跳过
范例:

- hosts: db
  remote_user: root
  tasks:
    - name: install mysql-server
      yum: name=mysql-server
      when: {
    
    {
    
     ansible_distribution_major_version }} == 6
    - name: install mariadb-server
      yum: name=mariadb-server
      when: {
    
    {
    
     ansible_distribution_major_version }} == 7

playbook中with_items的使用

playbook中with_items可以快速迭代更新重复的变量,例如批量添加用户,批量下载软件,其中items可以是列表也可以是字典
范例:

- hosts: db
  remote_user: root
  tasks:
    - name: add user
      user: name={
    
    {
    
     item }} state=present
      with_items:
        - testuser1
        - testuser2
- hosts: db
  remote_user: root
  tasks:
    - name: add user
      user: name={
    
    {
    
     item.name }} state=present group={
    
    {
    
     item.group }}
      with_items:
        - {
    
    name: 'user1',group: 'system'}
        - {
    
    name: 'user2',group: 'system'}

猜你喜欢

转载自blog.csdn.net/qq_33235529/article/details/114529342