批处理工具Ansible高级用法 - 自动化运维研究

读前请预习: Ansible基本用法

剧本playbook的使用

当需要执行的任务有多个时,需要一条一条编辑ansible命令,然后执行,而且当需要重复执行时,又要重新编辑执行,这样效率不高,因此ansible就可以利用playbook来完成将任务写到一个YAML格式的文件中,然后利用ansible-playbook进行调用该文件,从而实现了多条语句,可重复执行的效果,类似shell脚本的效果,ansible的playbook要借助YAML文件来实现,YAML文件扩展名通常为.yaml或.yml

playbook的基础组件:

  • hosts:运行指定任务的而目标主机,多个主机用:冒号分隔
  • remote_user:在远程主机上执行任务的用户;可以全局指定,也可以单个 * 任务指定
  • sudo_user:表示以sudo方式运行任务时,切换为哪个用户身份运行
  • tasks: 任务列表
  • Handlers: 在发生改变时执行的操作
  • vars:变量的使用。一种为用户自己定义的变量;一种为facts获取的变量(即ansible crazyting2 -m setup查到的变量)

一个playbook小示例:

  1. 编写playbook文件
[root@crazyting1 ~]# cat playbooktest.yml 
- hosts: crazyting2  #  主机
  remote_user: root      #   远程用户
  tasks:                 #           任务
  - name: add group
    group: name=new state=present   #  组资源
  - name: add user
    user: name={{item}} group=new       # 用户资源
    with_items: # 循环 with_items with_nested with_dict with_random_choice
    - new1
    - new2
    - new3
- hosts: crazyting2  #  主机
  remote_user: root         # 远程用户
  vars: # 定义变量
  - var1: "hello world!"
  tasks:   # 任务                    
  - name: file  
    file: src=/root/install.log dest=/tmp/install.log  state=link owner=nobody group=nobody # file组件
    notify: # 通知触发handlers
    - log
    - log2
  handlers:
  - name: log 
    shell: echo "{{var1}} `date`" >> /tmp/install.log  
  - name: log2
    shell: echo "{{ansible_nodename}} `date`" >> /tmp/install.log  # 通过facts获取的系统的变量
    when: ansible_nodename == "crazyting2" # 条件判断
  1. 测试playbook脚本
[root@crazyting1 ~]# ansible-playbook --check playbooktest.yml 

PLAY [crazyting2] ****************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [crazyting2]

TASK [add group] *****************************************************************************************************************************************
changed: [crazyting2]

TASK [add user] ******************************************************************************************************************************************
changed: [crazyting2] => (item=new1)
changed: [crazyting2] => (item=new2)
changed: [crazyting2] => (item=new3)

PLAY [crazyting2] ****************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [crazyting2]

TASK [file] **********************************************************************************************************************************************
changed: [crazyting2]

RUNNING HANDLER [log] ************************************************************************************************************************************
skipping: [crazyting2]

RUNNING HANDLER [log2] ***********************************************************************************************************************************
skipping: [crazyting2]

PLAY RECAP ***********************************************************************************************************************************************
crazyting2                 : ok=5    changed=3    unreachable=0    failed=0 
  1. 运行playbook
[root@crazyting1 ~]# ansible-playbook  playbooktest.yml 

PLAY [crazyting2] ****************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [crazyting2]

TASK [add group] *****************************************************************************************************************************************
changed: [crazyting2]

TASK [add user] ******************************************************************************************************************************************
changed: [crazyting2] => (item=new1)
changed: [crazyting2] => (item=new2)
changed: [crazyting2] => (item=new3)

PLAY [crazyting2] ****************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [crazyting2]

TASK [file] **********************************************************************************************************************************************
changed: [crazyting2]

RUNNING HANDLER [log] ************************************************************************************************************************************
changed: [crazyting2]

RUNNING HANDLER [log2] ***********************************************************************************************************************************
changed: [crazyting2]

PLAY RECAP ***********************************************************************************************************************************************
crazyting2                 : ok=7    changed=5    unreachable=0    failed=0 
  1. 到crazyting2检查一下
[root@crazyting2 ~]# tail -2 /tmp/install.log 
*** FINISHED INSTALLING PACKAGES ***hello world! Tue Feb 11 22:58:43 CST 2020
crazyting2 Tue Feb 11 22:58:43 CST 2020
[root@crazyting2 ~]# cat /etc/group |grep new
new:x:500:
[root@crazyting2 ~]# grep new  /etc/shadow 
new1:!!:18303:0:99999:7:::
new2:!!:18303:0:99999:7:::
new3:!!:18303:0:99999:7:::

Ansible角色

角色是一种官方提供开发标准和规范。按照该目录结构搭建ansible playbook,从而达到各组件的分离和解耦。使用role组织playbook是官方提供的最佳实践。

完整项目的结构如下:

production                # 关于生产环境服务器的清单文件
stage                     # 关于 stage 环境的清单文件

group_vars/
   group1                 # 这里我们给特定的组赋值
   group2                 # ""
host_vars/
   hostname1              #  如果系统需要特定的变量,把它们放置在这里.
   hostname2              # ""

library/                  # 如果有自定义的模块,放在这里(可选)
filter_plugins/           # 如果有自定义的过滤插件,放在这里(可选)

site.yml          # master playbook 主 playbook
webservers.yml    # playbook for webserver tier Web 服务器的 playbook
fooservers.yml    # playbook for dbserver tier 数据库服务器的 playbook
roles/
   common/
     files/         # 存放文件和脚本,copy模块文件搜索路径
     templates/     # 模版存放路径
     tasks/         # 存放playbooks路径
     handlers/      # notify调用部分playbook存放路径
     vars/          # roles内变量存放路径
     defaults/      # 默认寻找路径
     meta/          # 存放元数据,如作者信息,角色信息等
   webservers/
     files/
     templates/
     tasks/          
     handlers/
     vars/
     defaults/
     meta/

编写一个nginx自动安装示例:

[root@crazyting1 ~]# mkdir -p ~/ansible/roles/nginx/{defaults,files,handlers,meta,tasks,templates,vars}
[root@crazyting1 ansible]# cat beta
[crazyting]
crazyting2

[root@crazyting1 ansible]# cat roles/nginx/templates/nginx.conf.j2 | head
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes {{ansible_processor_vcpus*2}};
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.

[root@crazyting1 ansible]# cat roles/nginx/tasks/group.yml 
- name: create group
  group: name=nginx
[root@crazyting1 ansible]# cat roles/nginx/tasks/user.yml 
- name: create user
  user: name=nginx group=nginx system=yes shell=/sbin/nologin
[root@crazyting1 ansible]# cat roles/nginx/tasks/yum.yml 
- name: install nginx
  yum: name=nginx
[root@crazyting1 ansible]# cat roles/nginx/tasks/templ.yml 
- name: copy conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
[root@crazyting1 ansible]# cat roles/nginx/tasks/start.yml 
- name: start
  service: name=nginx state=started enabled=yes
[root@crazyting1 ansible]# cat roles/nginx/tasks/main.yml 
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml

[root@crazyting1 ansible]# cat sit.yml 
- hosts: crazyting
  remote_user: root
  roles:
    - role: nginx       #制定role角色名,就是roles下的目录

[root@crazyting1 ~]# tree ansible/
ansible/
├── beta
├── roles
│   └── nginx
│       ├── defaults
│       ├── files
│       ├── handlers
│       ├── meta
│       ├── tasks
│       │   ├── group.yml
│       │   ├── main.yml
│       │   ├── restart.yml
│       │   ├── start.yml
│       │   ├── templ.yml
│       │   ├── user.yml
│       │   └── yum.yml
│       ├── templates
│       │   └── nginx.conf.j2
│       └── vars
└── sit.yml

[root@crazyting1 ansible]# ansible-playbook -i beta -C sit.yml 

PLAY [crazyting] ***************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************
ok: [crazyting2]

TASK [nginx : create group] ****************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : create user] *****************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : install nginx] ***************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : copy conf] *******************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : start] ***********************************************************************************************************************************************************************
changed: [crazyting2]

PLAY RECAP *********************************************************************************************************************************************************************************
crazyting2                 : ok=6    changed=5    unreachable=0    failed=0 

执行并检查

[root@crazyting1 ansible]# ansible crazyting2 -m setup | grep vcpus
        "ansible_processor_vcpus": 2, 
[root@crazyting1 ansible]# ansible-playbook -i beta sit.yml 

PLAY [crazyting] ***************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************
ok: [crazyting2]

TASK [nginx : create group] ****************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : create user] *****************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : install nginx] ***************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : copy conf] *******************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : start] ***********************************************************************************************************************************************************************
changed: [crazyting2]

PLAY RECAP *********************************************************************************************************************************************************************************
crazyting2                 : ok=6    changed=5    unreachable=0    failed=0   

[root@crazyting2 ~]# service nginx status
nginx: unrecognized service
[root@crazyting2 ~]# service nginx status
nginx (pid  26134) is running...
[root@crazyting2 ~]# grep nginx /etc/shadow
nginx:!!:18304::::::
[root@crazyting2 ~]# grep nginx /etc/group
nginx:x:501:
[root@crazyting2 ~]# head /etc/nginx/nginx.conf 
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes 4;

参考资料:
Ansible之Playbook详解、案例
Ansible角色详解
Ansible中文权威指南(建议看下playbook最佳实践)
Ansible 自动化运维工具简单入门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容