.. 
.. Copyright 2015 Comcast Cable Communications Management, LLC
.. 
.. Licensed under the Apache License, Version 2.0 (the "License");
.. you may not use this file except in compliance with the License.
.. You may obtain a copy of the License at
.. 
..     http://www.apache.org/licenses/LICENSE-2.0
.. 
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS,
.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
.. See the License for the specific language governing permissions and
.. limitations under the License.
.. 

*****************************
Traffic Server Administration
*****************************
Installing Traffic Server
=========================
1. Select **Servers**.
2. Scroll to the bottom of the page and click **Add Server**.
3. Complete the Required Info: section.
4. Click **Submit**.
5. Click **Save**.

.. 6. Click **Online Server**.
.. 7. From the Set status of this machine to ONLINE? screen, click **OK**.

.. _reference-traffic-ops-ort:

Configuring Traffic Server
==========================
All of the Traffic Server application configuration files are generated by Traffic Ops and installed by way of the traffic_ops_ort.pl script. 


**traffic_ops_ort.pl**
  The traffic_ops_ort.pl should be installed on all caches (by puppet or other non Traffic Ops means), usually in /opt/ort. It is used to do initial install of the config files when the cache is being deployed, and to keep the config files up to date when the cache is already in service.  The usage message of the script is shown below: ::

    $  /opt/ort/traffic_ops_ort.pl
    Mon Mar  9 18:38:01 UTC 2015
    Version of this script: 0.46b
    ====-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-====
    Usage: ./traffic_ops_ort.pl <Mode> <Log_Level> <Traffic_Ops_URL> <Traffic_Ops_Login>
    	<Mode> = interactive - asks questions during config process.
    	<Mode> = report - prints config differences and exits.
    	<Mode> = badass - attempts to fix all config differences that it can.
    	<Mode> = syncds - syncs delivery services with what is configured in Traffic Ops.
    
    	<Log_Level> => ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, NONE
    
    	<Traffic_Ops_URL> = URL to 12 monkeys host. Example: https://trafficops.company.net
    
    	<Traffic_Ops_Login> => Example: 'username:password'
    ====-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-====
    $


  For initial configuration or when major changes (like a Profile change) need to be made, run the script in "badass mode". All required rpm packages will be installed, all Traffic Server config files will be fetched and installed, and (if needed) the Traffic Server application will be restarted.  Example run below: ::

    run here 

  For "every day changes" such as adding deliveryservices or changing records.config parameters caches should run the script in "syncds" mode out of cron. Example crontab entry: :: 

  		*/15 * * * * /opt/ort/traffic_ops_ort.pl syncds warn https://traffops.kabletown.net admin:password > /tmp/ort/syncds.log 2>&1

  .. Note:: <disclaimer on what is "hot changeable" here>