ansible-playbook命令及YAML语法
Posted 系统运维分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible-playbook命令及YAML语法相关的知识,希望对你有一定的参考价值。
YAML语法
YAML :YAML ain’t a Markup Language ,以数据为中心、而不是以标记语言为重点的一种语言
首行以 “—” 开始,且需顶格书写
次行开始写playbook的正文,建议写明playbook的功能等描述信息
注释符为 ” # “
格式非常严格,严格控制缩进统一,不能和空格或Tab混用
缩进级别必须一致,缩进级别相同代表同级别,级别的判断是通过缩进结合换行实现的
YAML文件内容和Linux系统大小写的判断方式保持一致,是区分大小写的,k/v的值均对大小写敏感
k/v的值可同行写,也可换行写,同行书写使用分隔符 ” : ” ,换行写分隔符 ” - “
一个完整的代码块所必需包含的元素:name、task
一个name只能包括一个task
test.yml 示例
vim /root/test.yml#文件内容 ---- hosts: srvs remote_user: root tasks: - name: adduser test user: name=test shell=/bin/bash home=/home/test
playbook 核心元素
hosts :指定运行任务的目标主机
tasks :任务列表
variables :变量
templates :模板
handlers :动作执行探测器,探测到指定条件,触发执行动作
roles :按照固定目录结构组成的playbook
playbook中tags、notify、handlers的使用
==playbook实例 :httpd-manager.yml==
---- hosts: srvs remote_user: root tasks: - name: install httpd tags: install yum: name=httpd state=latest - name: start httpd.service tags: start service: name=httpd state=started - name: start httpd.service tags: restart service: name=httpd state=restarted - name: stop httpd.service tags: stop service: name=httpd state=stopped - name: config httpd tags: config copy: src=/root/ansible/httpd.conf dest=/etc/httpd/conf/ backup=yes when: ansible_distribution_major_version == "7" notify: restart httpd handlers: - name: restart httpd service: name=httpd state=restarted
实现功能:
单独调用其中一个功能
ansible-playbook httpd-server-deploy.yml --tags=start
同时调用多个功能
ansible-playbook httpd-server-deploy.yml --tags="stop,config"
针对某一单个成员执行某一功能
ansible-playbook httpd-server-deploy.yml --tags="start,stop" -l 172.16.253.30
playbook中变量的使用
定义变量
在/etc/ansible/hosts文件中定义变量,可针对某台主机定义变量,也可以对整个分组定义变量
组变量和主机变量的生效优先级为:如果针对主机定义了变量(无论是否定义了组变量),主机变量生效;如果未定义主机变量,仅定义了组变量,组变量生效。
vim /etc/ansible/hosts#组变量[srvs:vars] webport=80#主机变量[srvs]172.16.253.184 webport=10080 hostname=node1172.16.254.89 webport=10180 hostname=node2172.16.253.47 webport=10280 hostname=node3172.16.253.30 webport=10380 hostname=node4
调用变量
调用变量的两种方式的生效优先级:在命令行下直接定义的变量优先级高于在hosts文件中定义的变量(主机变量或分组变量)
1. 可以在命令行模式直接使用”ansible-playbook test.yml -e “webport=2000”
2. 调用在hosts文件中定义好的变量引用变量注意:使用双大括号 “{{ VAR-NAME }}” ,且括号前后要有空格
修改主机名
ansible srvs -m hostname -a 'name=“name-{{ hostname }}-port-{{ webport }}"'ansible srvs -m command -a 'hostname'#执行结果172.16.253.30 | SUCCESS | rc=0 >> name-node4-port-10380172.16.253.184 | SUCCESS | rc=0 >> name-node1-port-10080172.16.253.47 | SUCCESS | rc=0 >> name-node3-port-10280172.16.254.89 | SUCCESS | rc=0 >> name-node2-port-10180
ansible-playbook 之强大的 template
jianja2语法格式:
支持算术运算:+ , - , * , / , **
支持比较操作符:== , >= , != , <= , > , <
支持逻辑运算符: and , or , not
支持流表达式:for , if , while
使用template在配置文件中调用变量
设置template配置文件
#设置jianja2文件cp /root/ansible/httpd.conf /root/ansible/httpd.conf.j2 vim /root/ansible/httpd.conf.j2#修改Listen一项的值为 "{{ webport }}"Liten {{ webport }}#重新设置yml文件cp /root/ansible/httpd-manager.yml /root/ansible/httpd-manager-j2.ymlvim /root/ansible/httpd-manager-j2.yml#修改config配置块中的copy指令为template指令,其他部分不变,示例如下: - name: config httpd tags: config template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf when: ansible_distribution_major_version == "7" notify: restart httpd
执行playbook
ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config#执行结果:对分组中不同的主机采用不同的端口ansible srvs -m shell -a 'ss -tnlp | grep httpd'
template还支持算术运算
将所有端口加1
vim /root/ansible/httpd.conf.j2#修改以下内容Listen {{ webport+1 }}
通过template在配置文件中使用for循环和if语句
定义基于不同域名的多个虚拟主机
#查找主机名变量 ansible srvs -m setup | grep hostname #修改httpd.conf.j2文件 Listen {{ webport }}<VirtualHost *.{{ webport }}> ServerName {{ ansible_hostname }}.achudk.com DocumentRoot /var/www/html <Directory "/var/www"> Require all granted </Directory></VirtualHost>#验证结果 ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config curl curl 172.16.254.89:10180
使用for循环生成多个基于不同域名且不同端口的虚拟主机,并使用if判断条件
#修改httpd.conf.j2文件 vim httpd.conf.j2 {% for vport in vports %} <VirtualHost *.{{ vport }}> ServerName {{ ansible_hostname }}.achudk.com DocumentRoot /var/www/html <Directory "/var/www"> Require all granted </Directory> {% if errorlog is not defined %} ErrorLog "{{ errorlog | default('/web/httpd/log/vh1/error_log') }}" {% endif %} </VirtualHost>{% endfor %} #修改httpd-manager-j2.yml文件,在起始处增加vars指令,余下内容不变,如下: vim httpd-manager-j2.yml #正文如下 --- - hosts: srvs remote_user: root vars: - vport: - 80 - 443 - 8080 - errorlog: - "/web/httpd/log/vh1/error_log" #验证结果 ansible-playbook /root/ansible/httpd-manager-j2.yml --tags=config
when条件判断
#当系统为CentOS7时,才启用该配置片段 - name: config httpd tags: config template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf when: ansible_distribution == "CentOS" when: ansible_distribution_major_version == "7" notify: restart httpd
==when指令的多条件联合判断==
多个条件之间使用 “and” 连接
tasks: - name: show hosts information tags: info debug: msg={{ ansible_distribution }},msg={{ ansible_distribution_major_version }} when: ansible_distribution == "CentOS" and ansible_distribution_major_ver sion == "6"
==最终实例==
将所学内容综合起来使用,形成具有管理功能的yml文件
---- hosts: srvs remote_user: root
vars:
- vports: - 80 - 443 - 8080 - errorlog: - "/web/httpd/log/vh1/error_log"
tasks:
- name: show hosts information tags: info
debug: msg="{{ ansible_distribution }}-{{ ansible_distribution_major_version }}-{{ ansible_distribution_release }}"
- name: install httpd tags: install
yum: name=httpd state=latest
- name: start httpd.service tags: start
service: name=httpd state=started
- name: start httpd.service tags: restart
service: name=httpd state=restarted
- name: stop httpd.service tags: stop
service: name=httpd state=stopped
- name: config httpd tags: config
template: src=/root/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
when: ansible_distribution == "CentOS" and ansible_distribution_major_ver
sion == "7"
notify: restart httpd
handlers:
- name: restart httpd service: name=httpd state=restarted
以上是关于ansible-playbook命令及YAML语法的主要内容,如果未能解决你的问题,请参考以下文章