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语法的主要内容,如果未能解决你的问题,请参考以下文章

ansible自动运维工具之ansible-playbook详解

Ansible-playbook 学习

ansible-playbook使用详解

ansible-playbook快速入门

原创ansible-playbook 详解

1. ansible-playbook 变量定义与引用