All files / lib/common setupScripts.js

85.71% Statements 36/42
54.55% Branches 12/22
100% Functions 9/9
85.71% Lines 36/42

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160  1x                         2x 2x                               2x         2x 2x       2x 2x     2x   4x         1x 1x     1x 4x                             2x   2x 2x 2x 2x 2x 2x   2x 2x   2x         2x                   2x                                   2x             4x               2x 2x     2x 1x           1x   4x               2x     1x      
"use strict";
const { ansibleConfig, getPlaybook, getPlaybookNames, getLocalPlaybookNames, getRoleNames } = require("./playbook");
 
//private functions
/*eslint-disable valid-jsdoc,require-jsdoc */
 
/**
 * Return shell script to install ansible.
 * Https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-release-via-dnf-or-yum.
 * @param {string} os - OS identifier.
 * @returns {string} Shell script to install ansible.
 */
function installAnsible(os) {
  let rt;
  Eif (os.startsWith("ubuntu")) {
    rt = `\
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt-get -y  install ansible python-dnspython`;
  } else if (/(?:centos|rhel)7/.test(os)) {
    rt = `\
echo sudo subscription-manager repos --enable rhel-7-server-ansible-2.6-rpms
echo sudo yum -y install ansible python2-dns
`;
  } else {
    rt = `\
echo "fall-back to pip"
echo sudo pip install ansible dnspython
`;
  }
  return rt;
}
 
 
function pullRolesFromGalaxy(opt) {
  const roles = getRoleNames(opt);
  return roles.length > 0 ? `ansible-galaxy install -p/etc/ansible/roles ${roles.join(" ")}` : "echo no roles on ansible-galaxy needed";
}
 
function runLocalPlaybooks(opt) {
  const playbooks = getLocalPlaybookNames(opt);
  Iif (playbooks.length === 0) {
    return "echo nothing to play at this time";
  }
  return `sudo -i -u ${opt.user} ANSIBLE_CONFIG=${opt.config} ansible-playbook --extra-vars="{ssh_hostbased_auth_allowed_hosts: [\`sed 's/.*/"&"/' ${opt.ipListFile} | tr '\\n' ',' |sed 's/,$//'\`]}"\
    ${playbooks.map((e)=>{
    return `${opt.playbookDir}/${e}.yml`;
  }).join(" ")}`;
}
 
function runPlaybooks(opt) {
  const playbooks = getPlaybookNames(opt);
  Iif (playbooks.length === 0) {
    return "echo nothing to play at this time";
  }
  return `sudo -i -u ${opt.user} ANSIBLE_CONFIG=${opt.config} ansible-playbook ${playbooks.map((e)=>{
    return `${opt.playbookDir}/${e}.yml`;
  }).join(" ")}`;
}
 
//public functions
/*eslint-enable valid-jsdoc require-jsdoc*/
/**
 * Return userData object.
 * @param {Object} opt - Option argument.
 * @param {string} opt.inventory - Absolute path of inventory file.
 * @param {string[]} opt.packages - Package names to be installed.
 * @param {boolean} isChild - Return userdata for child node or not.
 * @returns {Object} - User data object.
 */
function getUserData(opt, isChild) {
  opt.inventory = opt.inventory || "/etc/ansible/hosts"; //ansible's defalut path
  //following filenames are fixed values!!
  opt.playbookDir = "/var/lib/abc4";
  opt.ipListFile = "/var/lib/abc4/iplist";
  opt.hostListFile = "/var/lib/abc4/hostlist";
  opt.headHostName = "/var/lib/abc4/headnode";
  opt.config = `${opt.playbookDir}/ansible.cfg`;
  opt.isChild = isChild;
 
  Eif (opt.batch === "pbspro") {
    opt.qmgrCmds = ["set server job_history_enable=True"];
 
    Iif (Array.isArray(opt.batchSetupScript) && opt.batchSetupScript.length > 0) {
      opt.qmgrCmds.push(...opt.batchSetupScript);
    }
  }
 
  const makeInventory = [
    `echo '[head]' > ${opt.inventory}`,
    `cat ${opt.headHostName} >> ${opt.inventory}`,
    `echo '[child]' >> ${opt.inventory}`,
    `grep -v -e \`cat ${opt.headHostName}\` ${opt.hostListFile} >> ${opt.inventory}`,
    `chmod +r ${opt.inventory}`,
    "echo generate inventory file done",
    `cat ${opt.inventory}`
  ];
 
  const userData = {
    runcmd: [
      `${opt.createIpList} > ${opt.ipListFile}`,
      `${opt.createHostList} > ${opt.hostListFile}`,
      `${opt.getHeadHostname} > ${opt.headHostName}`,
      "echo create IP list file done `date`",
      installAnsible(opt.os),
      "echo install ansible done `date`",
      ...makeInventory,
      "mkdir /etc/ansible/facts && chmod 777 /etc/ansible/facts",
      pullRolesFromGalaxy(opt),
      "echo pull roles from ansible-galaxy done `date`",
      runLocalPlaybooks(opt),
      "echo run local playbook done`date`",
      `cp /etc/ssh/ssh_known_hosts ~${opt.user}/.ssh/known_hosts`,
      "echo copy known hosts file done"
    ]
  };
  userData.write_files = [
    {
      path: `${opt.playbookDir}/ansible.cfg`,
      mode: 644,
      content: `${ansibleConfig}`
    },
    ...getLocalPlaybookNames(opt).map((e)=>{
      return {
        path: `${opt.playbookDir}/${e}.yml`,
        mode: 755,
        content: `${getPlaybook(e, opt)}`
      };
    })
  ];
 
  Eif (Array.isArray(opt.packages)) {
    userData.packages = opt.packages;
  }
 
  if (!isChild) {
    userData.runcmd.push(
      "echo make inventory file done `date`",
      runPlaybooks(opt),
      "echo run playbooks done `date`",
    );
 
    userData.write_files = userData.write_files.concat(
      getPlaybookNames(opt).map((e)=>{
        return {
          path: `${opt.playbookDir}/${e}.yml`,
          mode: 755,
          content: `${getPlaybook(e, opt)}`
        };
      })
    );
  }
  return userData;
}
 
module.exports = {
  getUserData
};