[TOC]node
YAML 是一个可读性高的用来表达资料序列的格式。YAML参考了其余多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言。
YAML Ain't Markup Language,即YAML不是XML。python
其特性:linux
YAML 的语法和其余高阶语言相似,而且能够简单表达清单、散列表、变量等数据结构。其结构(Structure)经过空格来展现,序列(Squence)里的项用
-
来代办,Map里的键值对用:
分割nginx
案例:web
name: John Smith age: 41 gender: Male spouse: name: Jane Smith age: 37 gennder: Female children: - name: Jimmy Smith age: 17 gender: Male - name: Jenny Smith age: 13 gender: Female
YAML 文件扩展名一般为: .yaml
,如 example.yamlshell
列表中的全部元素均使用
-
打头,例如:apache
# A list of t asty fruits - Apple - Orange - Strawberry - Mango
字典经过key与value进行表示,例如:安全
# An exployee record name: Example Developer job: Developer skill: Elite
也能够将key:value 放置于
{}
中进行描述bash
# An exployee record {name: Example Developer, job: Developer, skill: Elite}
变量名仅能由字母、数字和下划线组成,且只能以字母开头。数据结构
facts是由正在通讯的远程目标主机发挥的信息,这些信息被保存在ansible变量中,要获取指定额远程主机所支持的全部facts,可使用以下命令进行:
# ansible hostname -m setup
把任务的输出定义为变量,而后用于其余任务,示例以下:
tasks: - shell: /usr/bin/foo register: foo_result ignore_errors: true
在运行playbook的时候也能够经过一些变量供playbook使用,示例以下:
ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"
当一个主机应用角色的时候能够传递变量,而后在角色内使用这些变量,示例以下:
- hosts: webservs roles: - common - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
ansible 的主要功能在于批量主机操做,为了便捷地使用其中的部分主机,能够在inventory file中将其分组命名。默认的Inventory file 为 /etc/ansible/hosts。
inventory file 能够有多个,且也能够经过Dynamic Inventory来动态生成
能够在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如:
[webservs] 10.0.0.65 http_port=80 maxRequestsPerChild=888 10.0.0.66 http_port=8080 maxRequestsPerChild=909
组变量是指赋予给特定组内全部主机上在playbook中可用的变量。例如:
[webservs:vars] ntp_server=ntp.aliyun.com nfs_server=nfs.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_server=ntp.magedu.com
注意::childer
一样是固定用法
ansible基于ssh连接inventory中指定的远程主机时,还能够经过参数指定其交互方式;这些擦桉树以下所示:
playbook是由一个或多个play组成的列表。play的主要功能在于将事先归并一组的主机装扮成事先经过ansible中的tasks定义好的角色。从根据上来说,所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中,既可让他们联通起来按事先编排的机制同唱一台大戏。下面是一个简单的示例:
- hosts: webnodes vars: http_port: 80 max_clients: 256 remote_user: root tasks: - name: ensure apache is at the lastest version yum: name=httpd state=latest - name: ensure apache is running service: name=httpd state=started handlers: - name: restart apache service:name=httpd state=restarted
playbook 中的每个play的目的都是为了让某个或某些主机一某个指定的用户执行任务。hosts用于指定要执行指定任务的主机,其可使一个或多个由冒号分割主机组;remote_user则用于指定远程主机上的执行任务的用户。例如上面示例中的:
- hosts: webnodes remote_user: root
不过,remote_user也可用于各task中,也能够经过指定其经过sudo的方式在远程主机上执行任务,其可用于play全局或某任务,甚至能够在sudo时sudo_user指定sudo时切换的用户。
- hosts: webnodes remote_user: mageedu tasks: - name: test connection ping: remote_user: mageedu sudo: yes
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 running service: name=htpd state=running
在众多模块中,只有command 和shell模块仅须要给一个列表而无需使用"key=vale"格式,例如:
tasks: - name: disable selinux command: /sbin/setenforce 0
若是命令或脚本的退出码不为零,可使用以下方式替代:
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true ignore_errors: true
或者使用ignore_errors来忽略错误信息
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: true
在全部的webservs组的主机上建立nginx用户和用户组
并模拟拷贝文件到dbservs中
[root@node01 ansible]# cat nginx.yml - hosts: webservs remote_user: root tasks: - name: create nginx group group: name=nginx system=yes gid=208 - name: create nginx user user: name=nginx system=yes uid=208 group=nginx - hosts: dbservs remote_user: root tasks: - name: copy file to dbservs copy: src=/etc/inittab dest=/tmp/inittab.ans
使用ansible-playbook
命令执行:
[root@node01 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 : ok=3 changed=2 unreachable=0 failed=0 10.0.0.66 : ok=2 changed=0 unreachable=0 failed=0
验证: webservs的nginx用户和组以及dbservs的/tmp/inittab.ans文件
[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/passwd' 10.0.0.65 | CHANGED | rc=0 >> nginx:x:208:208::/home/nginx:/bin/bash [root@node01 ansible]# ansible webservs -a 'grep nginx /etc/group' 10.0.0.65 | CHANGED | rc=0 >> nginx:x:208: [root@node01 ansible]# ansible dbservs -a 'ls -l /tmp/inittab.ans' 10.0.0.66 | CHANGED | rc=0 >> -rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans