Synchnorized 作用域 linktosql angular ui router ACE photoshop视频教程全集下载 java并发编程视频 ajax的get请求 jquery解析json数据 jquery拼接字符串 input取消边框 mysql建表主键自增长 mysql教程 python手册 pythoninput python实战 python学习文档 java基础入门 java接口文档 java中的数据结构 java写入txt文件 java数组输出 java配置文件 linux的find vs2010sp1 robotstudio u盘系统下载 视频编辑专家下载 抠图软件免费版 js取余数 android下载文件 编写软件 无线网密码修改 桌面系统 js弹出框 ps文字旋转任意角度 迅雷共享会员 origin怎么画图 求字符串长度的函数 徐静蕾字体
当前位置: 首页 > 学习教程  > 编程语言

学会ansible之playbook一篇就够了

2021/1/13 19:31:59 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章目录一、ansible-playbook 详解1.1:playbook格式1.2:inventory主机清单1.3:inventory变量1.4、核心组件1.6:hosts和users介绍tasks列表和action1.8:Handlers介绍1.9:playbook使用变量的方法2.0&#xf…

文章目录

  • 一、ansible-playbook 详解
    • 1.1:playbook格式
    • 1.2:inventory主机清单
    • 1.3:inventory变量
    • 1.4、核心组件
    • 1.6:hosts和users介绍
    • tasks列表和action
    • 1.8:Handlers介绍
    • 1.9:playbook使用变量的方法
    • 2.0:条件测试
    • 多条件判断
    • 组条件判断
    • 迭代

一、ansible-playbook 详解

playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的

1.1:playbook格式

playbook由YMAL语言编写。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl等。MAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。以下为playbook常用到的YMAL格式。

YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容。就像这样- host。
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
playbook中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔,”:”后面还要增加一个空格。
剧本以.yml后缀
yaml语法

1.2:inventory主机清单

ansible默认的主机清单是/etc/ansible/hosts文件,主机清单可以手动设置,也可以通过Dynamic Inventory动态生成,一般主机名使用FQDN

vim /etc/ansible/hosts
[webserver]                          #方括号设置组名
www1.example.org                     #定义被监控主机,这边可以是主机名也可以是IP地址,主机名需要修改/etc/hosts文件
www2.example.org:4444                #冒号后定义远程连接端口,默认是ssh的22端口

如果是名称类似的主机,可以使用列表的方式表示各个主机

[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456

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

1.3: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_portssh端口号.如果不是默认的端口号,通过此变量设置
ansible_ssh_user默认的 ssh 用户名
ansible_ssh_passssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_ssh_private_key_filessh 使用的私钥文件.适用于有多个密钥,而你不想使用 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

1.4、核心组件

tasks:任务
variables:变量
templates:模板
handlers:处理器
roles:角色

hosts 定义单个主机或组,vars定义变量,remote_user定义执行命令的远程用户,tasks定义执行哪些命令,handlers定义调用哪些处理器

vars(变量):

变量命名: 字母数字下划线组成,只能以字母开头

变量种类:

facts(内置变量)

由远程主机发回的主机属性信息,这些信息被保存在ansible变量当中

例如:ansible 192.168.238.170 -m setup 来获取远程主机上的属性信息,这些属性信息保存在facts中

通过命令行传递

通过命令行传递:ansible-playbook test.yml –extra-vars “host=www user=tom“(如果剧本中已有此处定义的变量则会被覆盖)

通过roles传递

主机变量

在/etc/ansible/hosts中定义

[web1]
192.168.1.1 name=haha

组变量

[group_name:vars]
foo=bar

hosts :

/etc/abible/hosts 中指定的远程主机,并用指定的属性进行连接

ansible_ssh_port 连接远程主机使用的端口

ansible_ssh_user 连接远程主机使用的用户

ansible_ssh_pass 连接远程主机使用的密码

cat /etc/ansible/hosts

[web1]
web1.hostname ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123
web2.hostname

示例

[root@master ~]# cat apache.yaml 

 - hosts: node                  #定义的主机组,即应用的主机
  vars:                             #定义变量
    http_port: 80
    max_clients: 200
  user: root
  tasks:                               #执行的任务
 - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
 - name: ensure apache is running
    service: name=httpd state=started
 - name: html
    shell : echo 'cc' > /var/www/html/index.html
  handlers:                         #处理器
    - name: restart apache
      service: name=httpd state=restarted
  • 执行一个playbook的格式
ansible-playbook [yaml文件名]
#执行剧本
ansible-playbook apache.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'

1.6:hosts和users介绍

[root@master opt]# cat a.yml 
- hosts: node
  remote_user: root 

#执行剧本
ansible-playbook a.yaml 

#检查语法
ansible-playbook a.yml --syntax-check
  • 在原有基础为每个任务定义远程执行用户
[root@master opt]# cat a.yml 
- hosts: node
  remote_user: root 
  tasks:
   - name: test connection
     ping:
     remote_user: root

ansible-playbook a.yml 

tasks列表和action

  • 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格式
[root@master opt]# cat a.yml 
- hosts: node
  remote_user: root 
  tasks:
   - name: selinux
     command: '/sbin/setenforce 0'
     remote_user: root
   - name: install httpd
     yum: name=httpd
   - name: start httpd
     service: name=httpd state=started

#执行yml文件
ansible-playbook a.yml

假如task中有错误操作 ,会回滚操作,添加以下字段
ignore_errors: true

- hosts: node
  remote_user: root
  tasks:
   - name: selinux
     command: '/sbin/setenforce 0'
   - name: firewalld
     yum: 'name=firewall state=stoped'
     ignore_errors: true
   - name: start httpd
     service: name=httpd state=started
······
PLAY RECAP ******************************************************************************
192.168.158.30             : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   
192.168.158.40             : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1   

1.8:Handlers介绍

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

[root@master opt]# cat c.yml 
- hosts: node
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
   - name: install httpd package
     yum: name={{package}} state=latest
     notify:
      -restart httpd
   - name: start httpd service
     service: enabled=true name={{service}} state=started
  handlers:
   - name: restart httpd
     service: name={{service}} state=restarted

1.9:playbook使用变量的方法

1、通过ansible命令传递

vim lisi.yml 

- hosts: mysql
  remote_user: root
  vars:
   - username: lisi
  tasks:
   - name: create user
     user: name={{username}}
      
'执行剧本'
ansible-playbook lisi.yml

'或者-e后面加变量直接引用'
- hosts: node
  remote_user: root
  vars:
  tasks:
   - name: create user
     user: name={{username}}

然后执行命令:ansible-playbook lisi.yml -e "user=lisi"    都是可行的

1、定义在hosts文件中的变量,是主角常用变量
2、yml直接定义的变量,任务中常用的变量
3、命令传递进去的变量,测试中常用的变量

2.0:条件测试

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

vim lisi.yml

- hosts: node
  remote_user: root
  tasks:
    - name: "shutdown CentOS"
      command: /sbin/shutdown -h now            '-h:关机 -r:重启'
      when: ansible_distribution == "CentOS"    '满足Centos就关机'
'执行'
ansible-playbook lisi.yml    '发现node主机已经被关机'

多条件判断

vim lisi.yml

- 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"

组条件判断

vim lisi.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 lisi.yml 

迭代

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


本文链接: http://www.dtmao.cc/news_show_600090.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?