50-install-prepare.yml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. ---
  2. # Download all the tools, set up registry credentials, ssh keys, and ensure the health of a DHCP and a DNS server on utility.
  3. #
  4. # XXX: If someone has gone beyond this point in the course and runs this playbook, it will revert the changes back to the original.
  5. #
  6. - name: Download all the tools we need on workstation, set up registry credentials, and a SSH keypair.
  7. hosts: workstation.lab.example.com
  8. gather_subset: min
  9. become: no
  10. vars:
  11. downloads:
  12. - baseurl: https://mirror.openshift.com/pub/openshift-v4/clients/butane/latest
  13. filename: butane-amd64
  14. dest_dir: /usr/local/bin
  15. deploy: yes
  16. extract: no
  17. extract_files: []
  18. target_filename: butane
  19. completion: no
  20. - baseurl: https://mirror.openshift.com/pub/openshift-v4/clients/coreos-installer/latest
  21. filename: coreos-installer_amd64
  22. dest_dir: /usr/local/bin
  23. deploy: yes
  24. extract: no
  25. extract_files: []
  26. target_filename: coreos-installer
  27. completion: no
  28. - baseurl: https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.18.6
  29. filename: openshift-install-rhel9-amd64.tar.gz
  30. dest_dir: /usr/local/bin
  31. deploy: yes
  32. extract: yes
  33. extract_files:
  34. - openshift-install-fips
  35. target_filename: None
  36. completion: yes
  37. - baseurl: https://mirror.openshift.com/pub/openshift-v4/clients/ocp/stable-4.18
  38. filename: openshift-client-linux-amd64-rhel9.tar.gz
  39. dest_dir: /usr/local/bin
  40. deploy: yes
  41. extract: yes
  42. extract_files:
  43. - oc
  44. - kubectl
  45. target_filename: None
  46. completion: yes
  47. - baseurl: https://rhcos.mirror.openshift.com/art/storage/prod/streams/4.18-9.4/builds/418.94.202501221327-0/x86_64
  48. filename: rhcos-418.94.202501221327-0-live.x86_64.iso
  49. deploy: no
  50. tasks:
  51. - name: Download tools, if necessary.
  52. ansible.builtin.get_url:
  53. url: "{{ item.baseurl }}/{{ item.filename }}"
  54. dest: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.filename }}"
  55. mode: 0644
  56. owner: student
  57. group: student
  58. loop: "{{ downloads }}"
  59. loop_control:
  60. label: "{{ item.filename }}"
  61. - name: Extract tools, if necessary.
  62. become: yes
  63. ansible.builtin.unarchive:
  64. src: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.filename }}"
  65. remote_src: yes
  66. dest: "{{ item.dest_dir }}"
  67. include: "{{ item.extract_files }}"
  68. creates: "{{ item.extract_files[0] }}"
  69. mode: 0755
  70. owner: root
  71. group: root
  72. loop: "{{ downloads }}"
  73. loop_control:
  74. label: "{{ item.filename }}"
  75. when:
  76. - item.deploy
  77. - item.extract
  78. - name: Install tools, if necessary.
  79. become: yes
  80. ansible.builtin.copy:
  81. src: "{{ ansible_facts['user_dir'] }}/Downloads/{{ item.filename }}"
  82. remote_src: yes
  83. dest: "{{ item.dest_dir }}/{{ item.target_filename }}"
  84. mode: 0755
  85. owner: root
  86. group: root
  87. loop: "{{ downloads }}"
  88. loop_control:
  89. label: "{{ item.filename }}"
  90. when:
  91. - item.deploy
  92. - not item.extract
  93. - item.target_filename is defined
  94. - item.target_filename != None
  95. - name: Create command completion files, if necessary.
  96. become: yes
  97. ansible.builtin.shell:
  98. cmd: "{{ item.extract_files[0] }} completion bash > /etc/bash_completion.d/{{ item.extract_files[0] }}.completion"
  99. creates: "/etc/bash_completion.d/{{ item.extract_files[0] }}.completion"
  100. loop: "{{ downloads }}"
  101. loop_control:
  102. label: "{{ item.filename }}"
  103. when:
  104. - item.completion is defined
  105. - item.completion
  106. - name: Ensure .docker directory exists.
  107. ansible.builtin.file:
  108. path: "{{ ansible_facts['user_dir'] }}/.docker"
  109. state: directory
  110. mode: 0750
  111. owner: student
  112. group: student
  113. - name: Ensure mirror registry auth file is on standby.
  114. ansible.builtin.copy:
  115. dest: "{{ ansible_facts['user_dir'] }}/.docker/config.json-mirror"
  116. mode: 0640
  117. owner: student
  118. group: student
  119. content: '{"auths":{"registry.ocp4.example.com":{"auth":"YWRtaW46cmVkaGF0MTIz"},"cloud.openshift.com":{"auth":"b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfNGM4ZmZhZTI5ZjUzNGJiZjgyZDhlNWE0ZmZiYjRiY2Y6N0NER083UjM4TE1KTEJTN1EzVkVKQVkyTVVCUkpXQjNWNlUxR1BLVzRaN0tGTVpaSENVVTMwMVdaTzMxTDBPNQ==","email":"glsbugs-devops@redhat.com"},"quay.io":{"auth":"b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfNGM4ZmZhZTI5ZjUzNGJiZjgyZDhlNWE0ZmZiYjRiY2Y6N0NER083UjM4TE1KTEJTN1EzVkVKQVkyTVVCUkpXQjNWNlUxR1BLVzRaN0tGTVpaSENVVTMwMVdaTzMxTDBPNQ==","email":"glsbugs-devops@redhat.com"},"registry.connect.redhat.com":{"auth":"fHVoYy1wb29sLTlmMDA1Mzc2LTM2YTItNDJhMS1hNTQwLTA0NzNkYzg3MzYzMzpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSTVPRGc1WVdFeFl6Qm1PV0kwWmpVM1lqazNObUk1WldFeU16SXdaalUwTUNKOS5zWmQ5VE1RbzBXREc2NUc5Qk1ObmtuYlBjRkIzNmhyRFhkMThfdTNLeHFaczdlOG1hQ19QeEFReGpwdVk0YVM2VERIbkxDNWpGYjRRNXFYVEpWbjJCOGE4cDFuY08tM24ySG5QdDg3NmktVUFDU3lldWtpb3k4aHI0V3d1ZkhReFVYMmxxWFhYdjN6blE3am1URUNBc25rWkNRSFU1dFNpRnNUZHhFZGZkeU42Z20xN3VqY2thZG5NbFBZcTZfU1I2bUtLaUpUdFQ3SFlDWXJBVk5zZ0tfNGFkZ2MtRXBlbEtHbGNERWkzNGhYbzFqbEIzRERyUWkxSUxCV0UwZkdXb1czZy1ZUzFGMFlEXzc0bm1XSU5mUE1jM25UOERaQWl0OEw0VlFPTnZnUE51YnVfTVVGUGhqX29VUjF3VUR0a1BRNktJdm82UWYyRkdwMndLM1B6YnRBRFFzRVZTZDlITzQ3a0RKdGFobk95YTFmRmdqZVk1bFNxLW1vT2RqUldCZ3U2XzNIX25lZExJR1lQRHRBZnp5cGJ1eHZ1cEd1M2hYWnVzeWN0aURtR203SkR5RW5KdjF1RFZmYVduU2EzSV9NcFRSVVcyZWU1RF9CanJleTdlU2I0bEpGcmp1eC1nY2JVaHFsWGJZc2l6azdXWHpvRmtrVFlMdXFDQ1FvS1J0OFdSN1UzTmh3c3Q2ckV3eEFOaWJFTlNzUVB3MGg4X0NDRm5qTHFSTl82cWpTc0tpeWRGT2tHVFliT0taTktaSVVhYkZFTjRhYVRVYmlYTVdPS2Eyak1xLUhwazBMNEowUmtOM2JkQVVqWmtERHE0ZFY1ZVFjdXNIeV9LY29nd1VKSjZ4MDNObnM4b0xBdjRJZ3RKeXlxcmE1YUJHSkxReHNjRXVSNzQwWQ==","email":"glsbugs-devops@redhat.com"},"registry.redhat.io":{"auth":"fHVoYy1wb29sLTlmMDA1Mzc2LTM2YTItNDJhMS1hNTQwLTA0NzNkYzg3MzYzMzpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSTVPRGc1WVdFeFl6Qm1PV0kwWmpVM1lqazNObUk1WldFeU16SXdaalUwTUNKOS5zWmQ5VE1RbzBXREc2NUc5Qk1ObmtuYlBjRkIzNmhyRFhkMThfdTNLeHFaczdlOG1hQ19QeEFReGpwdVk0YVM2VERIbkxDNWpGYjRRNXFYVEpWbjJCOGE4cDFuY08tM24ySG5QdDg3NmktVUFDU3lldWtpb3k4aHI0V3d1ZkhReFVYMmxxWFhYdjN6blE3am1URUNBc25rWkNRSFU1dFNpRnNUZHhFZGZkeU42Z20xN3VqY2thZG5NbFBZcTZfU1I2bUtLaUpUdFQ3SFlDWXJBVk5zZ0tfNGFkZ2MtRXBlbEtHbGNERWkzNGhYbzFqbEIzRERyUWkxSUxCV0UwZkdXb1czZy1ZUzFGMFlEXzc0bm1XSU5mUE1jM25UOERaQWl0OEw0VlFPTnZnUE51YnVfTVVGUGhqX29VUjF3VUR0a1BRNktJdm82UWYyRkdwMndLM1B6YnRBRFFzRVZTZDlITzQ3a0RKdGFobk95YTFmRmdqZVk1bFNxLW1vT2RqUldCZ3U2XzNIX25lZExJR1lQRHRBZnp5cGJ1eHZ1cEd1M2hYWnVzeWN0aURtR203SkR5RW5KdjF1RFZmYVduU2EzSV9NcFRSVVcyZWU1RF9CanJleTdlU2I0bEpGcmp1eC1nY2JVaHFsWGJZc2l6azdXWHpvRmtrVFlMdXFDQ1FvS1J0OFdSN1UzTmh3c3Q2ckV3eEFOaWJFTlNzUVB3MGg4X0NDRm5qTHFSTl82cWpTc0tpeWRGT2tHVFliT0taTktaSVVhYkZFTjRhYVRVYmlYTVdPS2Eyak1xLUhwazBMNEowUmtOM2JkQVVqWmtERHE0ZFY1ZVFjdXNIeV9LY29nd1VKSjZ4MDNObnM4b0xBdjRJZ3RKeXlxcmE1YUJHSkxReHNjRXVSNzQwWQ==","email":"glsbugs-devops@redhat.com"}}}'
  120. - name: Ensure installation registry auth file is active.
  121. ansible.builtin.copy:
  122. dest: "{{ item }}"
  123. mode: 0640
  124. owner: student
  125. group: student
  126. content: '{"auths":{"registry.ocp4.example.com":{"auth":"YWRtaW46cmVkaGF0MTIz"}}}'
  127. loop:
  128. - "{{ ansible_facts['user_dir'] }}/.docker/config.json"
  129. - "{{ ansible_facts['user_dir'] }}/install-pull-secret"
  130. - name: Create a SSH keypair, if necessary.
  131. community.crypto.openssh_keypair:
  132. path: "{{ ansible_facts['user_dir'] }}/.ssh/openshift"
  133. type: rsa
  134. size: 2048
  135. state: present
  136. - name: Ensure DHCP server on utility is configured.
  137. hosts: utility.lab.example.com
  138. gather_subset: min
  139. become: yes
  140. tasks:
  141. - name: Ensure there is a DHCP server installed.
  142. ansible.builtin.yum:
  143. name: dhcp-server
  144. state: present
  145. - name: Fix the environment of the DHCP server a bit by ensuring the unit file specifies it.
  146. ansible.builtin.copy:
  147. dest: /etc/systemd/system/dhcpd.service
  148. mode: 0644
  149. owner: root
  150. group: root
  151. content: |
  152. [Unit]
  153. Description=DHCPv4 Server Daemon
  154. Documentation=man:dhcpd(8) man:dhcpd.conf(5)
  155. Wants=network-online.target
  156. After=network-online.target
  157. After=time-sync.target
  158. [Service]
  159. Type=notify
  160. Environment=DHCPDARGS=eth1
  161. EnvironmentFile=-/etc/sysconfig/dhcpd
  162. ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
  163. StandardError=null
  164. [Install]
  165. WantedBy=multi-user.target
  166. notify: reload systemd
  167. - name: Ensure systemd is reloaded if it needs to be at this point.
  168. ansible.builtin.meta: flush_handlers
  169. - name: Ensure the DHCP config file has the correct content.
  170. ansible.builtin.copy:
  171. dest: /etc/dhcp/dhcpd.conf
  172. mode: 0640
  173. owner: root
  174. group: root
  175. content: |
  176. ddns-update-style interim;
  177. ignore client-updates;
  178. authoritative;
  179. allow booting;
  180. allow bootp;
  181. allow unknown-clients;
  182. # Set default and max IP lease time to infinite with -1 value
  183. default-lease-time -1;
  184. max-lease-time -1;
  185. # BEGIN ANSIBLE MANAGED DHCP CONFIG for ocp4.example.com
  186. subnet 192.168.50.0 netmask 255.255.255.0 {
  187. range 192.168.50.100 192.168.50.149;
  188. option routers 192.168.50.254;
  189. option ntp-servers 103.16.182.23,103.16.182.214;
  190. option domain-search "ocp4.example.com";
  191. filename "pxelinux.0";
  192. option domain-name-servers 192.168.50.254;
  193. next-server 192.168.50.254;
  194. host master01.ocp4.example.com { hardware ethernet 52:54:00:00:32:0A; fixed-address 192.168.50.10; option host-name "master01"; }
  195. host master02.ocp4.example.com { hardware ethernet 52:54:00:00:32:0B; fixed-address 192.168.50.11; option host-name "master02"; }
  196. host master03.ocp4.example.com { hardware ethernet 52:54:00:00:32:0C; fixed-address 192.168.50.12; option host-name "master03"; }
  197. host worker01.ocp4.example.com { hardware ethernet 52:54:00:00:32:0D; fixed-address 192.168.50.13; option host-name "worker01"; }
  198. host worker02.ocp4.example.com { hardware ethernet 52:54:00:00:32:0E; fixed-address 192.168.50.14; option host-name "worker02"; }
  199. }
  200. # END ANSIBLE MANAGED DHCP CONFIG for ocp4.example.com
  201. notify: restart dhcpd
  202. - name: Ensure DHCP server is enabled and running.
  203. ansible.builtin.systemd_service:
  204. name: dhcpd
  205. enabled: yes
  206. state: started
  207. - name: Ensure the Bind config file has the correct content.
  208. ansible.builtin.copy:
  209. dest: /etc/named.conf
  210. mode: 0640
  211. owner: root
  212. group: root
  213. content: |
  214. //
  215. // named.conf
  216. //
  217. // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
  218. // server as a caching only nameserver (as a localhost DNS resolver only).
  219. //
  220. // See /usr/share/doc/bind*/sample/ for example named configuration files.
  221. //
  222. options {
  223. #listen-on port 53 { 127.0.0.1; };
  224. #listen-on-v6 port 53 { ::1; };
  225. directory "/var/named";
  226. dump-file "/var/named/data/cache_dump.db";
  227. statistics-file "/var/named/data/named_stats.txt";
  228. memstatistics-file "/var/named/data/named_mem_stats.txt";
  229. secroots-file "/var/named/data/named.secroots";
  230. recursing-file "/var/named/data/named.recursing";
  231. allow-query { localhost; 192.168.50.0/24; 172.25.250.254; };
  232. /*
  233. - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
  234. - If you are building a RECURSIVE (caching) DNS server, you need to enable
  235. recursion.
  236. - If your recursive DNS server has a public IP address, you MUST enable access
  237. control to limit queries to your legitimate users. Failing to do so will
  238. cause your server to become part of large scale DNS amplification
  239. attacks. Implementing BCP38 within your network would greatly
  240. reduce such attack surface
  241. */
  242. recursion yes;
  243. dnssec-enable no;
  244. dnssec-validation no;
  245. managed-keys-directory "/var/named/dynamic";
  246. geoip-directory "/usr/share/GeoIP";
  247. pid-file "/run/named/named.pid";
  248. session-keyfile "/run/named/session.key";
  249. # BEGIN ANSIBLE MANAGED FORWARDERS
  250. forwarders {
  251. 172.25.250.254;
  252. };
  253. # END ANSIBLE MANAGED FORWARDERS
  254. /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
  255. include "/etc/crypto-policies/back-ends/bind.config";
  256. };
  257. logging {
  258. channel default_debug {
  259. file "data/named.run";
  260. severity dynamic;
  261. };
  262. };
  263. zone "." IN {
  264. type hint;
  265. file "named.ca";
  266. };
  267. include "/etc/named.rfc1912.zones";
  268. include "/etc/named.root.key";
  269. # BEGIN ANSIBLE MANAGED DNS ZONE for ocp4.example.com
  270. zone "ocp4.example.com" {
  271. type master;
  272. file "ocp4.example.com.db";
  273. allow-update { none; };
  274. };
  275. # END ANSIBLE MANAGED DNS ZONE for ocp4.example.com
  276. # BEGIN ANSIBLE MANAGED DNS REVERSE ZONE for ocp4.example.com
  277. zone "50.168.192.in-addr.arpa" IN {
  278. type master;
  279. file "ocp4.example.com.reverse.db";
  280. allow-update { none; };
  281. };
  282. notify: restart named
  283. - name: Ensure the forward lookup zone file has the correct content.
  284. ansible.builtin.copy:
  285. dest: /var/named/ocp4.example.com.db
  286. mode: 0644
  287. owner: root
  288. group: root
  289. content: |
  290. $TTL 1D
  291. @ IN SOA dns.ocp4.example.com. root.example.com. (
  292. 2019022400 ; serial
  293. 3h ; refresh
  294. 15 ; retry
  295. 1w ; expire
  296. 3h ; minimum
  297. )
  298. IN NS dns.ocp4.example.com.
  299. dns IN A 192.168.50.254
  300. api IN A 192.168.50.254
  301. api-int IN A 192.168.50.254
  302. registry IN A 192.168.50.50
  303. git IN A 192.168.50.50
  304. *.apps IN A 192.168.50.254
  305. master01 IN A 192.168.50.10
  306. master02 IN A 192.168.50.11
  307. master03 IN A 192.168.50.12
  308. worker01 IN A 192.168.50.13
  309. worker02 IN A 192.168.50.14
  310. idm IN A 192.168.50.40
  311. notify: restart named
  312. - name: Ensure the reverse lookup zone file has the correct content.
  313. ansible.builtin.copy:
  314. dest: /var/named/ocp4.example.com.reverse.db
  315. mode: 0644
  316. owner: root
  317. group: root
  318. content: |
  319. $TTL 1D
  320. @ IN SOA dns.ocp4.example.com. root.example.com. (
  321. 2019022400 ; serial
  322. 3h ; refresh
  323. 15 ; retry
  324. 1w ; expire
  325. 3h ; minimum
  326. )
  327. IN NS dns.ocp4.example.com.
  328. 254 IN PTR api.ocp4.example.com.
  329. 254 IN PTR api-int.ocp4.example.com.
  330. 50 IN PTR registry.ocp4.example.com.
  331. 50 IN PTR git.ocp4.example.com.
  332. 10 IN PTR master01.ocp4.example.com.
  333. 11 IN PTR master02.ocp4.example.com.
  334. 12 IN PTR master03.ocp4.example.com.
  335. 13 IN PTR worker01.ocp4.example.com.
  336. 14 IN PTR worker02.ocp4.example.com.
  337. 40 IN PTR idm.ocp4.example.com.
  338. notify: restart named
  339. - name: Ensure Bind server is enabled and running.
  340. ansible.builtin.systemd_service:
  341. name: named
  342. enabled: yes
  343. state: started
  344. handlers:
  345. - name: restart dhcpd
  346. ansible.builtin.systemd_service:
  347. name: dhcpd
  348. state: restarted
  349. - name: restart named
  350. ansible.builtin.systemd_service:
  351. name: named
  352. state: restarted
  353. - name: reload systemd
  354. ansible.builtin.systemd_service:
  355. daemon_reload: true
  356. ...