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
};
|