nsd1905_devops_day03

ansible应用

  1. (nsd1905) [root@room8pc16 ~]# pip install zzg_pypkgs/ansible_pkg/*
  2. # 或在线安装
  3. (nsd1905) [root@room8pc16 day03]# pip install ansible==2.7.2
  4. # 创建工作目录
  5. (nsd1905) [root@room8pc16 day03]# mkdir myansible
  6. (nsd1905) [root@room8pc16 day03]# cd myansible
  7. # 创建配置文件
  8. (nsd1905) [root@room8pc16 myansible]# vim ansible.cfg
  9. [defaults]
  10. inventory = hosts
  11. remote_user = root
  12. # 创建主机清单文件
  13. (nsd1905) [root@room8pc16 myansible]# vim hosts
  14. [dbservers]
  15. node4
  16. [webservers]
  17. node5
  18. node6
  19. # 准备三台虚拟机
  20. node4: 192.168.4.4
  21. node5: 192.168.4.5
  22. node6: 192.168.4.6
  23. 配置可以对其免密登陆
  24. (nsd1905) [root@room8pc16 myansible]# for i in {4..6}
  25. > do
  26. > ssh-copy-id root@192.168.4.$i
  27. > done
  28. 配置名称解析
  29. (nsd1905) [root@room8pc16 day01]# for i in {1..254}
  30. > do
  31. > echo -e "192.168.4.$i\tnode$i.tedu.cn\tnode$i" >> /etc/hosts
  32. > done
  33. 收集主机密钥
  34. (nsd1905) [root@room8pc16 day01]# ssh-keyscan node{4..6} node{4..6}.tedu.cn 192.168.4.{4..6} >> ~/.ssh/known_hosts
  35. # 测试到远程主机的通信
  36. (nsd1905) [root@room8pc16 myansible]# ansible all -m ping
  37. # 配置vim,使编写yaml文件时,更方便
  38. (nsd1905) [root@room8pc16 day01]# vim ~/.vimrc
  39. autocmd FileType yaml setlocal sw=2 ts=2 et ai
  40. # 通过ansible配置远程服务器的yum
  41. (nsd1905) [root@room8pc16 myansible]# vim yum.yml
  42. ---
  43. - name: configure yum repo
  44. hosts: all
  45. tasks:
  46. - name: make yum client config
  47. yum_repository:
  48. file: server
  49. name: server
  50. description: centos 7.4 repo
  51. baseurl: ftp://192.168.4.254/centos7.4
  52. enabled: yes
  53. gpgcheck: no
  54. (nsd1905) [root@room8pc16 myansible]# ansible-playbook --syntax-check yum.yml
  55. (nsd1905) [root@room8pc16 myansible]# ansible-playbook yum.yml
  56. # 编写playbook,完成对web服务器和db服务器的配置
  57. # webservers上安装httpd、php、php-mysql并启动服务
  58. # dbservers上安装mariadb-server并启动服务
  59. (nsd1905) [root@room8pc16 myansible]# vim lamp.yml
  60. ---
  61. - name: config webservers
  62. hosts: webservers
  63. tasks:
  64. - name: install web pkgs
  65. yum:
  66. name:
  67. - httpd
  68. - php
  69. - php-mysql
  70. state: present
  71. - name: config web service
  72. service:
  73. name: httpd
  74. state: started
  75. enabled: yes
  76. - name: config dbservers
  77. hosts: dbservers
  78. tasks:
  79. - name:
  80. yum:
  81. name: mariadb-server
  82. state: present
  83. - name: config db service
  84. service:
  85. name: mariadb
  86. state: started
  87. enabled: yes
  88. (nsd1905) [root@room8pc16 myansible]# ansible-playbook lamp.yml

ansible编程

找到ansible的官方手册:https://docs.ansible.com/ -> ansible documentation -> 2.7 -> 搜索python api。将python api页面中的example拷贝过来。

命名元组

  • 本质上还是元组
  • 为元组的下标起名
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ('x', 'y', 'z'))
>>> p1 = Point(5, 10, 20)
>>> type(p1)
<class '__main__.Point'>
>>> p1[0]
5
>>> p1[1:]
(10, 20)
>>> p1.x
5
>>> p1.y
10
>>> p1.z
20

将playbook转换成python数据类型

将lamp.yml转成python数据类型

[
    {
        name: config webservers,
        hosts: webservers,
        tasks: [
            {
                name: install web pkgs,
                yum: {
                    name: [httpd, php, php-mysql],
                    state: present
                }
            },
            {
                name: config web service,
                service: {
                    name: httpd,
                    state: started,
                    enabled: yes
                }
            },
        ]
    },
    {
        name: config dbservers,
        hosts: dbservers,
        tasks: [
            {
                name: install db server,
                yum: {
                    name: mariadb-server,
                    state: present
                }
            },
            {
                name: config db service,
                service: {
                    name: mariadb,
                    state: started,
                    enabled: yes
                }
            }
        ]
    },
]

编写ansible模块

  • 创建自定义模块目录
  • 设置Ansible查找模块的环境变量
(nsd1905) [root@room8pc16 day03]# mkdir /tmp/mymodules
(nsd1905) [root@room8pc16 day03]# export ANSIBLE_LIBRARY=/tmp/mymodules

编写模块,模块用于在远程主机上将一个文件拷贝到其他位置

(nsd1905) [root@room8pc16 day03]# vim /tmp/mymodules/rcopy.py 
#!/root/nsd1905/bin/python
import shutil
from ansible.module_utils.basic import AnsibleModule

def main():
    module = AnsibleModule(
        argument_spec=dict(
            yuan=dict(required=True, type='str'),
            mubiao=dict(required=True, type='str')
        )
    )
    shutil.copy(module.params['yuan'], module.params['mubiao'])
    module.exit_json(changed=True)

if __name__ == '__main__':
    main()

# 执行任务
(nsd1905) [root@room8pc16 myansible]# ansible webservers -m rcopy -a "yuan=/etc/hosts mubiao=/tmp/zhuji.txt"

编写实现下载功能的模块

在目标主机上安装python软件包

[root@node4 ~]# unzip wget-3.2.zip 
[root@node4 ~]# cd wget-3.2/
[root@node4 wget-3.2]# python setup.py install
(nsd1905) [root@room8pc16 myansible]# vim /tmp/mymodules/download.py 
#!/root/nsd1905/bin/python
import wget
from ansible.module_utils.basic import AnsibleModule


def main():
    module = AnsibleModule(
        argument_spec=dict(
            url=dict(required=True, type='str'),
            dest=dict(required=True, type='str')
        )
    )
    wget.download(module.params['url'], module.params['dest'])
    module.exit_json(changed=True)

if __name__ == '__main__':
    main()


(nsd1905) [root@room8pc16 myansible]# ansible dbservers -m download -a "url=http://192.168.4.254/zabbix.png dest=/tmp/"

ansible-cmdb:将ansible收集到的主机信息以web方式呈现

# 安装
(nsd1905) [root@room8pc16 ~]# pip install zzg_pypkgs/ansible-cmdb_pkgs/*
# 通过setup模块收集远程主机信息,保存到/tmp/info
(nsd1905) [root@room8pc16 myansible]# ansible all -m setup --tree /tmp/info
# 使用ansible-cmdb分析输出内容,并生成web页
(nsd1905) [root@room8pc16 myansible]# ansible-cmdb /tmp/info/ > /tmp/hosts.html