概览

Ansible的核心是Playbooks(可翻译为剧本),剧本是用YAML语法书写的,来描述对被管理机器需要进行的一系列操作。剧本相当于做菜手册,上面按顺序记录了,如何把被管理机器一步步打造成指定的样子。

YAML语法相当简单,即使读者之前从未听过YAML也毫无关系,YAML书写起来比JSON格式更简单

接下来我们以运维朋友几乎都非常熟悉的,安装nginx,来演示playbooks的基础用法

示例 - 安装nginx

我们分别使用3种方法:纯手动、shell脚本、playbooks,来部署nginx,让读者有直观的认识

机器需要开启EPEL源,参考 https://blog.csdn.net/xys2015/article/details/109378741

1 纯手动

yum install --quiet -y nginxcat << 'EOF' > /etc/nginx/conf.d/xtest1.confserver {    listen       7001;    server_name  localhost;    location / {        root   /opt/xtest1;        index  index.html;    }}EOFmkdir -p /opt/xtest1echo "xtest-7001" > /opt/xtest1/index.htmlsystemctl start nginxsystemctl enable nginxcurl localhost:7001

2 shell脚本

上面手动执行的命令,直接可以当成脚本用

3 playbooks

# cat nginx_playbook.yml---- hosts: all  tasks:     - name: Install Nginx      shell: yum install --quiet -y nginx    - name: Copy configuration files      shell: cp xtest1.conf /etc/nginx/conf.d/xtest1.conf    - name: Start Nginx and configure it to run at boot      shell: systemctl start nginx && systemctl enable nginx

如果大家现在执行这份playbook,即命令

ansible-playbook nginx_playbook.yml

是会报错的,会提示cannot stat ‘xtest1.conf’: No such file or directory,这是在我们预料之内的,原因是上面的playbook直接使用的shell命令,就相当于我们把上面的每一行命令单独拿出来,登录到目标机器去执行一样,因此无对应的配置文件,而在实际工作中,nginx的配置文件都是被我们放到管理节点上的,下面我们使用Ansible自带的模块,改写上面的playbook

# cat nginx_playbook.yml---- hosts: 192.168.31.100  tasks:     - name: Install Nginx      yum:         name: nginx        state: present     - name: Copy configuration files      copy:        src: xtest1.conf        dest: /etc/nginx/conf.d/xtest1.conf        owner: root        group: root        mode: 0644    - name: Make sure Nginx is started now and at boot      service: name=nginx state=started enabled=yes

目前我们无需关注Ansible资源的目录合理规划问题,任意创建一个目录,把上面的文件放进去,然后在该目录放一个配置文件,配置文件的内容参见上文,如下截图

如果要执行上面的playbook,移动到playbook所在的目录,然后运行ansible-playbook nginx_playbook.yml,不过别急执行,我们仔细解释下这份playbook

--- 固定写法,一个标记,类似php代码开头都有<?php一样,在k8s里如果一个yml文件里定义多个资源也是用---分割- hosts: 192.168.31.100表示管理的机器,同样这个IP必须已经存放到主机清单里,all表示所有机器,这块的规则跟使用ad-hoc命令一致yum、service模块这里非常简单,即便无任何Ansible经验也能读懂,不多解释copy模块这里,表示的是把本机(管理机器)当前目录(相对于执行的命令)下的xtest1.conf,拷贝到目标机器的 /etc/nginx/conf.d/xtest1.conf

执行一下,看看效果

可以看到反复执行,目标机器不会再改变,拥有幂等性

基础语法规则

# cat nginx_playbook.yml---- hosts: 192.168.31.100  tasks:     - name: Install Nginx      yum:         name: nginx        state: present     - name: Copy configuration files      copy:        src: xtest1.conf        dest: /etc/nginx/conf.d/xtest1.conf        owner: root        group: root        mode: 0644    - name: Make sure Nginx is started now and at boot      service: name=nginx state=started enabled=yes
  • 需要以 --- 3个减号开始,且需顶行首写
  • 使用#号注释(可以在开头注释写上playbook的功能)
  • 缩进必须是统一的,不能将空格和Tab混用,建议统一使用2个空格作为缩进
  • key / value 可以写在一行,也可写在多行,区分大小写
  • playbook的执行是有顺序的,从上到下

真要比较起来,写在多行有个好处是,方便git追踪对比区别

常用核心参数

--inventory=PATH (-i PATH)  手动指定主机清单文件,默认是 /etc/ansible/hosts-v    输出详细信息-vvv  输出更详细信息-vvvv 调试(debug)模式--forks=NUM  指定并发执行数,默认是5--check (-C) 不实际执行,运行检查模式--syntax-check  语法检查--limit ${ip}  限制执行只在单个或多个IP内(逗号分割)--list-hosts  显示本次执行操控的IP

下面例举两个实际工作场景:初始化一批机器,和初始化单台机器,看一下上面的参数我们如何使用,准备的环境如下

[root@192-168-31-106 ~/install_nginx]# lsnginx_playbook.yml  xtest1.conf[root@192-168-31-106 ~/install_nginx]# cat nginx_playbook.yml ---- hosts: all  tasks:     - name: Install Nginx      yum:         name: nginx        state: present     - name: Copy configuration files      copy:        src: xtest1.conf        dest: /etc/nginx/conf.d/xtest1.conf        owner: root        group: root        mode: 0644    - name: Make sure Nginx is started now and at boot      service: name=nginx state=started enabled=yes[root@192-168-31-106 ~/install_nginx]# cat xtest1.conf server {    listen       7001;    server_name  localhost;    location / {        root   /opt/xtest1;        index  index.html;    }}

场景1: 初始化一批nginx机器作为七层负载均衡

#查看操控了哪些机器ansible-playbook nginx_playbook.yml --list-hosts#检查语法ansible-playbook nginx_playbook.yml --syntax-check#模拟执行 (这个模拟执行并不是万能模拟)ansible-playbook nginx_playbook.yml --check#实际执行ansible-playbook nginx_playbook.yml

如下图,模拟执行没有报错,而实际执行确报错了,原因是192.168.31.106这台机器上已经把80端口占用,再启动一个nginx也监听再80端口上,有冲突所以报错,因此模拟执行这个功能,并不是万能的,只能大致去模拟,从这里我们也可以看到一台机器执行报错,并不影响其它机器的正常运行

场景2 量大,之前的七层机器顶不住,新增一台七层机器(192.168.31.102)

#查看操控了哪些机器ansible-playbook nginx_playbook.yml --list-hosts#检查语法ansible-playbook nginx_playbook.yml --syntax-check#限制某台机器模拟执行ansible-playbook nginx_playbook.yml --check --limit 192.168.31.102#如果要限制多台,则以逗号分割ansible-playbook nginx_playbook.yml --check --limit 192.168.31.102,192.168.31.100#可以配合--list-hosts,再次确认ansible-playbook nginx_playbook.yml --check --limit 192.168.31.102,192.168.31.100 --list-hosts#实际执行ansible-playbook nginx_playbook.yml --limit 192.168.31.102

顺便给大家看眼,-v参数输出的效果

Playbook 与 Shell 脚本差异对比

  1. Ansible 执行时会留下清晰到痕迹,告诉我们Ansible都干了什么
  2. 如果设计合理,Ansible能提供相当程度都幂等性支持 (至少能够校验该playbook是否实现了幂等)
  3. 提供了类似 --check 参数,在之际执行前,进行模拟执行,不会对目标机器实际作出改变
  4. 大型Shell脚本含义维护,一旦出问题难以debug,而设计良好的Ansible Playbook几乎无此问题

ansible-doc 查看帮助

#1 查看系统里全部模块ansible-doc --list > /tmp/tmp.txt#2 搜索某个模块的用法ansible-doc --list > /tmp/tmp.txt; grep copy /tmp/tmp.txtansible-doc copy

这个很多时候比查看官方文档方便些,毕竟不用联网,更重要的是版本肯定一致

debug模块

这个模块用来测试Ansible一些常用的功能非常方便

[root@192-168-31-106 ~/install_nginx]# cat debug_playbook.yml ---- hosts: all  tasks:    - name: debug test 1      debug:        msg: 主机名 {{ ansible_hostname }}    - name: debug test 2      debug:        msg: 操作系统 {{ ansible_distribution }} 版本 {{ ansible_distribution_major_version }}[root@192-168-31-106 ~/install_nginx]# ansible-playbook debug_playbook.yml 

上面用的变量都是Ansible系统内置的变量,双花括号,两边留一个空格,中间写变量名称,这是固定用法,其它可以使用的变量可以通过下面的命令查询

ansible 192.168.31.100 -m setup

使用非root用户执行

# cat none-root-user.yml- hosts: test  tasks:    - name: debug info 4      become: yes      become_user: www      shell: whoami > /tmp/tmp2.txt

标签和指定操作系统

---cat tags_playbook.yml- name: copy node-ps single binary to remote machine /etc/dAppCluster  copy: src=node-ps dest=/etc/dAppCluster/node-ps mode=0744  tags:  - INSTALL_OR_UPDATE  when:   - ansible_distribution == "CentOS"  - ansible_distribution_major_version == "6" or ansible_distribution_major_version == "7"- name: copy node-ps manager scripts CENTOS7  copy: src=node-ps.service dest=/usr/lib/systemd/system/node-ps.service  tags:  - UPDATE  when:   - ansible_distribution == "CentOS"  - ansible_distribution_major_version == "7"#不指定tag,则全部执行ansible-playbook  tags_playbook.yml --limit 192.168.31.100#指定具体的tag,则只执行该tag下面的任务ansible-playbook  tags_playbook.yml --tags UPDATE --limit 192.168.31.100

加上特定的标签,可以区分不同场景执行的任务,如安装是一种标签,升级是一种标签,也可以用来做测试

Ansible提示颜色信息说明

  • 翔黄色:对远程节点进行相应修改
  • 帽子绿:对远程节点不进行相应修改,或者只是对远程节点信息进行查看
  • 深红色:操作执行命令有异常
  • 浅紫色:表示对命令执行发出警告信息(可能存在的问题,给你一下建议)

参考链接

https://docs.ansible.com/ansible/latest/cli/ansible-doc.html
©著作权归作者所有:来自51CTO博客作者阿胜4K的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 3.2 Ansible Playbooks 高级二
  2. 原创 | KUKA机器人安全分析实战
  3. SQL on Hadoop 技术分析(二)
  4. Hive高级优化 | 面试及调优必读
  5. Structured Streaming VS Flink
  6. Mac 安装Homebrew慢的问题解决
  7. RPA:让电商财务拥有“分身术”
  8. Spark SQL从入门到精通
  9. 1.3 Ansible 整体架构图

随机推荐

  1. go语言实现string转float的方法
  2. 详解Go 中方法与函数的区别
  3. go是开源语言吗?
  4. 解析Go中的多态 -无需interfaces
  5. go语言和Java语言的区别是什么?
  6. 用Go实现进制之间的转化
  7. 详解 Golang 通道 Chan
  8. go语言和python有什么区别?
  9. go-carbon1.2.4发布了!新增系列时间比较方
  10. 你知道go程序的基本要素吗