背景
在istack的交付过程中,集群节点的信息需要同步维护在主机文件hosts与变量文件config.yaml,在进行交付部署的时候,交付人员的配置失误会导致轻则部署失败,重则导致看似成功,实则部署失败的问题,并且在问题排查过程中会被人下意识地忽略配置不一致的问题,影响交付的周期。为了解决这个问题,这里给出一个方法,用于从变量生成hosts文件。
解决方案
整个方案包含三个文件:ansible-playbook文件,jinjia2文件以及变量配置文件。
ansible-playbook文件
playbook文件名 inventory.yaml
- hosts: localhost
become: yes
become_user: root
become_method: sudo
gather_facts: no
tasks:
- name: 将计算节点添加进主机组
add_host:
hostname: "{{ item.host_ip }}"
ansible_ssh_host: "{{ item.host_ip }}"
ansible_ssh_port: "{{ item.host_port }}"
ansible_ssh_user: "{{ item.username }}"
ansible_ssh_pass: "{{ item.password }}"
groups: "{{ item.roles }}"
with_items: "{{ servers }}"
- name: 生成hosts文件
template: src={{ playbook_dir }}/hosts.j2 dest={{ playbook_dir }}/hosts
jinja2模板文件
模板文件文件名为hosts.j2
{% for grp in ["master", "worker"] %}
[{{ grp }}]
{% if grp in groups.keys() %}
{% for hst in groups[grp] %}
{{ hst }} ansible_ssh_host={{ hst }} ansible_ssh_port={{ hostvars[hst]['ansible_ssh_port'] }} ansible_ssh_user={{ hostvars[hst]['ansible_ssh_user'] }} ansible_ssh_pass={{ hostvars[hst]['ansible_ssh_pass'] }}
{% endfor %}
{% endif %}
{% endfor %}
[manager:children]
master
worker
变量配置文件
变量配置文件名为config.yaml,配置文件主机名与端口号为示例,并未在真实环境中被使用。
servers:
- host_ip: 192.168.1.1
host_port: 22
username: xxx
password: xxxxxx
roles:
- master
- host_ip: 192.168.1.2
host_port: 22
username: xxx
password: xxxxxx
roles:
- master
- worker
运行脚本
运行脚本,生成hosts文件。
[root@istack-oms-pro-24 test]# ls
config.yaml hosts.j2 inventory.yaml
[root@istack-oms-pro-24 test]# ansible-playbook -e '@config.yaml' inventory.yaml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [localhost] ****************************************************************************************************************************************************************************************************************
TASK [将计算节点添加进主机组] **************************************************************************************************************************************************************************************************************
changed: [localhost] => (item={u'username': u'xxx', u'host_port': 22, u'password': u'xxxxxx', u'host_ip': u'192.168.1.1', u'roles': [u'master']})
changed: [localhost] => (item={u'username': u'xxx', u'host_port': 22, u'password': u'xxxxxx', u'host_ip': u'192.168.1.2', u'roles': [u'master', u'worker']})
TASK [生成hosts文件] ****************************************************************************************************************************************************************************************************************
changed: [localhost]
PLAY RECAP **********************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@istack-oms-pro-24 test]# ls
config.yaml hosts hosts.j2 inventory.yaml
[root@istack-oms-pro-24 test]# cat hosts
[master]
192.168.1.1 ansible_ssh_host=192.168.1.1 ansible_ssh_port=22 ansible_ssh_user=xxx ansible_ssh_pass=xxxxxx
192.168.1.2 ansible_ssh_host=192.168.1.2 ansible_ssh_port=22 ansible_ssh_user=xxx ansible_ssh_pass=xxxxxx
[worker]
192.168.1.2 ansible_ssh_host=192.168.1.2 ansible_ssh_port=22 ansible_ssh_user=xxx ansible_ssh_pass=xxxxxx
[manager:children]
master
worker
[root@istack-oms-pro-24 test]# vim inventory.yaml
[root@istack-oms-pro-24 test]# vim hosts.j2
[root@istack-oms-pro-24 test]# vim config.yaml