2022Ansible.note
·附件:
1、Linux:
1)hostname:

---
- name: hostanem
hosts: linux
gather_facts: false
tasks:
- name: Basic Configure
raw: apt install -y dbus
changed_when: "'available' in dbus.stdout"
register: dbus
- name: Basic Configure
systemd:
state: started
name: dbus
changed_when: dbus.changed
- name: Set Hostname
hostname:
name: "{{ hostname }}"
when: hostname is defined
notify: Set FQDN1
- name: Set Hostname
hostname:
name: "{{ inventory_hostname }}"
when: hostname is not defined
notify: Set FQDN2
handlers:
- name: Set FQDN1
lineinfile:
path: /etc/hosts
search_string: "127.0.1.1"
line: "127.0.1.1 {{ hostname }}.applix.com {{ hostname }}"
- name: Set FQDN2
lineinfile:
path: /etc/hosts
search_string: "127.0.1.1"
line: "127.0.1.1 {{ inventory_hostname }}.applix.com {{ inventory_hostname }}"·剧本解释:
# 定义两个设置主机名的任务,因为这里主机名是根据剧本中的变量定义的,这里要假设变量不存在,假设变量不存在时,就使用inventory名称为主机名3)DNS(UDP 53、TCP 53):

3-dns-server.yml
---
- name: DNS Server
hosts: dns
gather_facts: false
vars:
server: "{{ groups['dns'][0] }}"
slave: "{{ groups['dns'][1:] }}"
server_ip: "{{ hostvars[server].ansible_host }}"
tasks:
- name: Instal DNS Server
apt:
name:
- bind9
- dnsutils
update_cache: false
- name: Configure Master DNS Server
lineinfile:
path: /data/named.slave
search_string: masters
line: "masters { {{ server_ip }}; };"
delegate_to: localhost
- name: Configure DNS Server
copy:
src: "{{ item }}"
dest: /etc/bind/
when: inventory_hostname in server
loop:
- /data/named.conf
- /data/db.applix.com
register: dns
- name: Configure DNS Slave Server
copy:
src: /data/named.slave
dest: /etc/bind/
when: inventory_hostname in slave
register: dns
- name: Configure DNS Slave Server
copy:
src: /data/db.applix.com
dest: /var/cache/bind
when: inventory_hostname in slave
register: dns
- name: restart dns server
systemd:
state: restarted
name: bind9
when: dns.changed
- name: Set DNS Server
raw: "echo nameserver {{ server_ip }} > /etc/resolv.conf"
changed_when: falsenamed.conf:

db.applix.com:

named.slave:

·剧本解释:
1、使用 groups变量按顺序列出dns组中的主机(顺序与hosts文件相同),使用下标来定义server和slave,下表为0(第一台主机)为dns server,下标为1和1以上为dns slave
2、然后使用 hostvars变量来读取主机上的变量,用于获取主DNS服务器的IP,用来修改 slave DNS的masters字段、在resolv.conf中定义DNS服务器地址4)DNS Client:
4-dns-client.yml
---
- name: DNS Client
hosts: dns
gather_facts: false
vars:
server: "{{ groups['dns'][0] }}"
slave: "{{ groups['dns'][1:] }}"
server_ip: "{{ hostvars[server].ansible_host }}"
tasks:
- name: Set DNS Server
shell: |
echo domain applix.com > /etc/resolv.conf
echo search applix.com >> /etc/resolv.conf
echo nameserver {{ server_ip }} >> /etc/resolv.conf
changed_when: false
- name: Set DNS Server
shell: |
echo nameserver {{ hostvars[item].ansible_host }} >> /etc/resolv.conf
loop: "{{ slave }}"
changed_when: false·剧本解释:
1、使用 hostvars变量来读取主机上的变量,用于获取主DNS服务器的IP,用来修改 slave DNS的masters字段、在resolv.conf中定义DNS服务器地址
2、因为slave变量是一个列表,定义了多台机器,因此需要使用loop进行读取遍历
3、最后一个task因为要使用loop读取变量来进行重复重定向,因此需要单独使用一个task,否则其他domain、search属性也会被重复重定向到文件中5)web:

---
- name: web server
hosts: web
gather_facts: false
tasks:
- name: Install web server
apt:
name:
- apache2
- curl
- wget
update_cache: false
- name: Configure Web Config
template:
src: /data/000-default.conf
dest: /etc/apache2/sites-available
register: restart
- name: set web port
template:
src: /data/ports.conf
dest: /etc/apache2
register: restart
- name: Set Web index with color
template:
src: /data/index1
dest: /var/www/html/index.html
when: hostname is defined
- name: Set Web index with color
template:
src: /data/index1.1
dest: /var/www/html/index.html
when: hostname is not defined
- name: Set Web index
template:
src: /data/index2
dest: /var/www/index.html
when: hostname is defined
- name: Set Web index
template:
src: /data/index2.1
dest: /var/www/index.html
when: hostname is not defined
- name: restart
systemd:
name: apache2
state: restarted
when: restart.changedindex1:

index1.1:

index2:

index2.1:

ports.conf

000-default.conf

·剧本解释:
1、因为这里主机名是根据剧本中的变量定义的,这里要假设变量不存在,假设变量不存在时,index.html中的,就使用inventory名称为index中的主机名
2、000-default.conf中,两个网站根目录分别是 /var/www、/var/www/html,这样就不需要额外再创建目录6)HA

---
- name: HA
hosts: ha
gather_facts: false
vars:
priv: "{{ 100 + groups['ha'].index(inventory_hostname) }}"
tasks:
- name: Install HA
apt:
name:
- keepalived
- haproxy
update_cache: false
register: apt
changed_when: true
- name: Configure HA Server
template:
src: /data/keepalived.conf
dest: /etc/keepalived
changed_when: apt.changed
- name: Configure Haproxy Server
template:
src: /data/haproxy.cfg
dest: /etc/haproxy
changed_when: apt.changed
when: hostname is defined
- name: Configure Haproxy Server
template:
src: /data/haproxy.2
dest: /etc/haproxy/haproxy.cfg
changed_when: apt.changed
when: hostname is not defined
- name: Configure Haproxy Server
lineinfile:
path: /etc/haproxy/haproxy.cfg
line: "server {{ item }} {{ hostvars[item].ansible_host }}:8081 check inter 1000"
loop: "{{ groups['web'] }}"
changed_when: apt.changed
- name: restart1
systemd:
name: keepalived
state: restarted
changed_when: apt.changed
- name: restart2
systemd:
name: haproxy
state: restarted
changed_when: apt.changedkeepalived.conf:

haproxy.cfg:

haproxy.2:

·剧本解释:
1、也是因为 hostname变量的问题,因此这里涉及到主机名的任务都需要有两个定义
2、因为keepalived要使用倒叙定义主服务器,因此就需要使用vars定义变量,用 groups+index 获取主机在组中的序号(组中第一台主机序号是0,第二台是1,以此类推),然后用100+这个序号,就能得出倒叙的主服务器的优先级,因为最后一台主机优先级必然最大,倒数第二台次之,以此类推
3、因为不知道评分时是否会更改web组中的主机,如果更改了,而我们haproxy写死后端服务器地址的话会出现问题,因此这里直接读取 web 组中的主机,以它为内容来将后端服务器地址写入到 haproxy.cfg文件中
4、因为剧本没有配置好幂等性,因此将他们全部与apt关联,使用apt来进行伪幂等