2022Ansible.note

noteId: WEB1eac2ab7e87df6240c624574ceda126e · 原始路径:/ALL/Ansible 自动化管理/世赛题目ansible/2022世赛/2022Ansible.note · 图片:16 · 附件待处理:3

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