博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ansible-playbook
阅读量:4195 次
发布时间:2019-05-26

本文共 7715 字,大约阅读时间需要 25 分钟。

ansible-playbook

一、ansible主机清单

注:ansible主机清单是在/etc/ansible/hosts文件中,主机清单可以手动设置,也可以通过Dynamic

Inventory动态生成,一般主机名使用FQDN。vi /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[dbdservers]db-[a:f].example.org  #支持匹配 a b ... f

下面是Inventory中变量

(1)主机变量

[webserver]www1.magedu.com http_port=80 maxRequestsChild=808www2.magedu.com http_port=8080 maxRequestsChild=909

(2)组变量

[servers:vars]ntp_server=ntp.example.orghfs_server=nfs.example.org

(3)组嵌套

[apache]http1.example.orghttp2.example.org[nginx]ngx1.example.orgngx2.example.org[webservers:children]apachenginx

(4)inventory变量参数

参数 说明
ansible_ssh_host 将要连接的远程主机名与你想要设定的主机的别名不同的话,可以通过此变量设置
ansible_ssh_port ssh端口号,如果不是默认的端口号,通过此变量设置
anssible_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
ansible_*_interpreter 这里的*可以使ruby或perl或其他语言的解释器,作用和ansible_python_interpreter类似
ansible_shell_executable 这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh

二、YAML文件

1、YAML简介

YAML:是一种非标记语言,以用来写配置文件的语言,非常简介和强大。

YAML语法和其他语言类似,也可以表达散列表、标量等数据结构。结构通过空来展示,序列里配置项通过-来代表;Map里键值用:来分隔;YAML的扩展名为yaml。

2、基本语法规则

(1)大小写敏感

(2)使用缩进表示层级关系
(3)缩进时不允许使用Tab键,只允许使用空格
(4)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

3、YAML支持的数据结构

(1)对象:键值对的集合,又称映射(mapping)/哈希(hashes)/字典(dictionary)

例如:name:Example Developer

(2)数组:一组按次序排列的值,又称为序列(sequence)/列表(list)

例如:-Apple         -Orange

(3)纯量:单个的、不可再分的值

例如:number: 12.30        sere: true

三、playbook剧本

通过task调用ansible的模块将多个play组织在一个playbook中运行。

1、playbooks组成

(1) Tasks: 任务,即调用模块完成的某操作;

(2) Variables: 变量
(3) Templates: 模板
(4) Handlers: 处理器,当某条件满足时,触发执行的操作;
(5) Roles: 角色。

2、基本命令介绍

ansible-playbook xxx.yaml --syntax-check   			   		 #检查yaml文件的语法是否正确ansible-playbook xxx.yaml --list-task     					 #检查tasks任务ansible-playbook xxx.yaml --list-hosts     					 #检查生效的主机ansible-playbook xxx.yaml --start-at-task='xxx'			     #指定从某个task开始运行- hosts: webserver   #指定主机组,可以是一个或多个组remote_user: root 	 #指定远程主机执行的用户名

3、playbook示例

- hosts: webserver     #定义的主机组,即应用的主机   vars:                #定义变量     http_port: 80     max_clients: 200   user: root   tasks:               #执行的任务    - name: ensure apache is at the latest version      yum: name=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

4、为每个任务定义远程执行用户

cd /optvim 1.yaml- hosts: mysql  remote_user: root  tasks:  - name: test connection    ping:    remote_user: mysql  	ansible mysql -m user -a 'name=mysql'ansible mysql -m shell -a 'echo 123123 | passwd --stdin mysql'ansible-playbook 1.yaml -k123123

5、指定远程主机切换用户执行剧本

vim 2.yaml- hosts: mysql  remote_user: root  become: yes           become_user: mysql     tasks:  - name: copy text    copy: src=/etc/fstab dest=/home/mysql/fstab.bakansible-playbook 2.yaml

6、tasks忽略错误,强制返回成功

Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始。在运行playbook时 (从上到下执行),如果一个host执行task失败, 整个tasks都会停止。每一个task必须有一个名称 name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

错误示例:遇到错误task自动停止,apache服务不会继续安装

vim 3.yaml- hosts: webserver  remote_user: root  tasks:  - name: stop selinux    command: '/usr/sbin/setenforc 0'  - name: install httpd    yum: name=httpd  - name: start httpd    service: name=httpd state=startedansible-playbook 3.yaml

加入ignore_errors: True 忽略错误,报错后继续执行

vim 3.yaml- hosts: webserver  remote_user: root  tasks:  - name: stop selinux    command: '/usr/sbin/setenforc 0'    ignore_errors: True  - name: install httpd    yum: name=httpd  - name: start httpd    service: name=httpd state=started                                                   ansible-playbook 3.yaml

7、针对多个主机节点执行剧本

vim 4.yaml  - hosts: webserver  remote_user: root  tasks:  - name: remove httpd    yum: name=httpd state=absent- hosts: mysql  remote_user: root  tasks:  - name: copy file    copy: src=/etc/fstab dest=/opt/haha.txt

8、Handlers概述

Handlers也是一些task的列表, 和一般的task并没有什么区别。

是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了 ,则Handlers被执行不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

vim 5.yaml- hosts: webserver  remote_user: root  tasks:  - name: remove httpd    yum: name=httpd state=absent  - name: start firewalld    service: name=firewalld state=started  - name: setenforce 0 && install httpd    command: '/usr/sbin/setenforce 0'    notify:    - step one  - name: stop firewalld && start httpd    service: name=firewalld state=stopped    notify:    - step two  handlers:  - name: step one    yum: name=httpd  - name: step two    service: name=httpd state=startedansible-playbook 5.yaml

9、引入变量

playbook引入变量有三种方式

(1)通过ansible命令参数-e传递

vim 6_1.yaml- hosts: mysql  remote_user: root  vars:  - user:  tasks:  - name: add user    user: name={
{user}}ansible-playbook 6_1.yaml -e "user=wangwu"ansible mysql -a 'tail -1 /etc/passwd'

(2)直接在yaml中定义

vim 6_2.yaml- hosts: mysql  remote_user: root  vars:  - user: lisi  tasks:  - name: add user    user: name={
{user}}ansible-playbook 6_2.yamlansible mysql -a 'tail -1 /etc/passwd'
vim 6_2.yaml- hosts: mysql  remote_user: root  tasks:  - name: copy file    copy: content="{
{ansible_all_ipv4_addresses}}" dest=/opt/vars.txtansible-playbook 6_2.yamlansible mysql -a 'ls /opt'ansible mysql -a 'cat /opt/vars.txt'

(3)引用主机清单中定义的变量

vim /etc/ansible/hosts[webserver]192.168.177.33[mysql]192.168.177.8  user=zhaoliuvim 6_3.yaml- hosts: mysql  remote_user: root  tasks:  - name: add user    user: name={
{user}}ansible-playbook 6_3.yamlansible mysql -a 'tail -1 /etc/passwd'

10、条件测试

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

(1)单条件判断

vim 7_1.yaml - hosts: mysql   remote_user: root   tasks:     - name: "shutdown CentOS"       command: /sbin/shutdown -h now       when: ansible_distribution == "CentOS"ansible-playbook 7_1.yaml

(2)多条件判断

vim 7_2.yaml- hosts: mysql  remote_user: root  tasks:  - name: "shut down CentOS 7 systems"    command: /sbin/shutdown -r now    when:    - ansible_distribution == "CentOS"    - ansible_distribution_major_version == "7"ansible-playbook 7_2.yaml

(3)组条件判断

vim 7_2.yaml- hosts: mysql  remote_user: root  tasks:  - name: "shut down CentOS 7 systems"    command: /sbin/shutdown -r now    when:    - ansible_distribution == "CentOS"    - ansible_distribution_major_version == "7"ansible-playbook 7_2.yaml

(4)迭代

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

vim 7_5.yaml- hosts: webserver  remote_user: root  tasks:  - name: install    yum: name={
{item}} state=latest with_items: - httpd - rpcbind - nfs-utilsansible-playbook 7_5.yamlansible webserver -a 'rpm -q httpd'ansible webserver -a 'rpm -q rpcbind'ansible webserver -a 'rpm -q nfs-utils'

也可以自己定义item变量

vim 7_5.yaml- hosts: webserver  remote_user: root  tasks:  - name: add user && join group    user: name={
{item.x}} state=present group={
{item.y}} with_items: - {x: 'qianqi', y: 'wheel'} - {x: 'sicong', y: 'root'}ansible-playbook 7_5.yamlansible webserver -a 'tail -2 /etc/passwd'

转载地址:http://lcwli.baihongyu.com/

你可能感兴趣的文章
实战DDD(Domain-Driven Design领域驱动设计:Evans DDD)
查看>>
SSH中各个框架的作用以及Spring AOP,IOC,DI详解
查看>>
openstack juno 配置vmware(vcenter、vsphere)
查看>>
远程debug调试(eclipse)之openstack windows
查看>>
PAAS平台对比:OpenShift VS CloudFoundry【51CTO调研报告】
查看>>
JAX-RS(java restful实现讲解)(转)
查看>>
Spring MVC与JAX-RS比较与分析
查看>>
openstack官方docker介绍
查看>>
头痛与早餐
查看>>
[转]在ASP.NET 2.0中操作数据::创建一个数据访问层
查看>>
Linux命令之chmod详解
查看>>
【java小程序实战】小程序注销功能实现
查看>>
Java中子类能否继承父类的私有属性和方法
查看>>
JVM内存模型详解
查看>>
(二)Git--工作区和暂存区、管理修改与撤销
查看>>
(七)Git--自定义Git
查看>>
(五)Git--分支管理
查看>>
(四)Git--远程仓库
查看>>
(六) Git--标签管理
查看>>
java中继承,子类是否继承父类的构造函数
查看>>