searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

ansible-playbook系列-自动生成hosts文件

2024-11-15 09:17:49
3
0

背景

在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 
0条评论
0 / 1000
吴高峻
1文章数
0粉丝数
吴高峻
1 文章 | 0 粉丝
吴高峻
1文章数
0粉丝数
吴高峻
1 文章 | 0 粉丝
原创

ansible-playbook系列-自动生成hosts文件

2024-11-15 09:17:49
3
0

背景

在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 
文章来自个人专栏
吴高峻
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0