Ansible剧本管理(实例解释!!!)

inventory主机清单

ansible默认的主机清单是/etc/ansible/hosts文件,主机清单可以手动设置,也可以通过Dynamic Inventory动态生成,一般主机名使用FQDN
vim /etc/ansible/hosts
[webserver]                          #方括号设置组名
www1.example.org              #定义被监控主机,这边可以是主机名也可以是IP地址,主机名需要修改/etc/hosts文件
www2.example.org:2222     #冒号后定义远程连接端口,默认是ssh的22端口
如果是名称类似的主机,可以使用列表的方式标识各个主机
[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456

[dbbservers]
db-[a:f].example.org

inventory变量

  • 主机变量
[webserver]
www1.magedu.com http_port=80 maxRequestsChild=808
www2.magedu.com http_port=8080 maxRequestsChild=909
  • 组变量
[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org
  • 组嵌套
[apache]
http1.example.org
http2.example.org

[nginx]
ngx1.example.org
ngx2.example.org

[webservers:children]
apache
nginx
  • inventory变量参数
参数 说明
ansible_ssh_host 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置
ansible_ssh_port ssh端口号.如果不是默认的端口号,通过此变量设置
ansible_ssh_user 默认的 ssh 用户名
ansible_ssh_pass ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_ssh_private_key_file ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况
ansible_ssh_common_args 此设置附加到sftp,scp和ssh的缺省命令行
ansible_sftp_extra_args 此设置附加到默认sftp命令行
ansible_scp_extra_args 此设置附加到默认scp命令行
ansible_ssh_extra_args 此设置附加到默认ssh命令行
ansible_ssh_pipelining 确定是否使用SSH管道. 这可以覆盖ansible.cfg中得设置
ansible_shell_type 目标系统的shell类型.默认情况下,命令的执行使用 ‘sh‘ 语法,可设置为 ‘csh‘ 或 ‘fish‘
ansible_python_interpreter 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python
ansible_*_interpreter 这里的"*"可以是ruby 或perl 或其他语言的解释器,作用和ansible_python_interpreter 类似
ansible_shell_executable 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh

YAML标记语言

YAML:另一种标记语言。是用来写配置文件的语言,非常简洁和强大。
YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。
结构通过空格来展示;序列里配置项通过-来代表;Map里键值用:来分隔;YAML的扩展名为yaml
  • 基本语法规则

    1.大小写敏感
    2.使用缩进表示层级关系
    3.缩进时不允许使用Tab键,只允许使用空格。
    4.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • YAML支持的数据结构
    1.对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
    例如:name:Example Developer
        键     值
    2.数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
    例如:-Apple
       -Orange
    3.纯量:单个的、不可再分的值
    例如:number:12.30
       sure:true

yaml实例:

name:zhangsan
age:20
name:lisi
age:22
people:
-name:zhangsan
      age:20
      -name:lisi
      age:22

Ansible剧本-playbook

Playbook是一种完全不同的运用ansible的方式,类似与saltstack的state状态文件。ad-hoc无法持久使用,playbook可以持久使用。
playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务。通过task调用ansible的模板将多个play组织在一个playbook中运行。

Playbook核心元素

名称 含义
Hosts 执行的远程主机列表
Tasks 任务集,即调用模块完成的某操作
Varniables 变量,内置变量或自定义变量在playbook中调用
Templates 模板,即使用模板语法的文件,比如配置文件等
Handlers 处理器,和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码
Roles 角色

Playbook语法

1、playbook使用yaml语法格式,后缀可以是yaml,也可以是yml。
在单一的一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点好(...)用来表示play的结尾,也可省略。
2、当行开始正常写playbook的内容,一般都会写上描述该playbook的功能。
3、使用#号注释代码。
4、缩进必须统一,不能空格和tab混用。缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
5、YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感
6、k/v的值可同行写也可以换行写。同行使用:分隔。v可以是个字符串,也可以是一个列表
7、一个完整的代码块功能需要最少元素包括 name: task

实例演示:

vim a.yaml

- hosts: webserver                  #定义的主机组,即应用的主机
  vars:                             #定义变量
    http_port: 80
    max_clients: 200
  user: root
  tasks:                               #执行的任务
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:                         #处理器
    - name: restart apache
      service: name=httpd state=restarted
  • 执行一个playbook的格式
ansible-playbook [yaml文件名]

实例演示:

#执行剧本
ansible-playbook ping.yaml

参数:

-k(–ask-pass)           用来交互输入ssh密码
-K(-ask-become-pass)    用来交互输入sudo密码
-u                      指定用户

补充命令:

#检查yaml文件的语法是否正确
ansible-playbook nginx.yaml --syntax-check

#检查tasks任务
ansible-playbook nginx.yaml --list-task

#检查生效的主机
ansible-playbook nginx.yaml --list-hosts

#指定从某个task开始运行
ansible-playbook nginx.yaml --start-at-task=‘Copy Nginx.conf‘

hosts和users介绍

实例演示:

vim a.yaml

- hosts: webserver               #指定主机组,可以是一个或多个组。
  remote_user: root              #指定远程主机执行的用户名

#执行剧本
ansible-playbook a.yaml 
  • 在原有基础上为每个任务定义远程执行用户
!vim

- hosts: mysql
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: mysql          #指定远程主机执行tasks的运行用户为mysql

#执行playbook剧本
ansible-playbook ping.yml -k 

#验证语法
ansible-playbook a.yml --syntax-check

#执行剧本
ansible-playbook a.yml 
  • 指定远程主机sudo切换用户
!vim

- hosts: mysql
  remote_user: root
  become: yes                  #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: mysql          #指定sudo用户为mysql

#执行playbook剧本
ansible-playbook ping.yml -K

#执行剧本
ansible-playbook a.yml 

tasks列表和action

1.Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。
在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。
Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
2.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。
3.定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
4.ansible的自带模块中,command模块和shell模块无需使用key=value格式

实例演示:

  • 实例1
vim a.yml 

- hosts: webserver
  remote_user: root
  tasks:
   - name: disable selinux
     command: ‘/sbin/setenforce 0‘
   - name: make sure apache is running
     service: name=httpd state=started
#play中只要执行命令的返回值不为0,就会报错,tasks停止

#检查语法
ansible-playbook a.yml --syntax-check

#执行剧本
ansible-playbook a.yml 

#检查结果
rpm -q httpd

修改如下内容:

!vim

- hosts: webserver
  remote_user: root
  tasks:
   - name: disable selinux
     command: ‘/sbin/setenforce 0‘
     ignore_errors: True             #忽略错误,强制返回成功
   - name: make sure apache is running
     service: name=httpd state=started

#检查语法
ansible-playbook a.yml --syntax-check

#执行剧本
ansible-playbook a.yml 
  • 实例2
vim b.yml 

- hosts: webserver
  remote_user: root
  tasks:
   - name: create nginx group
     group: name=nginx system=yes gid=208
   - name: create nginx user
     user: name=nginx uid=208 group=nginx system=yes
- hosts: mysql
  remote_user: root
  tasks:
   - name: copy file to mysql
     copy: src=/etc/inittab dest=/opt/inittab.back

#检查语法
ansible-playbook b.yml --syntax-check

#执行剧本
ansible-playbook b.yml

Handlers介绍

Handlers也是一些task的列表,和一般的task并没有什么区别。
是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

实例演示:

vim c.yml

- hosts: webserver
  remote_user: root
  tasks:
   - name: install httpd package
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
      -restart httpd
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

#检查语法
ansible-playbook c.yml --syntax-check

#执行剧本
ansible-playbook c.yml

亦可引入一些变量:

!vim

- hosts: webserver
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
   - name: install httpd package
     yum: name={{package}} state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
      -restart httpd
   - name: start httpd service
     service: enabled=true name={{service}} state=started
  handlers:
   - name: restart httpd
     service: name={{service}} state=restarted

#检查语法
ansible-playbook c.yml --syntax-check

#执行剧本
ansible-playbook c.yml

playbook使用变量的方法

1.通过ansible命令传递

实例演示:

#编辑如下yml
vim a.yml

- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add new user
    user: name={{user}}

#执行剧本
ansible-playbook a.yml -e "user=testvar"

#执行命令查看文件
ansible mysql -m command -a ‘tail /etc/passwd‘

2.直接在yaml中定义变量---如上handlers示例

3.直接引用一些变量

实例演示:

  • 引用ansible的固定变量
vim test.yml

- hosts: mysql
  remote_user: root
  tasks:
   - name: copy file
     copy: content="{{ansible_all_ipv4_addresses}}," dest=/opt/vars.txt

#执行剧本
ansible-playbook test.yml

#在122主机上查看vars.txt文件内容
cat /opt/vars.txt
  • 引用主机变量
vim /etc/ansible/hosts

#在mysql组的主机后面添加如下内容
[mysql]
192.168.142.122 testvar="42.122"    #定义testvar变量的值为42.122

vim test.yml      #添加{{testvar}}主机变量

- hosts: mysql
  remote_user: root
  tasks:
   - name: copy file
     copy: content="{{ansible_all_ipv4_addresses}},{{testvar}}" dest=/opt/vars.txt

#执行剧本
ansible-playbook test.yml

#在122主机上查看vars.txt文件内容
cat /opt/vars.txt

条件测试

如果需要根据变量、facts(setup)或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,在Playbook中条件测试使用when子句。
在task后添加when子句即可使用条件测试:when子句支持正则表达式或语法。

实例演示:

vim when.yml

- hosts: mysql
  remote_user: root
  tasks:
    - name: "shutdown CentOS"
      command: /sbin/shutdown -h now
      when: ansible_distribution == "CentOS"

#执行剧本,执行后会发现192.168.142.122主机已经被关机
ansible-playbook when.yml 
  • 多条件判断
vim when.yml

- hosts: mysql
  remote_user: root
  tasks:
    - name: "shut down CentOS 6 systems"
      command: /sbin/shutdown -r now
      when:
        - ansible_distribution == "CentOS"
        - ansible_distribution_major_version == "6"

#执行剧本
ansible-playbook when.yml 
  • 组条件判断
vim when.yml

- hosts: mysql
  remote_user: root
  tasks:
    - name: "shut down CentOS 6 and Debian 7 systems"
      command: /sbin/shutdown -t now
      when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
            (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

#执行剧本
ansible-playbook when.yml 
  • 自定义变量进行条件测试
vim when.yml

- hosts: all
  vars:
    exist: "True"
  tasks:
  - name: creaet file
    command:  touch /tmp/test.txt
    when: exist | match("True")

  - name: delete file
    command:  rm -rf /tmp/test.txt
    when: exist | match("False")

#执行剧本
ansible-playbook when.yml 

迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过with_items语句指明迭代的元素列表即可。

实例演示:

vim  d.yml

- hosts: webserver
  remote_user: root
  tasks:
    - name: "Install Packages"
      yum: name={{ item }} state=latest
      with_items:
        - httpd
        - mysql-server
        - php

#检查语法
ansible-playbook d.yml --syntax-check

#执行剧本
ansible-playbook d.yml

#在所有主机上查看是否有指定添加的用户
tail -5 /etc/passwd

亦可自行定义:

vim e.yml

- hosts: webserver
  remote_user: root
  tasks:
    - name: "Add users"
      user: name={{ item.name }} state=present groups={{ item.groups }}
      with_items:
        - { name:‘test1‘, groups:‘wheel‘}
        - { name:‘test2‘, groups:‘root‘}

#检查语法
ansible-playbook e.yml --syntax-check

#执行剧本
ansible-playbook e.yml

#在所有主机上查看是否有指定添加的用户
tail -5 /etc/passwd

Templates模块

#创建工作目录
mkdir templates

#复制配置文件
cp /etc/httpd/conf/httpd.conf templates/httpd.conf.02

#修改httpd.conf.02文件
vim templates/httpd.conf.02
Listen {{http_port}}
ServerName {{ansible_fqdn}}
MaxClients {{maxClients}}

#修改ansible/hosts文件
vim /etc/ansible/hosts
[webserver]
192.168.142.121 http_port=80 maxClients=100
192.168.142.122 http_port=8080 maxClients=200

#编写剧本
vim apache.yml

- hosts: webserver
  remote_user: root
  vars:
   - package: httpd
   - service: httpd
  tasks:
   - name: install httpd package
     yum: name={{package}} state=latest
   - name: install configuration file for httpd
     template: src=/root/templates/httpd.conf.2 dest=/etc/httpd/conf/httpd.conf
     notify:
      - restart httpd
   - name: start httpd service
     service: enabled=true name={{service}} state=started
  handlers:
   - name: restart httpd
     service: name={{service}} state=restarted

#检查语法
ansible-playbook e.yml --syntax-check

#执行剧本
ansible-playbook apache.yml
#在两台被管理服务器上查看
grep -i listen /etc/httpd/conf/httpd.conf
grep -i maxClient /etc/httpd/conf/httpd.conf
grep -i servername /etc/httpd/conf/httpd.conf

tags模块

在一个playbook中,我们一般会定义很多个task,如果我们只想执行其中的某一个task或多个task时就可以使用tags标签功能了。
格式如下:
vim hosts.yml

- hosts: webserver
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/etc/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts state=touch

#检查语法
ansible-playbook e.yml --syntax-check

#执行剧本
ansible-playbook hosts.yml --tags="only"
ansible-playbook hosts.ym
事实上,不光可以为单个或多个task指定同一个tags。playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

实例演示:

vim hosts.yml

- hosts: webserver
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/etc/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts state=touch
      tags:
      - always

#检查语法
ansible-playbook e.yml --syntax-check

#为了不影响此次操作删除远程主机中/opt/hosts文件
rm -rf /opt/hosts 

#执行剧本
ansible-playbook hosts.yml --tags="only"
#分别在两台被管理服务器上去查看文件创建情况
ls /opt/

谢谢阅读!!!

原文地址:https://blog.51cto.com/14449521/2469024

时间: 2025-01-05 13:08:17

Ansible剧本管理(实例解释!!!)的相关文章

Linux中ansible批量管理软件部署及剧本编写

服务器版本信息: Centos6.9 [[email protected] ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux ansible软件介绍 ansible是一个基于Python开发的自动化运维工具! 其功能实现基于SSH远程连接服务! ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等

CentOS 6.5环境使用ansible剧本自动化部署Corosync + pacemaker环境及corosync常用配置详解

环境说明: 192.168.8.39 node2.chinasoft.com 192.168.8.42 node4.chinasoft.com 192.168.8.40 ansible管理服务器 192.168.8.77 VIP 192.168.8.20 nfs服务器 1.双机互信需要设置好,hosts文件需要解析好,时间要同步,配置好yum源 双击互信及Hosts文件配置,参考:http://blog.csdn.net/reblue520/article/details/51213030 最好

ansible剧本编写

作者:Georgekai 归档:学习笔记 2018/1/31 ansible剧本编写 1.1.1 ansible基于口令方式免交互登录 1.编辑/etc/ansible/hosts管理配置文件,实现基于口令免交互登录 vim /etc/ansible/hosts [client] 172.16.1.7 172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456 172.16.1.41 2.测试是否需要进行交互登录 [[email prote

ansible应用管理

实验环境: 主控机:192.168.1.9(centos 7.5)被控机:192.168.1.8(centos 7.5);192.168.1.7(centos 7.4);192.168.1.6(cnetos 6.9)虚拟机:vmware 14做ansible实验前,必须做好主控机的基于被控机的key验证登录具体参照前面的博文中的基于key验证.http://blog.51cto.com/13698281/2118972 安装ansible rpm包安装: EPEL源 yum install an

ansible批量管理服务详解

在开始之前我们先试想一个场景,你的公司有成百上千台的服务器,这时候领导要求在所有服务器上都添加一个定时任务,或者是执行某个命令,你可能会说用xshell一个一个去连或者是编写一个shell脚本,但是如果过你经历过类似的事情,你一定可以体会到其中的痛苦,因为这么多服务器你用xshell去连的话工作量将变得特别大,但如果你是选择写一个脚本的话也会特别的麻烦,因为每执行一个不同的东西你就要去修改脚本的类容,而且批量脚本一般采用循环的方式去执行一些任务,如果节点太多的话,执行的效率会变得比较低,而批量管

Django + Ansible 主机管理

本文分享内容如下: 内容目录 Django 基础 MVC ORM COMMAND AuthenticationAnsible 基础 配置 ad-hoc 命令集 python api代码解读 演示 创建虚拟化环境并进入python3/python -m venv venv(linux)source venv\bin\active(win) venv\Scripts\active 安装第三方库pip install -r requirements.txt 初始化python manage.py ma

ansible批量管理常见的配置方法

第7章 ansible的管理????103 7.1 ansible概念的介绍????103 7.1.1 ansible的概念????104 7.1.2 ansible使用的一些意义????104 7.1.3 ansible拥有哪些服务????104 7.1.4 ansible服务的一些特点????104 7.2 ansible部署过程????104 7.2.1 服务的安装????104 7.2.2 服务版本的检查????105 7.3 ansible的主机清单讲解????105 7.3.1 根据

ansible批量管理远程服务器

使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器:  2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问:  比如在.bashrc中定义$app_path=/opt/app/bin 最终选择ansible,使用这个自动化运维工具可以满足我的需求:  下面介绍下对于我这种场景需要使用的ansible的主要模块:  关于ansible是什么以及安装配置请自行

使用ansible批量管理远程服务器

使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问: 比如在.bashrc中定义$app_path=/opt/app/bin 最终选择ansible,使用这个自动化运维工具可以满足我的需求: 下面介绍下对于我这种场景需要使用的ansible的主要模块: 关于ansible是什么以及安装配置请自行百度: