.. 
.. 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** in the Traffic Ops web interface.
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>
