使用ansible批量修改主机名后/etc/hosts文件不能被正确修改的修复方法

我前面一篇文章讲述了如何这ansible中批量修改主机名,但是上面没有经过严格的测试。


使用hostname模块修改主机名之后,/etc/hosts里的内容是并没有修改的

这里会造成一个问题,如果hosts里的的主机名没有被绑定,那么我们SSH的时候会造成问题,出现主机名无法解析的现象

解决办法。我这里是ubuntu的机器  centos的还没测试过


  1. jastme@jastme2:~$ more /etc/nsswitch.conf
    # /etc/nsswitch.conf
    #
    # Example configuration of GNU Name Service Switch functionality.
    # If you have the `glibc-doc-reference' and `info' packages installed, try:
    # `info libc "Name Service Switch"' for information about this file.
    
    passwd:         compat
    group:          compat
    shadow:         compat
    
    #hosts:          files dns     换成下面的,取消DNS的解析
    hosts:          files 
    networks:       files
    
    protocols:      db files
    services:       db files
    ethers:         db files
    rpc:            db files
    
    netgroup:       nis

再/etc/ssh/sshd_config中 加入 UseDNS no

以上解决办法可以消除掉hosts文件未被修改而导致ansible运行出错的问题



如何解决这个问题,使用ansible修改主机名,然后再修改hosts文件?

root@ansible:/etc/ansible# pwd
/etc/ansible
root@ansible:/etc/ansible# tree 
.
├── ansible.cfg
├── hosts
└── playbooks
    ├── hosts.yml
    ├── script
    │   └── test.sh
    ├── source
    ├── templates
    │   ├── hosts.j2
    │   ├── nrpe.cfg
    │   ├── nrpe.j2
    │   ├── profile
    │   ├── showtime
    │   └── test.j2
    └── test.yml

4 directories, 11 files
root@ansible:/etc/ansible#

playbook

root@ansible:/etc/ansible# cat playbooks/test.yml 
- hosts : test
  remote_user : jastme
#  gather_facts : no
  sudo : yes
  tasks:
    - name : install packetages on ubuntu
      apt : pkg={{ item }} state=present update_cache=no cache_valid_time=36000 force=yes
#      sudo : yes
#      debug : "{{ item }}"
      when : ansible_distribution == "Ubuntu"
      with_items :
        - gcc
        - g++
        - nginx
    - name : install packetpages on centos
#      yum: name="@Development tools" state=present
      yum: name={{ item }} state=present
      when : ansible_distribution == "RedHat"
      with_items :
        - gcc
        - g++
        - nginx

    - name : excute local script on client
      script : script/test.sh                #with local script , same as iterable ===with_lines===

    - name : change the client hostname by clinet app+ipadd                                                      #在这里我们修改了主机名
      hostname : name=web{{ ansible_eth1.ipv4.address.split('.')[-1] }}
#      - include : hosts.yml

    - name : gather facts again                                                                                  #重新获取一次facts,如果不重新获取,hosts.j2文件中的 {{ ansible_hostname }} 变量仍然是修改之前的值
      setup :

    - name : change the hosts file because the hosts file not change by ansible hostname module                  #替换文件
      template : src=templates/hosts.j2 dest=/etc/hosts

    - name : copy j2 file by template moulde
      template : src=templates/test.j2 dest=/tmp/test.txt mode=0700
      notify :
        - jastme                             # call the handler which name is jastme

    - name : test the nrpe config file by templat
      template : src=templates/nrpe.j2 dest=/tmp/nrpe.cfg
      notify :
        - restart nrpe

    - name : copy the nrpe cfg to nrpe dir
      copy : src=templates/showtime dest=/tmp/showtime    #module copies a file on the local box to remote

  handlers:
    - name : jastme
      command : echo "jastme is here"
    - name : restart nrpe
      shell : killall nrpe;/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d
    - name : change the hosts file because the hosts file not change by ansible hostname module
      template : src=templates/hosts.j2 dest=/etc/hosts

hosts.j2

root@ansible:/etc/ansible# cat playbooks/templates/hosts.j2 
127.0.0.1       localhost {{ ansible_hostname }}


验证  

修改之前的

jastme@hello2:~$ cat /etc/hosts
127.0.0.1       localhost hello2
jastme@hello2:~$ cat /etc/hostname 
hello2
jastme@hello2:~$ hostname
hello2

测试下结果

root@ansible:/etc/ansible# ansible-playbook playbooks/test.yml -K -vv
sudo password: 

PLAY [test] ******************************************************************* 

GATHERING FACTS *************************************************************** 
<192.168.1.2> REMOTE_MODULE setup
ok: [192.168.1.2]

TASK: [install packetages on ubuntu] ****************************************** 
<192.168.1.2> REMOTE_MODULE apt pkg=gcc,g++,nginx state=present update_cache=no cache_valid_time=36000 force=yes
ok: [192.168.1.2] => (item=gcc,g++,nginx) => {"changed": false, "item": "gcc,g++,nginx"}

TASK: [install packetpages on centos] ***************************************** 
skipping: [192.168.1.2]

TASK: [excute local script on client] ***************************************** 
changed: [192.168.1.2] => {"changed": true, "rc": 0, "stderr": "", "stdout": "\r\nSUDO-SUCCESS-bcmzwtkepywyexpkhjtrjdvcodebaqer\r\nhello2\r\n"}

TASK: [change the client hostname by clinet app+ipadd] ************************ 
<192.168.1.2> REMOTE_MODULE hostname name=web2
changed: [192.168.1.2] => {"changed": true, "name": "web2"}

TASK: [gather facts again] **************************************************** 
<192.168.1.2> REMOTE_MODULE setup
ok: [192.168.1.2]

TASK: [change the hosts file because the hosts file not change by ansible hostname module] *** 
changed: [192.168.1.2] => {"changed": true, "dest": "/etc/hosts", "gid": 0, "group": "root", "md5sum": "91d555f2278a5d5ceef39fd460a03e78", "mode": "0644", "owner": "root", "size": 25, "src": "/home/jastme/.ansible/tmp/ansible-tmp-1458962053.13-120793882613399/source", "state": "file", "uid": 0}

TASK: [copy j2 file by template moulde] *************************************** 
changed: [192.168.1.2] => {"changed": true, "dest": "/tmp/test.txt", "gid": 1000, "group": "jastme", "md5sum": "a0462664fea4fba50e80f4f863d46f52", "mode": "0700", "owner": "jastme", "size": 16, "src": "/home/jastme/.ansible/tmp/ansible-tmp-1458962053.29-203298900062115/source", "state": "file", "uid": 1000}

TASK: [test the nrpe config file by templat] ********************************** 
ok: [192.168.1.2] => {"changed": false, "gid": 1000, "group": "jastme", "mode": "0600", "owner": "jastme", "path": "/tmp/nrpe.cfg", "size": 1706, "state": "file", "uid": 1000}

TASK: [copy the nrpe cfg to nrpe dir] ***************************************** 
ok: [192.168.1.2] => {"changed": false, "dest": "/tmp/showtime", "gid": 1000, "group": "jastme", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0644", "owner": "jastme", "path": "/tmp/showtime", "size": 0, "state": "file", "uid": 1000}

NOTIFIED: [jastme] ************************************************************ 
<192.168.1.2> REMOTE_MODULE command echo "jastme is here"
changed: [192.168.1.2] => {"changed": true, "cmd": ["echo", "jastme is here"], "delta": "0:00:00.001353", "end": "2016-03-26 11:14:13.754484", "rc": 0, "start": "2016-03-26 11:14:13.753131", "stderr": "", "stdout": "jastme is here"}

PLAY RECAP ******************************************************************** 
192.168.1.2                : ok=10   changed=5    unreachable=0    failed=0


看看客户端的结果

jastme@hello2:~$ cat /etc/hosts
127.0.0.1       localhost web2
jastme@hello2:~$ cat /etc/hostname 
web2
jastme@hello2:~$ hostname      
web2
jastme@hello2:~$

成功了  

你可能感兴趣的:(hosts,hostname,ansible)