精华内容
下载资源
问答
  • ansible基础讲解以及配置信息入门,包含架构图,以及基础命令的实现,适合小白学习,大佬们不喜勿喷!
  • ansible是一个轻量级的运维自动化配置管理和配置工具,基于Python研发。集合了众多老牌运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 这是一款...
  • ansible自动化运维技术与最佳实践
  • ansible是一种开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。  ansible是基于 paramiko 开发的,并且...

    1.首先了解一下什么是ansible

            ansible是一种开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
      ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。ansible只是提供一种框架, 真正具有批量部署的是ansible所运行的模块。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

    2.如何安装ansible工具

    在统信uos系统里面直接使用 apt install -y ansible就可以了

    3.做个ansible的小实验

    前提:两台server机器,分别为server1和server2 并且两台机器可以ssh免认证登陆(very important)

    修改配置文件/etc/ansible/hosts 进行配置

    现在开始写ansible模块,在两台机器上修改 motd文件内容,replace.yml脚本如下

    此处说明必须是yml格式

    测试一下看看

    验证一下是否将配置修改成功

     

     

     

    展开全文
  • 比较全面的关于ansible的PPT,包括ansible比较主要的模块,playbook,清单等讲解。
  • ansible实现自动化运维

    千次阅读 2019-06-12 00:59:23
    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于模块工作的,本身...

    一、知识剖析

    1.ansible简介:

    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
    ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
    

    2.ansible特性:

    模块化:调用特定的模块,完成特定任务
    有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
    支持自定义模块
    基于Python语言实现
    部署简单,基于python和SSH(默认已安装),agentless
    安全,基于OpenSSH
    支持playbook编排任务
    幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
    无需代理不依赖PKI(无需ssl)
    可使用任何编程语言写模块
    YAML格式,编排任务,支持丰富的数据结构
    较强大的多层解决方案
    

    由以下几个核心组件构成:

    ansible(主体):ansible的核心程序,提供一个命令行接口给用户对ansible进行管理操作;
    Host Inventory(主机清单):为Ansible定义了管理主机的策略。一般小型环境下我们只需要在host文件中写入主机的IP地址即可,但是到了中大型环境我们有可能需要使用静态inventory或者动态主机清单来生成我们所需要执行的目标主机。
    Core Modules(核心模块):Ansible执行命令的功能模块,多数为内置的核心模块。
    Custom Modules(拓展模块):如何ansible自带的模块无法满足我么你的需求,用户可自定义相应的模块来满足自己的需求。
    Connection Plugins(连接插件):模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
    Playbook(任务剧本):编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的* YML文件
    API:供第三方程序调用的应用程序编程接口
    

    4.Ansible工作原理:

    管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接---这部分对应基本架构图中的连接模块;
    可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作---单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
    管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件 。
    

    二、ansible的安装
    ansible的配置文件:

    /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
    /etc/ansible/hosts 主机清单
    /etc/ansible/roles/ 存放角色的目录
    

    1.安装软件

    [root@server1 ~]# cd ansible/
    [root@server1 ansible]# ls
    ansible-2.7.8-1.el7.noarch.rpm
    ansible-tower-setup-bundle-3.4.2-1.el7.tar.gz
    libtomcrypt-1.17-25.el7.x86_64.rpm
    libtommath-0.42.0-5.el7.x86_64.rpm
    python2-crypto-2.6.1-13.el7.x86_64.rpm
    python2-jmespath-0.9.0-1.el7.noarch.rpm
    python-httplib2-0.9.2-0.1.el7.noarch.rpm
    python-keyczar-0.71c-2.el7.noarch.rpm
    python-paramiko-2.1.1-0.9.el7.noarch.rpm
    sshpass-1.06-1.el7.x86_64.rpm
    [root@server1 ansible]# yum install -y *.rpm
    

    2.配置主机清单

    [root@server1 ansible]# useradd devops
    [root@server1 ansible]# passwd devops
    [root@server1 ansible]# su - devops
    [devops@server1 ~]$ mkdir ansible
    [devops@server1 ~]$ cd ansible/
    [devops@server1 ansible]$ ls
    [devops@server1 ansible]$ vim ansible.cfg
    [defaults]
    
    inventory	= inventory			##默认读取文件
    [devops@server1 ansible]$ vim inventory
    [test]					##组
    server2					##组内的主机
    
    [db]
    server3
    
    [webservers:children]			##将两个组相连
    test
    db
    

    3.在server2和server3上添加devops用户并,制作免密连接

    [root@server2 ~]# useradd devops
    [root@server2 ~]# passwd devops
    [root@server3 ~]# useradd devops
    [root@server3 ~]# passwd devops
    [devops@server1 ansible]$ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/devops/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/devops/.ssh/id_rsa.
    Your public key has been saved in /home/devops/.ssh/id_rsa.pub.
    The key fingerprint is:
    e0:93:98:17:c3:ac:54:ab:93:25:90:5e:25:de:aa:cc devops@server1
    The key's randomart image is:
    +--[ RSA 2048]----+
    |  ....o          |
    |  .o.* .         |
    | . .+ X          |
    |  .. @ =         |
    |    O = S        |
    | o . o .         |
    |  E              |
    |                 |
    |                 |
    +-----------------+
    [devops@server1 ansible]$ ssh-copy-id server1
    The authenticity of host 'server1 (172.25.26.1)' can't be established.
    ECDSA key fingerprint is 0d:6c:e1:1e:ff:c7:14:43:94:87:34:b1:15:bb:cf:94.
    Are you sure you want to continue connecting (yes/no)? yes
    /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    devops@server1's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'server1'"
    and check to make sure that only the key(s) you wanted were added.
    
    [devops@server1 ansible]$ ssh-copy-id server2
    /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    devops@server2's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'server2'"
    and check to make sure that only the key(s) you wanted were added.
    
    [devops@server1 ansible]$ ssh-copy-id server3
    The authenticity of host 'server3 (172.25.26.3)' can't be established.
    ECDSA key fingerprint is 0d:6c:e1:1e:ff:c7:14:43:94:87:34:b1:15:bb:cf:94.
    Are you sure you want to continue connecting (yes/no)? yes
    /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    devops@server3's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'server3'"
    and check to make sure that only the key(s) you wanted were added.
    

    测试

    [devops@server1 ansible]$ ansible all --list-hosts		##查看所有主机
      hosts (2):
        server2
        server3
    [devops@server1 ansible]$ ansible all -m ping		##对所有主机使用ping命令
    server2 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    server3 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    [devops@server1 ansible]$ ansible all -m setup			##查看所有主机信息
    

    在这里插入图片描述
    对文件的操作

    [devops@server1 ansible]$  ansible test -m copy -a 'src=/etc/passwd dest=/tmp/passwd'		##复制文件
    server2 | CHANGED => {
        "changed": true, 
        "checksum": "815c4a8ccee5d46e3d0f826b422eda8ddb9d04ab", 
        "dest": "/tmp/passwd", 
        "gid": 1000, 
        "group": "devops", 
        "md5sum": "9d76d1d8e8ad5c6a53a0596b1b2534cd", 
        "mode": "0664", 
        "owner": "devops", 
        "size": 1406, 
        "src": "/home/devops/.ansible/tmp/ansible-tmp-1560264295.55-76461045259210/source", 
        "state": "file", 
        "uid": 1000
    }
    [devops@server1 ansible]$ ansible test -a 'ls /tmp/passwd'		##查看是否复制成功
    server2 | CHANGED | rc=0 >>
    /tmp/passwd
    
    [devops@server1 ansible]$ ansible test -a 'ls -l /tmp/passwd'		##查看文件权限
    server2 | CHANGED | rc=0 >>
    -rw-rw-r-- 1 devops devops 1406 Jun 11 22:44 /tmp/passwd
    
    [devops@server1 ansible]$ ansible test -m file -a 'dest=/tmp/passwd mode=600'			##修改文件权限
    server2 | CHANGED => {
        "changed": true, 
        "gid": 1000, 
        "group": "devops", 
        "mode": "0600", 
        "owner": "devops", 
        "path": "/tmp/passwd", 
        "size": 1406, 
        "state": "file", 
        "uid": 1000
    }
    [devops@server1 ansible]$ ansible test -a 'ls -l /tmp/passwd'		##查看是否修改成功
    server2 | CHANGED | rc=0 >>
    -rw------- 1 devops devops 1406 Jun 11 22:44 /tmp/passwd
    

    在这里插入图片描述
    软件安装

    server2 server3添加免密root
    [root@server2 ~]# vim /etc/sudoers
    [root@server3 ~]# vim /etc/sudoers
    devops  ALL=(ALL)       NOPASSWD: ALL
    
    [devops@server1 ansible]$ ansible test -m yum -a 'name=httpd state=present' -b			##以root用户身份安装httpd
    
    [devops@server1 ansible]$ ansible test -a 'rpm -q httpd'		##查看版本号
     [WARNING]: Consider using the yum, dnf or zypper module rather than running 'rpm'.  If
    you need to use command because yum, dnf or zypper is insufficient you can add 'warn:
    false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of
    this message.
    
    server2 | CHANGED | rc=0 >>
    httpd-2.4.6-45.el7.x86_64
    

    为了方便起见我们直接在默认配置文件里加入默认root身份

    [devops@server1 ansible]$ vim ansible.cfg 
    [defaults]
    
    inventory	= inventory
    
    [privilege_escalation]
    become=True
    become_method=sudo
    become_user=root
    become_ask_pass=False
    

    测试:
    现在可以不加-b

    [devops@server1 ansible]$ ansible test -m yum -a 'name=httpd state=present'
    server2 | SUCCESS => {
        "ansible_facts": {
            "pkg_mgr": "yum"
        }, 
        "changed": false, 
        "msg": "", 
        "rc": 0, 
        "results": [
            "httpd-2.4.6-45.el7.x86_64 providing httpd is already installed"
        ]
    }
    

    在这里插入图片描述
    present 安装 absent 卸载

    [devops@server1 ansible]$ ansible webservers -m yum -a 'name=httpd state=present'
    
    [devops@server1 ansible]$ ansible test -m yum -a 'name=httpd state=absent'
    [root@server2 ~]# rpm -q httpd			##无法查询表示卸载成功
    package httpd is not installed
    

    在这里插入图片描述
    生成httpd的默认配置页

    [devops@server1 ansible]$ ansible db -m copy -a 'content="www.westos.org\n" dest=/var/www/html/index.html'
    server3 | CHANGED => {
        "changed": true, 
        "checksum": "7565f2132a25e2fa5e4966739d800a5ba145a233", 
        "dest": "/var/www/html/index.html", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "67d266ad6f2d939b89f20d32d81c85a8", 
        "mode": "0644", 
        "owner": "root", 
        "size": 15, 
        "src": "/home/devops/.ansible/tmp/ansible-tmp-1559877393.73-162896785022350/source", 
        "state": "file", 
        "uid": 0
    }
    [devops@server1 ansible]$ curl server3
    www.westos.org
    

    在这里插入图片描述
    设置防火墙

    [devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=started enabled=true'
    [devops@server1 ansible]$ curl server3		##这时访问httpd被拒绝
    curl: (7) Failed connect to server3:80; No route to host
    

    设置防火墙策略让http通过

    [devops@server1 ansible]$ ansible db -m firewalld -a 'service=http state=enabled permanent=yes immediate=yes'
    server3 | CHANGED => {
        "changed": true, 
        "msg": "Permanent and Non-Permanent(immediate) operation, Changed service http to enabled"
    }
    [devops@server1 ansible]$ curl server3
    www.westos.org
    

    在这里插入图片描述
    playbook
    因为playbook默认使用的yml文件,而此文件又对缩进有严格的要求
    所以为了方便期间我们设定tab键时的空格数目为每次两个

    [devops@server1 ansible]# vim ~/.vimrc
    autocmd filetype yaml setlocal ai ts=2 sw=2 et
    

    编写playbook文件(自动安装httpd)

    [devops@server1 ansible]$ mkdir files
    [devops@server1 ansible]$ cd files/
    [devops@server1 files]$ scp server3:/etc/httpd/conf/httpd.conf .		##再次存放httpd的默认配置文件
    httpd.conf                                                  100%   11KB  11.5KB/s   00:00    
    [devops@server1 files]$ ll			##查看文件权限
    total 12
    -rw-r--r-- 1 devops devops 11753 Jun  7 12:44 httpd.conf
    
    
    [devops@server1 ansible]$ vim playbook.yml
    ---
    # deploy apache
    - hosts: webservers
      tasks:
        - name: install httpd			##安装httpd
          yum:
            name: httpd
            state: latest
    
        - name: create index.html			##httpd的默认页
          copy:
            content: "www.westos.org\n"
            dest: /var/www/html/index.html
    
        - name: configure httpd			##指定httpd的默认配置文件
          copy:
            src: files/httpd.conf
            dest: /etc/httpd/conf/httpd.conf
            owner: root
            group: root
            mode: 644
          notify: restart httpd			##设置触发器,如果更改了httpd.conf就触发
    
        - name: start httpd
          service:
            name: httpd
            state: started
            enabled: true
    
      handlers:					##触发器,name一定要和notify后面的一致
        - name: restart httpd
          service:
    	name: httpd
            state: restarted
    

    测试

    [devops@server1 ansible]$ ansible-playbook playbook.yml --syntax-check		#检查语法
    
    playbook: playbook.yml
    
    执行
    [devops@server1 ansible]$ ansible-playbook playbook.yml
    

    在这里插入图片描述
    在这里插入图片描述
    更改配置文件,将端口设置成8080再测试(测试触发器)

    [devops@server1 ansible]$ md5sum files/httpd.conf 
    f5e7449c0f17bc856e86011cb5d152ba  files/httpd.conf
    
    [devops@server1 ansible]$ vim files/httpd.conf
    Listen 8080
    
    [devops@server1 ansible]$ md5sum files/httpd.conf 
    04e9239e7bd5d5b9b85864226d60eee5  files/httpd.conf
    
    [devops@server1 ansible]$ ansible-playbook playbook.yml
    

    在这里插入图片描述
    在这里插入图片描述
    添加自动部署防火墙的功能
    添加防火墙

    [devops@server1 ansible]$ vim playbook.yml
    添加
        - name: start firewalld				##开启火墙
          service:
            name: firewalld
            state: started
            enabled: true
    
        - name: configure firewalld			##允许http服务可以通过火墙
          firewalld:
            service: http
            state: enabled
            permanent: yes
            immediate: yes
    
      handlers:
        - name: restart httpd
          service:
            name: httpd
            state: restarted
    [devops@server1 ansible]$ ansible-playbook playbook.yml --syntax-check
    [devops@server1 ansible]$ ansible-playbook playbook.yml
    [devops@server1 ansible]$ curl server2
    www.westos.org
    [devops@server1 ansible]$ curl server3
    www.westos.org
    

    在这里插入图片描述
    使用变量名

    [devops@server1 ansible]$ vim playbook.yml 
    - name: create index.html
      copy:
        content: "{{ ansible_facts['hostname'] }}\n"或者ansible_facts.hostname
        dest: /var/www/html/index.html
    [devops@server1 ansible]$ ansible-playbook playbook.yml
    [devops@server1 ansible]$ curl server2
    server2
    [devops@server1 ansible]$ curl server3
    server3
    

    添加更多变量

    [devops@server1 ansible]$ ansible webservers -m setup | less		##查看信息
    "ansible_default_ipv4": {
                "address": "172.25.26.2", 
                "alias": "eth0", 
                "broadcast": "172.25.26.255", 
                "gateway": "172.25.26.250", 
                "interface": "eth0", 
                "macaddress": "52:54:00:22:c0:c9", 
                "mtu": 1500, 
                "netmask": "255.255.255.0", 
                "network": "172.25.20.0", 
                "type": "ether"
    
    
    [devops@server1 ansible]$ vim playbook.yml
    - name: create index.html
          copy:
            content: "{{ ansible_facts['hostname'] }} {{ ansible_facts['default_ipv4']['address'] }}\n"
            dest: /var/www/html/index.html
    [devops@server1 ansible]$ ansible-playbook playbook.yml
    [devops@server1 ansible]$ curl server2
    server2 172.25.26.2
    [devops@server1 ansible]$ curl server3
    server3 172.25.26.3
    

    在这里插入图片描述
    在这里插入图片描述
    添加标记
    执行指定标记的任务

    [devops@server1 ansible]$ vim playbook.yml
    - name: create index.html
      copy:
        content: "{{ ansible_facts['hostname'] }} {{ ansible_facts['default_ipv4']['address'] }}\n"
        dest: /var/www/html/index.html
      tags: one
    
    [devops@server1 ansible]$ ansible-playbook playbook.yml -t one
    

    在这里插入图片描述
    模板j2

    [devops@server1 ansible]$ cd files/
    [devops@server1 files]$ mv httpd.conf httpd.conf.j2
    [devops@server1 ansible]$ vim playbook.yml
    
    - hosts: webservers
      vars:
        http_port: 80			##指定端口
    
    
        - name: configure httpd
          template:
            src: files/httpd.conf.j2
            dest: /etc/httpd/conf/httpd.conf
            owner: root
            group: root
            mode: 644
          notify: restart httpd
    
    [devops@server1 ansible]$ vim files/httpd.conf.j2
    Listen {{ http_port }}			##读取指定端口
    [devops@server1 ansible]$ ansible-playbook playbook.yml##查看是否成功
    

    在这里插入图片描述
    模板

    [devops@server1 ansible]$ mkdir templates
    [devops@server1 ansible]$ vim playbook.yml
    - name: configure httpd
          template:
            src: templates/httpd.conf.j2
            dest: /etc/httpd/conf/httpd.conf
            owner: root
            group: root
            mode: 644
          notify: restart httpd
    [devops@server1 ansible]$ cp files/httpd.conf.j2 templates/
    [devops@server1 ansible]$ ansible-playbook playbook.yml 
    

    自动获取指定信息

    [devops@server1 ansible]$ vim hostinfo.yml
    ---
    - hosts: all
      tasks:
        - name: create infofile
          template:
            src: templates/info.j2
            dest: /mnt/hostinfo
    [devops@server1 ansible]$ cd templates/
    [devops@server1 templates]$ vim info.j2
    主机名: {{ ansible_facts['hostname'] }}
    主机IP地址: {{ ansible_facts['default_ipv4']['address'] }}
    根分区大小: {{ ansible_facts['devices']['dm-0']['size'] }}
    系统内核: {{ ansible_facts['distribution_version'] }}
    DNS: {{ ansible_facts['dns']['nameservers'] }}
    [devops@server1 ansible]$ ansible-playbook hostinfo.yml --syntax-check
    
    playbook: hostinfo.yml
    [devops@server1 ansible]$ ansible-playbook hostinfo.yml
    [devops@server1 ansible]$ ansible all -a 'ls -l /mnt/hostinfo'
    server2 | CHANGED | rc=0 >>
    -rw-r--r-- 1 root root 117 Jun 12 00:00 /mnt/hostinfo
    
    server3 | CHANGED | rc=0 >>
    -rw-r--r-- 1 root root 117 Jun 12 00:00 /mnt/hostinfo
    
    [devops@server1 ansible]$ ansible server2 -a 'cat /mnt/hostinfo'
    server2 | CHANGED | rc=0 >>
    主机名: server2
    主机IP地址: 172.25.26.2
    根分区大小: 17.00 GB
    系统内核: 7.3
    DNS: [u'114.114.114.114']
    

    在这里插入图片描述

    指定主机安装指定软件

    [devops@server1 ansible]$ vim install.yml
    ---
    - hosts: all
      tasks:
        - name: install pkgs
          yum:
            name: "{{ item }}"
            state: present
          when: ansible_facts['hostname'] == 'server2'
          loop:
            - httpd
            - mariadb
            - php
            - php-mysql
    
        - name: install mariadb
          yum:
            name: mariadb
            state: present
          when: ansible_facts['hostname'] == 'server3'
    [devops@server1 ansible]$ ansible-playbook install.yml --syntax-check
    
    playbook: install.yml
    [devops@server1 ansible]$ ansible-playbook install.yml
    
    PLAY [all] *********************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************
    ok: [server3]
    ok: [server2]
    
    TASK [install pkgs] ************************************************************************************************************************
    skipping: [server3] => (item=httpd) 
    skipping: [server3] => (item=mariadb) 
    skipping: [server3] => (item=php) 
    skipping: [server3] => (item=php-mysql) 
    ok: [server2] => (item=httpd)
    ok: [server2] => (item=mariadb)
    ok: [server2] => (item=php)
    ok: [server2] => (item=php-mysql)
    
    TASK [install mariadb] *********************************************************************************************************************
    skipping: [server2]
    ok: [server3]
    
    PLAY RECAP *********************************************************************************************************************************
    server2                    : ok=2    changed=0    unreachable=0    failed=0   
    server3                    : ok=2    changed=0    unreachable=0    failed=0
    

    自动生成主机解析

    [devops@server1 ansible]$ vim hostinfo.yml
    ---
    - hosts: all
      tasks:
        - name: create infofile
          template:
            src: templates/info.j2
            dest: /mnt/hostinfo
    
        - name: create hosts
          template:
            src: templates/hosts.j2
            dest: /etc/hosts
            owner: root
            group: root
            mode: 0644
    [devops@server1 ansible]$ vim templates/hosts.j2
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    {% for host in groups['webservers'] %}
         {{ hostvars[host]['ansible_facts']['eth0']['ipv4']['address'] }}{{ hostvars[host]['ansible_facts']['hostname'] }}
    {% endfor %}
    
    [devops@server1 ansible]$ vim inventory 
    [devops@server1 ansible]$ cat inventory 
    [test]
    server2
    server1
    
    [db]
    server3
    
    [webservers:children]
    test
    db
    
    [root@server1 ansible]# vim /etc/sudoers
    devops  ALL=(ALL)       NOPASSWD: ALL
    
    
    [devops@server1 ansible]$ ansible-playbook hostinfo.yml 
    
    PLAY [all] *******************************************************************************************************************************************
    
    TASK [Gathering Facts] *******************************************************************************************************************************
    ok: [server2]
    ok: [server3]
    ok: [server1]
    
    TASK [create infofile] *******************************************************************************************************************************
    ok: [server2]
    ok: [server3]
    ok: [server1]
    
    TASK [create hosts] **********************************************************************************************************************************
    changed: [server2]
    changed: [server3]
    changed: [server1]
    
    PLAY RECAP *******************************************************************************************************************************************
    server1                    : ok=3    changed=1    unreachable=0    failed=0   
    server2                    : ok=3    changed=1    unreachable=0    failed=0   
    server3                    : ok=3    changed=1    unreachable=0    failed=0 
    
    
    [root@server2 ~]# cat /etc/hosts		##查看效果
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
         172.25.26.3server3
         172.25.26.2server2
         172.25.26.1server1
    

    还原环境

    [devops@server1 ansible]$ cat inventory 
    [test]
    server2
    
    [db]
    server3
    
    [webservers:children]
    test
    db
    

    添加用户,防止用户密码明文

    [devops@server1 ansible]$ mkdir vars
    [devops@server1 ansible]$ cd vars/
    [devops@server1 vars]$ vim userlist.yml
    ---
      userlist:
        - user1: user1
          pass: westos
        - user2: user2
          pass: redhat
    [devops@server1 vars]$ ansible-vault encrypt userlist.yml ##文件加密
    [devops@server1 vars]$ cat userlist.yml 
    $ANSIBLE_VAULT;1.1;AES256
    39666162623534363036633264613930303834623433646439646364393765396333376333636461
    6564666462656264623061623435356432386239626235620a633137646363353464326165346232
    63323161656334626563643135346631636339663531373433623239333338313666356363636566
    6333366662333464340a633961643138336531656661623962376638363938383136643832643365
    35323932656130643934656364363933623736663034623539376563613866333336383537326434
    64376463303031663531626530663863373936616138633863663734623231613839383932626562
    30313531333663353962663962343237616264373739626232363061373236326435353566616162
    33333063633530303630656632333134346536333865353436323661646433613036373562383065
    3532
    [devops@server1 vars]$ ansible-vault view userlist.yml 	##输入密码查看文件
    Vault password: 
    ---
    userlist:
      - user: user1
        pass: westos
      - user: user2
        pass: redhat
    

    在这里插入图片描述

    [devops@server1 ansible]$ vim adduser.yml 
    ---
    - hosts: all
      vars_files:
        - vars/userlist.yml
      tasks:
        - name: create users
          user:
            name: "{{ item.user }}"
            state: present
            password: "{{ item.pass }}"
          loop: "{{ userlist }}"
    [devops@server1 ansible]$ ansible-playbook adduser.yml --ask-vault-pass
    [devops@server1 ansible]$ ansible test -a 'cat /etc/shadow'	##查看是否生效
    

    在这里插入图片描述

    这时我们发现这里的密码时明文未加密
    

    在这里插入图片描述
    为了让密码加密存储,我们修改一下playbook的文件

    [devops@server1 ansible]$ vim adduser.yml 
    ---
    - hosts: all
      vars_files:
        - vars/userlist.yml
      tasks:
        - name: create users
          user:
            name: "{{ item.user }}"
            state: present
            password: "{{ item.pass | password_hash('sha512','mysecretsalt')}}"	##加密存储
          loop: "{{ userlist }}"
    

    执行之后,发现user1和user2的密码以sha512加密保存

    在这里插入图片描述
    解密

    [devops@server1 vars]$  ansible-vault decrypt userlist.yml ##解密文件
    Vault password: 
    Decryption successful
    [devops@server1 vars]$ cat userlist.yml		##查看效果
    ---
    userlist:
      - user: user1
        pass: westos
      - user: user2
        pass: redhat
    
    展开全文
  • 1-1 自动化运维开发实战课程导学2-1 自动化工程总体设计2-2 章节介绍2-3 学习环境硬件准备2-4 Python等基础环境安装2-5 Mysql、Mongo、Redis安装2-6 让工程在ubuntu上run起来2-7 pycharm打开工程2-8 课程学习方法和...

    1-1 自动化运维开发实战课程导学

    2-1 自动化工程总体设计

    2-2 章节介绍

    2-3 学习环境硬件准备

    2-4 Python等基础环境安装

    2-5 Mysql、Mongo、Redis安装

    2-6 让工程在ubuntu上run起来

    2-7 pycharm打开工程

    2-8 课程学习方法和建议

    3-1 DevOPS工程快速入门引导

    3-2 Ipython的基本操作

    3-3 python基础知识

    3-4 python的迭代器

    3-5 python匿名函数+正则表达式

    3-6 Python 模块的导入、装饰器 面向对象编程

    3-7 Django工程快速入门引导

    3-8 第一个DevOPS工程及Django的settings文件配置

    3-9 对象模型models

    3-10 建立工程模型

    3-11 模型迁移

    3-12 工程功能设计

    3-13 信息采集接口功能实现

    3-14 信息提供接口功能实现

    3-15 Django日志输出logging模块

    3-16 Django学习与邮件发送

    3-17 邮件发送功能代码实现 mp4

    3-18 IMOOCC工程中对于django框架的应用

    3-19 IMOOCC工程对于django的框架设计改动

    3-20 IMOOCC工程用到的表models定义和字段设计

    3-21 IMOOCC工程用到的外键关联

    3-22 工程初识和环境搭建--从githup上下载代码和安装模块

    展开全文
  • 轻松玩转ANSIBLE实现企业级自动运维-MarkDown.pdf
  • 「点击图片获取最近两年爆款好文」一、Ansible 概述Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少...


     点击图片获取最近两年爆款好文 

    一、Ansible 概述

    Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。

    Ansible 通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作非常简单,即使小白也可以轻松上手,但它提供的功能又非常丰富,在运维领域,几乎可以做任何事。

    1、Ansible 特点

    Ansible 自 2012 年发布以来,很快在全球流行,其特点如下:

    • Ansible 基于 Python 开发,运维工程师对其二次开发相对比较容易;

    • Ansible 丰富的内置模块,几乎可以满足一切要求;

    • 管理模式非常简单,一条命令可以影响上千台主机;

    • 无客户端模式,底层通过 SSH 通信;

    • Ansible发布后,也陆续被 AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter 等大公司接纳并投入使用;

    二、Ansible的角色

    • 使用者:如何使用 Ansible 实现自动化运维?

    • Ansible 工具集:Ansible 可以实现的功能?

    • 作用对象:Ansible 可以影响哪些主机?

    1、使用者

    如下图所示:Ansible 使用者可以采用多种方式和 Ansible 交互,图中展示了四种方式:

    • CMDB:CMDB 存储和管理者企业IT架构中的各项配置信息,是构建 ITIL 项目的核心工具,运维人员可以组合 CMDB 和 Ansible,通过 CMDB 直接下发指令调用Ansible 工具集完成操作者所希望达到的目标;

    • PUBLIC/PRIVATE 方式:Ansible 除了丰富的内置模块外,同时还提供丰富的 API语言接口,如PHP、Python、PERL 等多种流行语言,基于 PUBLIC/PRIVATE,Ansible 以 API 调用的方式运行;

    • Ad-Hoc 命令集:Users直接通过Ad-Hoc命令集调用Ansible工具集来完成任务;

    • Playbooks:Users 预先编写好 Ansible Playbooks,通过执行

    • Playbooks 中预先编排好的任务集,按序执行任务;

    2、Ansible 工具集

    Ansible 工具集包含 Inventory、Modules、Plugins 和 API。

    其中:Inventory:用来管理设备列表,可以通过分组实现,对组的调用直接影响组内的所有主机;Modules:是各种执行模块,几乎所有的管理任务都是通过模块执行的;Plugins:提供了各种附加功能;API:为编程人员提供一个接口,可以基于此做 Ansible的二次开发;具体表现如下:

    • Ansible Playbooks:任务脚本,编排定义Ansible任务及的配置文件,由Ansible按序依次执行,通常是JSON格式的YML文件;

    • Inventory:Ansible 管理主机清单;

    • Modules:Ansible 执行命令功能模块,多数为内置的核心模块,也可自定义;

    • Plugins:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不太常用;

    • API:供第三方程序调用的应用程序编程接口;

    • Ansible:该部分图中表现得不太明显,组合 Inventory、API、Modules、Plugins可以理解为是 Ansible 命令工具,其为核心执行工具;

    3、作用对象

    Ansible 的作用对象不仅仅是 Linux 和非 Linux 操作系统的主机,也可以作用于各类PUBLIC/PRIVATE、商业和非商业设备的网络设施。

    使用者使用 Ansible 或 Ansible-Playbooks 时,在服务器终端输入 Ansible 的 Ad-Hoc命令集或 Playbooks 后,Ansible 会遵循预选安排的规则将 Playbooks 逐步拆解为Play,再将 Play 组织成 Ansible 可以识别的任务,随后调用任务涉及的所有模块和插件,根据 Inventory 中定义的主机列表通过 SSH 将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果是临时文件则执行完毕后自动删除。

    三、Ansible的配置

    1、Ansible安装

    Ansible的安装部署非常简单,以RPM安装为例,其依赖软件只有Python和SSH,且系统默认均已安装。Ansible的管理端只能是Linux,如Redhat、Debian、Centos。

    1)通过YUM安装Ansible

    可以自行从互联网上直接下载Ansible所需软件包,本篇博客提供安装Ansible自动化运维工具所需的依赖软件包

    [root@centos01 ~]# cd /mnt/ansiblerepo/ansiblerepo/repodata/
    [root@centos01 ansiblerepo]# vim /etc/yum.repos.d/local.repo
    [local]
    name=centos
    baseurl=file:///mnt/ansiblerepo/ansiblerepo  <!--修改yum路径-->
    enabled=1
    gpgcheck=0
    [root@centos01 ~]# yum -y install ansible
                    <!--安装Ansible自动化运维工具-->

    2)验证安装结果

    [root@centos01 ~]# ansible --version
        <!--如果命令可以正常执行,则表示Ansible工具安装成功-->
    ansible 2.3.1.0
      config file = /etc/ansible/ansible.cfg
      configured module search path = Default w/o overrides
      python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

    3)创建 SSH 免交互登录

    Ansible 通过 SSH 对设备进行管理,而 SSH 包含两种认证方式:一种是通过密码认证,另一种是通过密钥对验证。前者必须和系统交互,而后者是免交互登录。如果希望通过 Ansible 自动管理设备,应该配置为免交互登录被管理设备。

    [root@centos01 ~]# ssh-keygen -t rsa  <!--生成密钥对-->
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):<!--密钥对存放路径-->
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase):
           <!--输入私钥保护密码,直接按Enter键表示无密码-->
    Enter same passphrase again:    <!--再次输入-->
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:cJz6NRTrvMDxX+Jpce6LRnWI3vVEl/zvARL7D10q9WY root@centos01
    The key's randomart image is:
    +---[RSA 2048]----+
    |          .   . .|
    |       . . +   oo|
    |      . = o o. oo|
    |       = * o..+ *|
    |      . S *.=+=*+|
    |       . o =+XooE|
    |        . ..=.++.|
    |           ..o ..|
    |           .. o. |
    +----[SHA256]-----+
    [root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.20   <!--复制公钥到远端192.168.100.20-->
    [root@centos01 ~]# ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.100.30    <!--复制公钥到远端192.168.100.30-->

    至此,已经完成 Ansible 的部署,接下来就可以通过 Ansible 对设备进行管理了。

    2、Ansible 配置

    Inventory 是 Ansible 管理主机信息的配置文件,相当于系统 Hosts 文件的功能,默认存放在 /etc/ansible/hosts。

    在 hosts 文件中,通过分组来组织设备,Ansible 通过 Inventory 来定义主机和分组,通过在 ansible 命令中使用选项-i—inventory-file来指定 Inventory。

    [root@centos01 ~]# ansible -i /etc/ansible/hosts web -m ping

    如果使用默认的 Inventory文件(/etc/ansible/hosts),也可以不指定 Inventory 文件,例如:

    [root@centos01 ~]# ansible web -m ping

    Ansible 通过设备列表以分组的方式添加到 /etc/ansible/hosts 文件来实现对设备的管理,所以在正式管理之前,首先要编写好 hosts 文件。hosts 文件中,以[ ]包含的部分代表组名,设备列表支持主机名和IP地址。

    默认情况下,通过访问22端口(SSH)来管理设备。若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口标明,以行为单位分隔配置。另外,hosts文件还支持通配符。

    [root@centos01 ~]# vim /etc/ansible/hosts
    ............   <!--此处省略部分内容-->
    [web]
    192.168.100.20
    192.168.100.30
    [test]
    www.benet.com:222                         <!--通过222端口管理设备-->
    [mail]
    yj1.kgc.cn
    yj[2:5].kgc.cn
    <!--[2:5]表示2~5之间的所有数字,即表示yj2.kgc.cn、yj3.kgc.cn……的所有主机-->

    可以将一个主机同时归置在不同的组中。

    配置完成之后,可以针对hosts定义的组进行远程操作,也可以针对组中的某一个或多个主机操作。例如:

    1)只对web组中192.168.1.2主机操作,通过—limit参数限定主机的变更。

    [root@centos01 ~]# ansible web -m command -a "systemctl status httpd" --limit "192.168.100.20"
    192.168.100.20 | SUCCESS | rc=0 >>
    <!--看到SUCCESS就知道成功了,所以以下内容-->
    <!--如果测试httpd服务,被测试主机必然已经安装并启动了httpd服务-->

    2)只对192.168.100.20主机操作。通过IP限定主机的变更。

    [root@centos01 ~]# ansible 192.168.100.20 -m command -a "systemctl status httpd"
    192.168.100.20 | SUCCESS | rc=0 >>

    3)只对192.168.100.0网段主机操作,这就需要使用到通配符来限定主机的变更了。

    [root@centos01 ~]# ansible 192.168.1.* -m command -a "systemctl status httpd"
    192.168.100.20 | SUCCESS | rc=0 >>
    .......  <!--此处省略部分内容-->
    192.168.100.30 | SUCCESS | rc=0 >>
    .......    <!--此处省略部分内容-->
    <!--实验环境,效果一样,这里就不多说了-->

    3、Ansible 命令

    Ansible 的维护命令大多数是以 ansible 开头,在终端输入 ansible 后连续按两次Tab键,会补全所有跟 ansible 相关的命令。

    [root@centos01 ~]# ansible  <!--连续按Tab键-->
    ansible               ansible-console-2     ansible-galaxy        ansible-playbook-2.7  ansible-vault-2
    ansible-2             ansible-console-2.7   ansible-galaxy-2      ansible-pull          ansible-vault-2.7
    ansible-2.7           ansible-doc           ansible-galaxy-2.7    ansible-pull-2
    ansible-connection    ansible-doc-2         ansible-playbook      ansible-pull-2.7
    ansible-console       ansible-doc-2.7       ansible-playbook-2    ansible-vault

    1)ansible

    ansible 是生产环境中使用非常频繁的命令之一,主要在以下场景使用:

    非固化需求;

    临时一次性操作;

    二次开发接口调用;

    非固化需求是指临时性的维护,如查看web服务器组磁盘使用情况、复制一个文件到其他机器等。类似这些没有规律的、临时需要做的任务,我们成为非固化需求,临时一次性操作,语法如下:

    Ansible  <host-pattern> [options]
    • -v(—verbose):输出详细的执行过程信息,可以得到执行过程所有信息;

    • -i PATH(—inventory=PATH):指定inventory信息,默认为/etc/ansible/hosts;

    • -f NUM(—forks=NUM):并发线程数,默认为5个线程;

    • —private-key=PRIVATE_KEY_FILE:指定密钥文件;

    • -m NAME,—module-name=NAME:指定执行使用的模块;

    • -M DIRECTORY(—module-path=DIRECTORY) :指定模块存放路径,默认为/usr/share/ansible;

    • -a ARGUMENTS(—args=ARGUMENTS):指定模块参数;

    • -u USERNAME(—user=USERNAME):指定远程主机以USERNAME运行命令;

    • -l subset(—limit=SUBSET):限制运行主机;

    ①检查所有主机是否存活,执行命令如下:

    [root@centos01 ~]# ansible all -f 5 -m ping
    <!--调用ping模块,all表示/etc/ansible/hosts文件中的所有主机,不用创建all分组(默认存在)-->
    192.168.100.20 | SUCCESS => {               <!--表示执行成功-->
        "changed": false,                        <!--没有对主机做出更改-->
        "ping": "pong"                  <!--表示执行ping命令的返回结果-->
    }
    192.168.100.30 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }

    ②列出web组所有的主机列表,执行命令如下:

    [root@centos01 ~]# ansible web --list      <!-- --list:表示列出主机列表信息-->
      hosts (2):
        192.168.100.20
        192.168.100.30

    ③批量显示web组中的磁盘使用空间,执行命令如下:

    [root@centos01 ~]# ansible web -m command -a "df -hT"
    192.168.100.30 | SUCCESS | rc=0 >>
    文件系统            类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/cl-root xfs        17G  4.4G   13G   26% /
    devtmpfs            devtmpfs  897M     0  897M    0% /dev
    tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
    tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
    /dev/sda1           xfs      1014M  173M  842M   18% /boot
    tmpfs               tmpfs     183M   16K  183M    1% /run/user/42
    tmpfs               tmpfs     183M     0  183M    0% /run/user/0
    
    192.168.100.20 | SUCCESS | rc=0 >>
    文件系统            类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/cl-root xfs        17G  4.3G   13G   26% /
    devtmpfs            devtmpfs  897M     0  897M    0% /dev
    tmpfs               tmpfs     912M   84K  912M    1% /dev/shm
    tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
    /dev/sda1           xfs      1014M  173M  842M   18% /boot
    tmpfs               tmpfs     183M   16K  183M    1% /run/user/42
    tmpfs               tmpfs     183M     0  183M    0% /run/user/0
    /dev/sr0            iso9660   4.1G  4.1G     0  100% /mnt

    web关键字需要提前在/etc/ansible/hosts文件中定义组。

    Ansible的返回结果非常友好,一般会用三种颜色来表示执行结果

    • 红色:表示执行过程出现异常;

    • 橘黄颜色:表示命令执行后目标有状态变化;

    • 绿色:表示执行成功且没有目标机器做修改;

    2)Ansible-doc

    Ansible-doc用来查询ansible模块文档的说明,类似于man命令,针对每个模块都有详细的用法说明及应用案例介绍,语法如下:

    ansible-doc [options] [module……]

    列出支持的模块:

    [root@centos01 ~]#ansible-doc -l

    查询ping模块的说明信息:

    [root@centos01 ~]# ansible-doc ping
    > PING    (/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py)
    
      A trivial test module, this module always returns `pong' on successful contact. It
      does not make sense in playbooks, but it is useful from `/usr/bin/ansible' to verify
      the ability to login and that a usable python is configured. This is NOT ICMP ping,
      this is just a trivial test module.
    
    EXAMPLES:
    # Test we can logon to 'webservers' and execute python with json lib.
    ansible webservers -m ping
    
    MAINTAINERS: Ansible Core Team, Michael DeHaan
    
    METADATA:
            Status: ['stableinterface']
            Supported_by: core

    3)Ansible-playbook

    Ansible-playbook是日常应用中使用频率最高的命令,类似于Linux中的sh或source命令,用来执行系列任务。

    其工作机制:通过读取预先编写好的playbook文件实现集中处理任务。Ansible-playbook命令后跟yml格式的playbook文件,playbook文件存放了要执行的任务代码,命令使用方式如下:

    Ansible-playbook playbook.yml
    <!--playbook.yml文件要提前编写好,建议使用绝对路径-->

    4)Ansible-console

    Ansible-console是Ansible为用户提供的一款交互式工具,类似于Windows的cmd或者是Linux中shell。用户可以在ansible-console虚拟出来的终端上像shell一样使用Ansible内置的各种命令,这为习惯于使用shell交互式方式的用户提供了良好的使用体验。在终端输入ansible-console命令后,显示如下:

    [root@centos01 ~]# ansible-console
    Welcome to the ansible console.
    Type help or ? to list commands.
          <!--输入help或?获取帮助-->
    root@all (2)[f:5]$ cd web    <!--使用cd命令切换主机或分组-->
    root@web (2)[f:5]$ list                  <!--列出当前的设备-->
    192.168.100.20
    192.168.100.30
    <!--支持Tab键补全,快捷键Ctrl+D或Ctrl+C即可退出当前的虚拟终端-->

    4、Ansible模块

    1)command模块

    command模块在远程主机执行命令,不支持管道、重定向等shell的特性。常用的参数如下:

    • chdir:在远程主机上运行命令前要提前进入的目录;

    • creates:在命令运行时创建一个文件,如果文件已存在,则不会执行创建任务;

    • removes:在命令运行时移除一个文件,如果文件不存在,则不会执行移除任务;

    • executeable:指明运行命令的shell程序;

    在所有主机上运行“ls ./”命令,运行前切换到/home目录下。操作如下:

    [root@centos01 ~]# ansible web -m command -a "chdir=/ ls ./"

    2)shell模块

    shell模块在远程主机执行命令,相当于调用远程主机的Shell进程,然后在该Shell下打开一个子Shell运行命令。和command模块的区别是它支持Shell特性:如管道、重定向等。

    示例如下:

    [root@centos01 ~]# ansible web -m shell -a "echo hello world "        <!--输出到屏幕-->
    192.168.100.20 | SUCCESS | rc=0 >>
    hello world
    
    192.168.100.30 | SUCCESS | rc=0 >>
    hello world
    [root@centos01 ~]# ansible web -m shell -a "echo hello world > /1.txt"   <!--输出到1.txt文件中-->
    192.168.100.20 | SUCCESS | rc=0 >>
    
    192.168.100.30 | SUCCESS | rc=0 >>

    3)copy模块

    copy模块用于复制指定主机文件到远程主机的指定位置。常见的参数如下:

    • dest:指出复制文件的目标目录位置,使用绝对路径。如果源是目录,则目标也要是目录,如果目标文件已存在,会覆盖原有内容;

    • src:指出源文件的路径,可以使用相对路径和绝对路径,支持直接指定目录。如果源是目录,则目标也要是目录;

    • mode:指出复制时,目标文件的权限,可选;

    • owner:指出复制时,目标文件的属主,可选;

    • group:指出复制时目标文件的属组,可选;

    • content:指出复制到目标主机上的内容,不能和src一起使用,相当于复制content指明的数据到目标文件中;

    示例如下:

    [root@centos01 ~]# ansible web -m copy -a "src=/etc/hosts
    dest=/root/a1.hosts mode=777 owner=root group=root"
    <!--/将本机的hosts文件复制到web组中的所有主机上存放在家目录下的a1.hosts目录,
    权限是777,属主是root,属组是root-->

    4)hostname模块

    hostname模块用于管理远程主机上的主机名。常用的参数如下:

    name:

    指明主机名;

    示例如下:

    [root@centos01 ~]# ansible 192.168.100.20 -m hostname -a "name=test"
    <!--将192.168.100.20的主机名改为test,
    但是192.168.100.20需要敲一下bash才生效-->

    5)yum模块

    yum模块基于yum机制,对远程主机管理程序包。常用的参数如下:

    • name:程序包名称,可以带上版本号。若不指明版本,则默认为最新版本;

    • state=present|atest|absent:指明对程序包执行的操作:present表明安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包;

    • disablerepo:在用yum安装时,临时禁用某个仓库的ID;

    • enablerepo:在用yum安装时,临时启用某个仓库的ID;

    • conf_file:yum运行时的配置文件,而不是使用默认的配置文件;

    • disable_gpg_check=yes|no:是否启用完整性校验功能;

    示例如下:

    [root@centos01 ~]# ansible web -m shell -a "/usr/bin/rm -rf
    /etc/yum.repos.d/CentOS-*"
              <!--批量化删除web组主机的yum源-->
    [root@centos01 ~]# ansible web -m shell -a "/usr/bin/mount
    /dev/cdrom /mnt"   <!--批量化挂载光盘-->
     [WARNING]: Consider using mount module rather than running mount
    
    192.168.100.20 | SUCCESS | rc=0 >>
    mount: /dev/sr0 写保护,将以只读方式挂载
    
    192.168.100.30 | SUCCESS | rc=0 >>
    mount: /dev/sr0 写保护,将以只读方式挂载
    [root@centos01 ~]# ansible web -m yum -a "name=httpd
    state=present"  <!--批量化安装httpd程序-->
    [root@centos01 ~]# ansible web -m shell -a "rpm -qa | grep httpd"
        <!--批量化查看安装的httpd程序包-->
     [WARNING]: Consider using yum, dnf or zypper module rather than running rpm
    
    192.168.100.20 | SUCCESS | rc=0 >>
    httpd-2.4.6-67.el7.centos.x86_64
    httpd-tools-2.4.6-67.el7.centos.x86_64
    
    192.168.100.30 | SUCCESS | rc=0 >>
    httpd-2.4.6-67.el7.centos.x86_64
    httpd-tools-2.4.6-67.el7.centos.x86_64
    [root@centos01 ~]# ansible web -m shell -a "systemctl start httpd"       <!--批量启动服务-->
    [root@centos01 ~]# ansible web -m shell -a "netstat -anptu | grep httpd"     <!--批量化监听httpd服务是否启动成功-->
    192.168.100.20 | SUCCESS | rc=0 >>
    tcp6       0      0 :::80                   :::*                    LISTEN      2072/httpd
    
    192.168.100.30 | SUCCESS | rc=0 >>
    tcp6       0      0 :::80                   :::*                    LISTEN      3098/httpd

    管理端只是发送yum指令到被管理端,被管理端要存在可用的yum仓库才可以成功安装。

    6)service模块

    service模块为用来管理远程主机上的服务的模块。常见的参数如下:

    • name:被管理的服务名称;

    • state=started|stopped|restarted:动作包含启动,关闭或重启;

    • enable=yes|no:表示是否设置该服务开机自启动;

    • runlevel:如果设定了enabled开机自启动,则要定义在哪些运行目标下自动启动;

    示例如下:

    [root@centos01 ~]# ansible web -m service -a "name=httpd
    enabled=yes state=restarted"
    <!--设置httpd服务重新启动和开机自动启动-->

    7)user模块

    user模块主要用于管理远程主机上的用户账号。常见的参数如下:

    name:必选参数,账号名称;

    state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除;

    system=yes|no:是否为系统账户;

    uid:用户UID;

    group:用户的基本组

    groups:用户的附加组;

    shell:默认使用的shell;

    home:用户的家目录;

    mve_home=yes|no:

    如果设置的家目录已经存在,是否将已存在的家目录进行移动;

    pssword:用户的密码,建议使用加密后的字符串;

    comment:

    用户的注释信息;

    remore=yes|no:

    当state=absent时,是否要删除用户的家目录

    创建用户示例如下:

    [root@centos01 ~]# ansible web -m user -a "name=user01
    system=yes uid=502 group=root groups=root shell=/etc/nologin
    home=/home/user01 password=pwd@123"
    <!--在web组的所有主机上新建一个系统用户,UID为502,
    属组是root,名字是user01,密码是pwd@123-->


    四、playbook配置文件

    1、执行配置文件

    playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。上面介绍的ansible命令虽然可以完成各种任务,但是当配置一些复杂任务时,逐条输入就显得效率非常低下。

    更有效的方案是在playbook配置文件中放置所有的任务代码,利用ansible-playbook命令执行该文件,可以实现自动化运维。YAML文件的扩展名通常为.yaml或.yml。

    YAML语法与其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项;“:”用来分隔键和值;整个文件以“—-”开头并以“…”结尾,如下所示:

    [root@centos01 ~]# grep -v ^# /etc/ansible/hosts | grep -v ^$              <!--查看hosts中的分组信息-->
    [web1]
    192.168.100.20
    [web2]
    192.168.100.30
    [root@centos01 ~]# vim /etc/ansible/a.yml
                       <!--创建a.yml文件,写入以下内容-->
    ---
    - hosts: web1                   <!--针对web1组中的操作-->
      remote_user: root                    <!--远端执行用户身份为root-->
      tasks:                <!--任务列表-->
            - name: adduser                               <!--任务名称-->
              user: name=user1 state=present <!--执行user模块,创建用户-->
              tags:                <!--创建tag标签-->
              - aaa                 <!--tag标签为aaa-->
            - name: addgroup           <!--任务名称-->
              group: name=root system=yes <!--执行group模块,创建组-->
              tags:               <!--创建tag标签-->
              - bbb               <!--tag标签为bbb-->
    - hosts: web2               <!--针对web2组中的操作-->
      remote_user: root        <!--远端执行用户身份为root-->
      tasks:                     <!--任务列表-->
            - name: copy file to web            <!--任务名称-->
              copy: src=/etc/passwd dest=/home        <!--执行copy模块,复制文件-->
              tags:                        <!--创建tag标签-->
              - ccc                     <!--tag标签为ccc-->
    ...

    所有的“-”和“:”后面均有空格,而且注意缩进和对齐,如下图所示:

    playbook的核心元素包含:

    hosts:任务的目标主机,多个主机用冒号分隔,一般调用/etc/ansible/hosts中的分组信息;

    remote_user:远程主机上,运行此任务的默认身份为root;

    tasks:任务,即定义的具体任务,由模块定义的操作列表;

    handlers:触发器,类似tasks,只是在特定的条件下才会触发的任务。

    某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers进行触发执行;

    roles:角色,将hosts剥离出去,由tasks、handlers等所组成的一种特定的结构集合;

    playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行。ansible-playbook命令用法如下:

    ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml

    其中,[option]部分的功能包括:

    • —syntax-check:检测yaml文件的语法;

    • -C(—check):预测试,不会改变目标主机的任何设置;

    • —list-hosts:列出yaml文件影响的主机列表;

    • —list-tasks:列出yaml文件的任务列表;

    • —list-tags:列出yaml文件中的标签;

    • -t TAGS(—tags=TAGS):表示只执行指定标签的任务;

    • —skip-tags=SKIP_TAGS:表示除了指定标签的任务,执行其他任务;

    • —start-at-task=START_AT:从指定的任务开始往下运行;

    执行playbook的示例如下:

    [root@centos01 ~]# ansible-playbook --syntax-check /etc/ansible/a.yml    <!--语法检测-->
    
    playbook: /etc/ansible/a.yml     <!--表示没有报错-->
    [root@centos01 ~]# ansible-playbook -C /etc/ansible/a.yml
             <!--对a.yml进行预测试-->
        .................<!--省略部分内容-->
    192.168.100.20       : ok=3    changed=1    unreachable=0    failed=0
    192.168.100.30       : ok=2    changed=1    unreachable=0    failed=0
    <!--返回结果表示没有错误,全部可以执行成功。-->
    [root@centos01 ~]# ansible-playbook --list-hosts /etc/ansible/a.yml
    <!--列出a.yml文件中的主机-->
    [root@centos01 ~]# ansible-playbook --list-tasks /etc/ansible/a.yml
    <!--列出任务-->
    [root@centos01 ~]# ansible-playbook --list-tags /etc/ansible/a.yml           <!--列出标签-->
    [root@centos01 ~]# ansible-playbook /etc/ansible/a.yml                <!--执行任务-->
    [root@centos01 ~]# ssh 192.168.100.20 tail -1 /etc/passwd <!--确认执行结果-->
    user1:x:1001:1001::/home/user1:/bin/bash
    [root@centos01 ~]# ssh 192.168.100.30 ls -ld /home/passwd
    -rw-r--r--. 1 root root 2342 7月  23 16:06 /home/passwd
    <!--一般情况先执行“-C”命令进行预测试,没有问题后再执行.yml文件。-->

    通常情况下先执行 ansible-playbook -C /PATH/TO/PLAYBOOK.yaml 命令进行测试,测试没问题后再执行 ansible-playbook /PATH/TO/PLAYBOOK.yml 命令。

    2、触发器

    需要触发才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他任务,这时就需要定义handlers。例如,当通过ansible的模块对目标主机的配置文件进行修改之后,如果任务执行成功,可以触发一个触发器,在触发器中定义目标主机的服务重启操作,以使配置文件生效。handlers触发器具有以下特点:

    • handlers是Ansible提供的条件机制之一。

    • handlers和task很类似,但是它只在被task通知的时候才会触发执行。

    • handlers只会在所有任务执行完成后执行。

    • 而且即使被通知了很多次,它也只会执行一次。

    • handlers按照定义的顺序依次执行。

    handlers触发器的使用示例如下:

    [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 80                  <!--查询100.20主机监听的端口-->
    tcp6       0      0 :::80         :::*          LISTEN      94858/httpd
    <!--可以看到是监听80端口,现在通过脚本改为8080端口,并使其生效。-->
    [root@centos01 ~]# vim /etc/ansible/httpd.yml
                <!--编辑httpd.yml文件,写入以下内容-->
    
    ---
    - hosts: web1
      remote_user: root
      tasks:
            - name: change port
              command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
              notify:                             <!--配置触发条件-->
                    - restart httpd server    <!--完成该任务后调用名为“restart httpd server”的触发器-->
      handlers:                                      <!--配置触发器-->
            - name: restart httpd server  <!--指定触发器名字,要和上面“notify”指定的触发器名字一样-->
              service: name=httpd state=restarted<!--触发任务为重启httpd服务-->
    ...
    <!--编写完成后,保存退出即可-->
    [root@centos01 ~]# ansible-playbook -C /etc/ansible/httpd.yml          <!--进行预测试-->
    [root@centos01 ~]# ansible-playbook  /etc/ansible/httpd.yml               <!--执行脚本-->
    [root@centos01 ~]# ssh 192.168.100.20 netstat -anpt | grep 8080        <!--远端主机已经运行8080端口-->
    tcp6       0      0 :::8080        :::*         LISTEN      103594/httpd

    3、角色

    将多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。角色一般存放在 /etc/ansible/roles/ 目录,可通过ansible的配置文件来调整默认的角色目录,/etc/ansible/roles/ 目录下有很多子目录,其中每一个子目录对应一个角色,每个角色也有自己的目录结构,如下图所示:

    /etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

    • mariadb:mysql角色;

    • Apache:httpd角色;

    • Nginx:Nginx角色;

    每个角色的定义,以特定的层级目录结构进行组织。以mariadb(mysql角色)为例:

    • files:存放由copy或script等模块调用的文件;

    • templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件模板;

    • tasks:任务存放的目录;

    • handlers:存放相关触发执行的目录;

    • vars:变量存放的目录;

    • meta:用于存放此角色元数据;

    • default:默认变量存放的目录,文件中定义了此角色使用的默认变量;

    上述目录中,tasks、handlers、vars、meta、default至少应该包含一个main.yml文件,该目录下也可以有其他.yml文件,但是需要在main.yml文件中用include指令将其他.yml文件包含进来。

    有了角色后,可以直接在yaml文件(playbook配置文件)中调用角色,示例如下:

    - hosts: web
      remote_user: root
      roles:
      - mysql        <!--调用角色名-->
      - httpd             <!--调用角色名-->

    可以只调用一个角色,也可以调用多个角色,当定义了角色后,用ansible-playbook PALYBOOK文件执行即可。

    此时ansible会到角色集合的目录(/etc/ansible/roles)去找mysql和httpd目录,然后依次运行mysql和httpd目录下的所有代码。

    下面来个安装及配置mariadb数据库的实例

    需求分析:

    • 要求被管理主机上自动安装mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。

    • 被管理主机配置yum仓库,自行配置,若被管理端可以连接互联网,那么直接将yum仓库指向互联网即可。

    转自:51CTO博客-俊伟祺i

    https://blog.51cto.com/14156658/2461907

    最新整理的 2TB 技术干货:包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、ELK Stack、机器学习、BAT面试精讲视频等。只需在「 民工哥技术之路」微信公众号对话框回复关键字:1024 即可获取全部资料。

    ☆ END ☆

    精彩文章推荐:


    开源、强大的Linux服务器集群管理工具,比宝塔好用!

    Istio是个啥?看完此文彻底搞懂

    有工作的偷着乐吧!看我这面试多惨烈...

    折腾 2 年多!我们终于见面了!

    自动补全、回滚!介绍一款可视化 sql 诊断利器

    代码对比工具,我就用这7个!

    点击【阅读原文】发现更多精彩

    点个在看、转发支持一下吧

    展开全文
  • 在之前的教程中 ,我向您展示了如何通过docker 部署Ansible AWX。 同时,我发现了两 个为AWX 构建rpm 包的项目。 因此,在本教程中,我将向您展示如何在CentOS 7 上从RPM 文件安装Ansible AWX。Ansible AWX 是...
  • Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。Ansible 通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个...
  • ansible自动化运维实战

    2018-06-24 22:14:31
    Ansible自动化运维由一线运维人员联手打造,通过大量实例,详细讲解Ansible这个工具的自动化运维方式与技巧;从基础的架构解析、安装配置,到典型应用案例分析,作者分享了自己在工作中的实战经验,对各类开发运维...
  • 自动化综合管理平台〜集成ansibleUI 功能 按照项目来组织布局,更加直观,上手简单 提供简单易懂的主机管理界面 提供用户密钥管理功能 提供yml文件界面管理功能 提供任务部署功能 提供文件传输功能 提供命令执行功能...
  • ansible自动化运维(一)

    千次阅读 2020-04-05 23:54:32
    ansible 是一款开源自动化平台,是一个配置管理工具,自动化运维工具。 2.ansible的优点 **1)跨平台支持 2)人类可读自动化:ansible提供linux、windows、unix和网络设备的无代理支持,适用于物理、虚拟、云和容器...
  • Ansible平台自动化运维实践.docx
  • Ansible自动化运维技术与最佳实践.pdf》2016年5月份出版
  • Ansible - 自动化运维工具

    千次阅读 2016-10-27 17:04:27
    本文描述自动化运维工具 Ansible 的安装及基础使用方法,包含:安装、主机配置、命令行、剧本的基础使用。
  • ansible是新出现的 自动化 运维工具 , 基于Python研发 。 整合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能,下面就看一下如何部署 在命令行,提取Ansible源代码,...
  • Ansible自动化运维

    2017-12-06 15:37:34
    本书将带领读者探索Ansible自动化运维的神奇之旅,为运维工作节省时间,节约成本,并支持云环境应用
  • Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
  • Python+Django+Ansible Playbook自动化运维项目实战.zip
  • Ansible是2013年推出的一款IT自动化和DevOps软件,2015年被RedHat收购,基于Python语言开发,可实现批量操作系统配置、批量部署、批量运行命令等功能。只需要SSh和Python即可使用,无客户端,功能强大,模块丰富。
  • ansible自动化运维手册

    2018-05-03 09:44:49
    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
  • ansible自动化运维实践

    2018-04-23 16:16:52
    ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能
  • Python+Django+Ansible Playbook自动化运维项目实战 一、入门引导 DevOPS DevOps(英文Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和...
  • 云计算(ansible自动化运维

    千次阅读 2021-11-12 10:22:17
    ansible 192.168.2.30 需要联网 192.168.2.40 192.168.2.50 1.yum安装ansible wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo ...
  • Python+Django+Ansible Playbook自动化运维项目实战 一、资产管理,自动化发现、扫描 1、服务端资产探测、扫描发现  1)资产管理的资产:    2)抽象与约定:   2、探测协议和模块 1)探测协议   ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,749
精华内容 7,899
关键字:

ansible网络自动化运维

友情链接: De43skto5p.rar