网站建设优化方法,营口门户网站建设,北京综评网址,最近新闻小学生摘抄playbooks 概述以及实例操作
Playbooks 组成部分#xff1a;
Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务#xff0c;即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器#xff0c;由某时间触发执行的操作 Roles: 角色
YAML 介绍…playbooks 概述以及实例操作
Playbooks 组成部分
Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器由某时间触发执行的操作 Roles: 角色
YAML 介绍
YAML 是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言。
YAML Ain’t Markup Language即YAML不是XML。
其特性
可读性好 和脚本语言的交互性好 使用时限语言的数据类型 有一个一直的信息模型 易于实现 可以基于流来处理 表达能力强扩展型好
YAML 语法
YAML 的语法和其他高阶语言类似并且可以简单表达清单、散列表、变量等数据结构。其结构(Structure)通过空格来展示序列(Squence)里的项用-来代办Map里的键值对用:分割
案例
name: John Smith
age: 41
gender: Male
spouse:name: Jane Smithage: 37gennder: Female
children:- name: Jimmy Smithage: 17gender: Male- name: Jenny Smithage: 13gender: FemaleYAML 文件扩展名通常为: .yaml如 example.yaml
List
列表中的所有元素均使用-打头例如
# A list of t asty fruits
- Apple
- Orange
- Strawberry
- MangoDictionary
字典通过key与value进行表示例如
# An exployee record
name: Example Developer
job: Developer
skill: Elite也可以将key:value 放置于{}中进行描述
# An exployee record
{name: Example Developer, job: Developer, skill: Elite}Ansible 基础元素
变量
变量名仅能由字母、数字和下划线组成且只能以字母开头。
facts
facts是由正在通信的远程目标主机发挥的信息这些信息被保存在ansible变量中要获取指定额远程主机所支持的所有facts可以使用如下命令进行
#ansible hostname -m setup
registre
把任务的输出定义为变量然后用于其他任务示例如下
tasks:
- shell: /usr/bin/fooregister: foo_resultignore_errors: true通过命令传递变量
在运行playbook的时候也可以通过一些变量供playbook使用示例如下
ansible-playbook test.yml --extra-vars hostswww usermageedu通过roles传递变量
当一个主机应用角色的时候可以传递变量然后在角色内使用这些变量示例如下
- hosts: webservsroles:- common- { role: foo_app_instance, dir: /web/htdocs/a.com, port: 8080 }Inventory
ansible 的主要功能在于批量主机操作为了便捷地使用其中的部分主机可以在inventory file中将其分组命名。默认的Inventory file 为 /etc/ansible/hosts。
inventory file 可以有多个且也可以通过Dynamic Inventory来动态生成
主机变量
可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如
[webservs]
10.0.0.65 http_port80 maxRequestsPerChild888
10.0.0.66 http_port8080 maxRequestsPerChild909组变量
组变量是指赋予给特定组内所有主机上在playbook中可用的变量。例如
[webservs:vars]
ntp_serverntp.aliyun.com
nfs_servernfs.aliyun.com注意[组名:vars] 组名中的:vars 是固定用法
组嵌套
inventory中组还可以包含其他的组并且也可以像组中的主机指定变量。不过这些变量只能在ansible-playbook中使用而不支持ansible。例如
[apache]
http1.magedu.com
http2.magedu.com
[nginx]
nginx1.magedu.com
nginx2.magedu.com
[webservs:children]
apache
nginx
[webservs:vars]
ntp_serverntp.magedu.com注意:childer 同样是固定用法
inventory 参数
ansible基于ssh链接inventory中指定的远程主机时还可以通过参数指定其交互方式这些擦桉树如下所示
ansible_ssh_host ansible_ssh_port ansible_ssh_user ansible_ssh_pass ansible_sudo_pass ansible_connection ansible_ssh_private_key_file ansible_shell_type ansible_python_interpreter ansible_*_interpreter
编写 ansible playbooks 剧本
playbook是由一个或多个play组成的列表。play的主要功能在于将事先归并一组的主机装扮成事先通过ansible中的tasks定义好的角色。从根据上来讲所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中既可以让他们联通起来按事先编排的机制同唱一台大戏。下面是一个简单的示例
- hosts: webnodesvars:http_port: 80max_clients: 256remote_user: roottasks:- name: ensure apache is at the lastest versionyum: namehttpd statelatest- name: ensure apache is runningservice: namehttpd statestartedhandlers:- name: restart apacheservice:namehttpd staterestartedplaybook 基础组件
Hosts 和 Users playbook 中的每一个play的目的都是为了让某个或某些主机一某个指定的用户执行任务。hosts用于指定要执行指定任务的主机其可以使一个或多个由冒号分割主机组remote_user则用于指定远程主机上的执行任务的用户。例如上面示例中的
- hosts: webnodesremote_user: root不过remote_user也可用于各task中也可以通过指定其通过sudo的方式在远程主机上执行任务其可用于play全局或某任务甚至可以在sudo时sudo_user指定sudo时切换的用户。
- hosts: webnodesremote_user: mageedutasks:- name: test connectionping:remote_user: mageedusudo: yes任务列表和action
play的主体部分是task list。task list中的个任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。在运行playbook 时如果中途发生错误所有已执行任务都将会滚因此在更正playbook后重新执行一次即可。
task的目的是使用指定的参数执行模块而在模块参数中可以使用变量。模块执行是幂等的这意味着多次执行是安全的因为其结果均一致。
每个task都应该有其name用于playbook的执行结果输出建议其内容尽可能清晰地描述任务执行步骤如果为提供name则action的结果将用于输出
定义task的可以使用action: module options 或 “module: options” 的格式推荐使用候着以实现向后兼容。如果action一行的内容过度也使用在行首使用几个空白字符进行换行
tasks:
- name: make sure apache is runningservice: namehtpd staterunning在众多模块中只有command 和shell模块仅需要给一个列表而无需使用keyvale格式例如
tasks:
- name: disable selinuxcommand: /sbin/setenforce 0如果命令或脚本的退出码不为零可以使用如下方式替代
tasks:
- name: run this command and ignore the resultshell: /usr/bin/somecommand || /bin/trueignore_errors: true 或者使用ignore_errors来忽略错误信息
tasks:
- name: run this command and ignore the resultshell: /usr/bin/somecommandignore_errors: trueplaybook 案例 1
在所有的webservs组的主机上创建nginx用户和用户组
并模拟拷贝文件到dbservs中
[rootnode01 ansible]# cat nginx.yml
- hosts: webservsremote_user: roottasks:- name: create nginx groupgroup: namenginx systemyes gid208- name: create nginx useruser: namenginx systemyes uid208 groupnginx
- hosts: dbservsremote_user: roottasks:- name: copy file to dbservscopy: src/etc/inittab dest/tmp/inittab.ans使用ansible-playbook命令执行
[rootnode01 ansible]# ansible-playbook nginx.yml
PLAY [webservs] ***********************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.65]
TASK [create nginx group] *************************************************************************************************
changed: [10.0.0.65]
TASK [create nginx user] **************************************************************************************************
changed: [10.0.0.65]
PLAY [dbservs] ************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.66]
TASK [copy file to dbservs] ***********************************************************************************************
ok: [10.0.0.66]
PLAY RECAP ****************************************************************************************************************
10.0.0.65 : ok3 changed2 unreachable0 failed0
10.0.0.66 : ok2 changed0 unreachable0 failed0 验证 webservs的nginx用户和组以及dbservs的/tmp/inittab.ans文件
[rootnode01 ansible]# ansible webservs -a grep nginx /etc/passwd
10.0.0.65 | CHANGED | rc0
nginx:x:208:208::/home/nginx:/bin/bash
[rootnode01 ansible]# ansible webservs -a grep nginx /etc/group
10.0.0.65 | CHANGED | rc0
nginx:x:208:
[rootnode01 ansible]# ansible dbservs -a ls -l /tmp/inittab.ans
10.0.0.66 | CHANGED | rc0
-rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans