精华内容
下载资源
问答
  • Ansible入门

    2020-03-17 14:57:40
    Ansible入门、安装、常用命令及常用模块

    Ansible

    一、自动化运维平台

    puppet perl

    saltstack

    ansible

    二、Ansible介绍

    Ansible是一个简单的自动化运维管理工具,基于python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新)

    1.特点

    • 去中心化,同时执行多台

    • 上手简单,学习曲线平滑

    • 安全,无需安装客户端

    • 配置简单,功能强大,扩展性强

    • 支持API及自定义模块,可以通过python轻松扩展

    • 通过Playbooks来定制强大的配置,状态管理

    • 幂等性,一次操作重复多次结果相同

    2.ansible基础架构

    在这里插入图片描述

    Ansible

    ansible 核心程序

    Host Inventory

    记录了每一个由ansible管理的主机信息,包括主机地址,ssh端口,账号密码等等。可以通过file加载,也可以通过CMDB加载

    Playbooks

    YAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,剧本用来定义哪些主机需要调用哪些模块来完成的功能

    Core Modules

    ansible执行任何管理任务都不是由ansible自己完成的,而是由核心模块完成;ansible管理主机前,先调用core inventory中的主机,就可以完成管理主机

    Connect Plugins

    连接插件,Ansible和Host通信使用

    三、环境部署

    1.实验环境

    Ansible管理端:

    hostnamectl set-hostname ansible_center
    

    Ansible

    hostnamectl set-hostname nodel
    

    centos6只用hostname就可以改名了,

    2.安装

    pip安装

    yum install openssl-devel zlib-devel
    

    下载python源码包

    tar xf Pythonxxx cd
    

    配置

    ./configure --prefix=/usr/local/python27 && make && make install
    
    ln -s xx xxx
    

    安装pip

    crul https://bootstrap.pypa.io/get-pip.py-o get-pip.py
    python27 get-pip-py
    ls -s xxx xxx
    
    pip27 install ansible
    

    yum安装

    yum install -y ansible
    

    3.密钥部署

    密钥互信

    这是客户端给服务端的。。。。。。
    在这里插入图片描述

    管理端生成密钥

    ssh-keygen
    

    将密钥分发到2个节点中

    ssh-copy-id root@10.211.55.13
    

    4.配置文件(/etc/ansible)详解

    ansible.cfg 主配置文件

    hosts 主机&主机组定义文件

    roles 角色目录

    5.常用命令

    ansible-doc 模块名 查看指定模块文档

    ansible-doc -s 模块名 只显示模块关键参数

    ansible-doc -l 列出所有模块

    ansible-doc --version 查看ansible版本及配置信息

    例子:

    查看ping模块帮助 ansible-doc ping

    使用ping模块测试主机存活 ansible plservers -m ping

    使用shell模块执行shell命令 ansible plservers -m shell -a “uptime”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m ping
    192.168.217.131 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "ping": "pong"
    }
    [root@ansinble_center ~]#ansible 192.168.217.131 -m pong
    192.168.217.131 | FAILED! => {
        "msg": "The module pong was not found in configured module paths"
    }
    [root@ansinble_center ~]#ansible 192.168.217.131 -m shell -a "uptime"
    192.168.217.131 | CHANGED | rc=0 >>
     21:38:49 up 12 min,  3 users,  load average: 0.02, 0.06, 0.04
    

    ansible 执行单项任务

    ansible-playbook 执行剧本

    四、常用模块

    1.远程命令模块

    模块包括command,scirpt,shell,都可以实现远程shell命令运行

    command为ansible默认模块,可以远程执行命令

    script功能是在远程主机执行主控制存放的shell脚本

    shell功能是执行远程主机的可行性文件

    ansible webservers -m command -a “free -m”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m command -a "free -m"
    192.168.217.131 | CHANGED | rc=0 >>
                 total       used       free     shared    buffers     cached
    Mem:           980        333        647          0         17        164
    -/+ buffers/cache:        151        829
    Swap:         4095          0       4095
    

    ansible webservers -m script -a “/home/test.sh 12 34”

    ansible webservers -m shell -a “/home/test.sh”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m shell -a "/home/test.sh"
    192.168.217.131 | CHANGED | rc=0 >>
    /home/test.sh 的参数为
    [root@ansinble_center ~]#ansible 192.168.217.131 -m shell -a "/home/test.sh 12 34"
    192.168.217.131 | CHANGED | rc=0 >>
    /home/test.sh 的参数为12 34
    

    2.yum,apt模块

    • 功能

    linux 平台软件包管理操作

    state

    present 表示安装

    latest安装最新版

    absent卸载

    • 例子

    ansible webservers -m apt -a “pkg=zsh state=latest”

    ansible webservers -m yum -a “name=zsh state=latest”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m yum -a "name=zsh state=latest"
    192.168.217.131 | CHANGED => {
    

    在这里插入图片描述

    ansible all -m yum -a “name= state=latest”

    [root@ansinble_center ~]#ansible all -m yum -a "name= state=latest"
    192.168.217.131 | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": false, 
        "changes": {
            "installed": [], 
            "updated": []
        }, 
        "msg": "", 
        "rc": 0, 
        "results": [
            ""
        ]
    }
    

    ansible webservers -m yum -a “name=xxx.rpm state=present”

    [root@ansinble_center ~]#ansible all -m yum -a "name=ftp state=present"
    192.168.217.131 | CHANGED => {
    

    在这里插入图片描述

    ansible webservers -m yum -a “name=’@Development Tools’ state=present”

    [root@ansinble_center ~]#ansible all -m yum -a "name='@Development Tools' state=present"
    192.168.217.131 | CHANGED => {
    

    3.service模块

    • 功能

    远程主机系统服务管理

    state

    started 启动服务

    stopped 停止服务

    restarted 重启服务

    • 例子

    ansible webservers -m services -a “name=httpd state=stopped”

    ansible webservers -m services -a “name=httpd state=restarted”

    ansible webservers -m services -a “name=httpd state=reloaded”

    4.iptables防火墙模块

    管理linux系统防火墙

    ansible webservers -m iptables -a “action=append chain=INPUT protocol=tcp destination_port=80 jump=ACCEPT state=present”

    5.lineinfile文件编辑模块

    替换文件内容,可以基于正则

    ansible all -m lineinfile -a “dest=/etc/selinux/config regexp=’^SELINUX’ line=‘SELINUX=disabled’”

    6.setup系统参数

    功能

    显示操作系统相关信息

    7.user模块

    • 功能

    远程主机系统用户管理

    • 例子

    添加用户

    echo 123 | openssl passwd -1 -stdin

    1 1 1mZKDgdHW$pW44oofvfz7gu78NN8B7J/

    ansible webservers -m user -a “name=alice password= 1 1 1mZKDgdHW$pW44oofvfz7gu78NN8B7J/”

    删除用户

    ansible webservers -m user -a “name=bob state=absent remove=yes”

    8.file模块

    • 功能

    文件管理

    • 例子

    创建目录

    ansible webservers -m file -a “path=/tmp/test state=directory”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m file -a "path=/tmp/test state=directory"
    192.168.217.131 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "gid": 0, 
        "group": "root", 
        "mode": "0755", 
        "owner": "root", 
        "path": "/tmp/test", 
        "size": 4096, 
        "state": "directory", 
        "uid": 0
    }
    

    创建文件

    ansible webservers -m file -a “path=/tmp/test state=touch”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m file -a "path=/tmp/test state=touch"
    192.168.217.131 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "dest": "/tmp/test", 
        "gid": 0, 
        "group": "root", 
        "mode": "0755", 
        "owner": "root", 
        "size": 4096, 
        "state": "file",
        "uid": 0
    }
    

    创建链接文件

    ansible webservers -m file -a “path=/tmp/test src=/etc/fstab state=link”

    创建链接文件

    ansible webservers -m file -a “path=/tmp/test state=absent”

    [root@ansinble_center ~]#ansible 192.168.217.131 -m file -a "path=/tmp/test state=absent"
    192.168.217.131 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        }, 
        "changed": true, 
        "path": "/tmp/test", 
        "state": "absent"
    }
    

    9.copy模块

    • 功能

    实现主控端向目标主机拷贝文件,类似scp的功能

    • 例子

    ansible webservers -m copy -a “src=/home/test.sh dest=/tmp/ owner=root group=root mode=0755”

    遇到一些问题

    要先在客户端安装

    [root@localhost tmp]# yum install -y libselinux-python
    

    然后执行

    [root@ansinble_center ~]#ansible 192.168.217.131 -m copy -a "src=/home/alice dest=/tmp/ owner=root group=root mode=0755"
    192.168.217.131 | CHANGED => {
        "changed": true, 
        "dest": "/tmp/", 
        "src": "/home/alice"
    }
    

    10.远程增量同步synchronzie

    • 功能

    增量备份

    • 例子

    ansible webservers -m syschronize -a “src= dest=”

    ansible webservers -m syschronize -a “compress=yes src= dest=”

    11.stat模块

    • 功能

    获得远程文件状态信息,包括atime,ctime,mtime,md5,uid,gid等信息

    • 例子

    ansible webservers -m stat -a “path=/etc/sysctl.conf”

    12.get_url模块

    • 功能

    实现远程主机下载执行URL到本地,支持sha256sum文件校验

    • 例子

    ansible webservers -m get_url -a “url=http://images.17173.com/2016/acg/2016/01/07/gq0107tt10.jpg dest=/root/ mode=0755 force=yes”

    13.cron模块

    • 功能

    远程主机crontab配置

    • 例子

    ansible webservers -m cron -a “name=‘do something’ hour=5,2 job=‘ls -alh >/dev/null’”

    14.mount模块

    • 功能

    远程主机分区挂载

    • 例子

    ansible webservers -m mount -a “name=/mnt/data src=dev/sd0 fstype=ect4 opts=ro state=present”

    展开全文
  • ansible入门_Ansible入门

    2020-07-21 08:08:12
    ansible入门The software development industry has grown over the years, from simple software running in one machine to complex systems running on multiple servers in the cloud. Provisioning and ...

    ansible入门

    The software development industry has grown over the years, from simple software running in one machine to complex systems running on multiple servers in the cloud. Provisioning and managing complex server architecture across different environments can be a challenge. This in most cases is the major cause of product releases and iterations.

    从一台机器上运行的简单软件到云中多台服务器上运行的复杂系统,软件开发行业已经发展了多年。 在不同环境中配置和管理复杂的服务器体系结构可能是一个挑战。 在大多数情况下,这是产品发布和迭代的主要原因。

    The traditionally we would manually provision servers, install all the dependencies, then launch software in them. This approach has its flaws. Assuming that your infrastructure gets corrupted or fails, to spin new servers you will have to go through the same painful process all over again. Frustrating right? Introducing IaC infrastructure as Code.

    传统上,我们将手动设置服务器,安装所有依赖项,然后在其中启动软件。 这种方法有其缺陷。 假设您的基础架构已损坏或发生故障,要旋转新服务器,您将不得不再次经历相同的痛苦过程。 令人沮丧吧? 将IaC基础架构引入Code。

    基础架构即代码。 ( Infrastructure As Code. )

    Infrastructure as Code (IaC) is the process of managing and provisioning computing and networking infrastructure and their configuration through machine-processable definition files (Code), rather than physical hardware configuration or the use of interactive configuration tools. Such files can be kept in source control to allow audibility and reproducible builds, subject to testing practices, and the full discipline of continuous delivery.

    基础架构即代码(IaC)是通过计算机可处理的定义文件(代码)而不是物理硬件配置或使用交互式配置工具来管理和配置计算和网络基础架构及其配置的过程。 此类文件可以保留在源代码控制中,以允许可听性和可复制性,并取决于测试实践和连续交付的全部准则。

    There are many tools that are used to achieve this such as terraform, Puppet, Chef, Ansible etc. However, in this article, we will be looking into Ansible.

    有许多工具可用于实现此目的,例如terraformPuppetChefAnsible等。但是,在本文中,我们将研究Ansible。

    什么是Ansible? ( What Is Ansible? )

    Ansible is an open source automation platform that is used for configuration management, application deployment, task automation e.t.c. It can also do IT orchestration to run tasks in sequence and create a chain of events which must happen on several different servers or devices. In simple terms, Ansible enables you to define your infrastructure as code in a simple declarative manner.

    Ansible是一个开源自动化平台,用于配置管理,应用程序部署,任务自动化等。它还可以进行IT编排,以按顺序运行任务并创建必须在多个不同服务器或设备上发生的事件链。 简单来说,Ansible使您能够以简单的声明方式将基础架构定义为代码。

    为什么使用Ansible? ( Why Use Ansible? )

    When it comes to choosing any tool, there is always the question, Why should I use it? What is the deal breaker? There are many reasons why you would choose Ansible as you configuration management tools. Here are some of them.

    在选择任何工具时,总会有一个问题,为什么要使用它? 什么是交易破坏者? 选择Ansible作为配置管理工具的原因有很多。 这里是其中的一些。

    它是无代理的。 (It is agentless.)

    As compared to Chef or Puppet, Ansible does not make use of the agent in the remote host rather it makes use of ssh to manage and provision systems. This a good news since you don't have to configure anything on the host before you can use it. This approach makes it easier to set up and to use.

    ChefPuppet相比,Ansible不使用远程主机中的代理,而是使用ssh来管理和配置系统。 这是个好消息,因为您无需在主机上进行任何配置即可使用它。 这种方法使设置和使用更加容易。

    并行执行。 (Parallel execution.)

    Ansible makes use the ad-hoc mode to run shell commands across multiple machines. This can come in handy if you are provisioning many servers. This reduces provision time make it easier and faster to replicate your infrastructure.

    Ansible使用ad-hoc模式在多台机器上运行shell命令。 如果要配置许多服务器,这可能会派上用场。 这减少了配置时间,使复制基础架构变得更加轻松快捷。

    自动报告。 (Automatic reporting.)

    It is recommended to name all the Ansible tasks in a very descriptive manner in your provisioning script. When the script is executed, Ansible will provide descriptive reports whether or not the task succeeded with or without changes. The messages are also coloured providing nice tidy reports.

    建议在配置脚本中以描述性的方式命名所有Ansible任务。 执行脚本后,Ansible将提供描述性报告,无论任务是否成功更改(无论是否更改)。 消息也被涂成彩色,以提供整洁的报告。

    易于使用。 (Easy to use.)

    Ansible uses YAML as its configuration syntax. This makes it easier to the user as compared to using a bash script. Taking into consideration that YAML is easy to learn, therefore reduces the learn curve.

    Ansible使用YAML作为其配置语法。 与使用bash脚本相比,这使用户更容易。 考虑到YAML易于学习,因此减少了学习曲线。

    关注点分离 (Separation of concern)

    Ansible has been designed to be modular in nature. With the use of roles, we can build components to accomplish specific tasks. This approach makes it easy to modify playbooks without affecting the general execution of the playbooks. Besides we can easily reuse this component in other setups thus reducing duplication.

    Ansible已被设计为本质上是模块化的。 通过使用角色,我们可以构建组件来完成特定任务。 这种方法使修改剧本变得容易,而又不影响剧本的一般执行。 此外,我们可以轻松地在其他设置中重用此组件,从而减少重复。

    可测试 (It is Testable)

    Did I just mention tests? Yes, Ansible playbooks can be tested. We have adopted TDD in many of our software development workflows, but with Ansible, we can introduce TDD to develops. Apart from checking for syntax, you can write tests to check if the servers are being provisioned and-and have all the required dependencies.

    我刚才提到测试吗? 是的,可以测试Ansible剧本。 我们在许多软件开发工作流程中都采用了TDD,但是借助Ansible,我们可以将TDD引入开发中。 除了检查语法外,您还可以编写测试来检查服务器是否已配置和-是否具有所有必需的依赖关系。

    What we have mentioned above are few among many reasons why Ansible is awesome and why you should start using it right away. If you are reading this article there is a chance you have already decided to use it or you are looking to learn to use it. Worry not by the end of this article you should have enough information to get you started.

    我们上面提到的是Ansible令人赞叹的诸多原因中的少数,以及为什么您应该立即开始使用它。 如果您正在阅读本文,则有可能您已经决定使用它,或者正在寻找学习使用它的机会。 不用担心,在本文结尾处,您应该没有足够的信息来入门。

    Ansible基本概念 ( Ansible Basic Concepts )

    In this article, we are looking to cover the key concepts that you should know to get started with Ansible. I will not be diving deeper into these concepts rather I will be providing guidelines and to get you going. This means it will be up to you to take the extra step to practice and research in these concepts. Nothing beats practice!

    在本文中,我们希望涵盖开始使用Ansible时应了解的关键概念。 我不会更深入地研究这些概念,而是会提供指导并帮助您前进。 这意味着您将需要采取额外的步骤来实践和研究这些概念。 没有什么比练习更重要的了!

    Here are the concepts we will be looking into. It is important that you get to understand them, how they are used and why. If you need more information, you can reference Ansible documentation - Which is awesome by the way.

    这是我们将要研究的概念。 重要的是要了解它们,如何使用它们以及为什么。 如果需要更多信息,可以参考Ansible文档 - 太好了。

    库存 ( Inventory )

    Ansible works against multiple systems in your infrastructure at the same time. It does this by selecting portions of systems listed in Ansible’s inventory file, which defaults to being saved in the location /etc/ansible/hosts.

    Ansible可同时针对基础架构中的多个系统工作。 它通过选择Ansible清单文件中列出的系统部分来完成此操作,该文件默认保存在/etc/ansible/hosts

    Through inventory files, you can specify meaningful groups of hosts that Ansible will provision. You also can specify group variables or host variables that will help to control how Ansible interacts with remote hosts and they will be available later in playbooks.

    通过清单文件,您可以指定Ansible将提供的有意义的主机组。 您还可以指定组变量或主机变量,这将有助于控制Ansible与远程主机的交互方式,它们将在以后的剧本中提供。

    Below is an example of an inventory file specify a group of hosts that Ansible will provision.

    以下是清单文件的示例,该文件指定了Ansible将提供的一组主机。

    [webservers]
    web.one.com
    web.two.com
    
    [dbservers]
    db.one.com
    db.two.com
    db.three.com

    The headings in brackets [] are group names, which are used in classifying systems and deciding what systems you are controlling at what time and for what purpose. It is ok to put systems in more than one group, for instance, a server could be both a web server and a DB server, as showcased in the example above.

    括号[]中的标题是组名,用于对系统进行分类并确定您在什么时候,什么目的控制什么系统。 可以将系统放在多个组中,例如,服务器可以既是Web服务器又是DB服务器,如上例所示。

    模组 ( Modules )

    Ansible ships with a number of modules (called the ‘module library’) that can be executed directly on remote hosts or through playbooks. These modules can control system resources, like services, packages, or files (anything really), or handle executing system commands.

    Ansible附带了许多模块(称为“模块库”),可以直接在远程主机上或通过剧本执行。 这些模块可以控制系统资源,例如服务,程序包或文件(实际上是任何东西),或处理执行系统命令。

    Modules use available context ("Facts") to determine what actions to execute, based on the state of the host machine. As we mentioned earlier, Ansible is idempotent, by using existing context, Ansible modules can determine if a task is to be executed or not. This ensures that not matter how many times you run Ansible scripts they will always remain in the same state. A good example is an apt module.

    模块根据主机的状态使用可用的上下文(“事实”)来确定要执行的操作。 如前所述,Ansible是幂等的,通过使用现有上下文,Ansible模块可以确定是否要执行任务。 这样可以确保无论您运行Ansible脚本多少次,它们都将始终保持相同状态。 apt模块就是一个很好的例子。

    Let us look at an example for installing Nginx and updating system cache.

    让我们看一个安装Nginx和更新系统缓存的示例。

    sudo apt-get install nginx
    sudo apt-get update

    The above commands through the use of apt module can be translated to:

    上面的命令通过使用apt模块可以翻译为:

    ...
    - name: Update repositories cache and install "nginx" package
      apt:
        name: nginx
        update_cache: yes
    ...

    The above task will only install Nginx once as compared to the actual command that will install it even though it exists.

    与安装Nginx的实际命令相比,以上任务仅会安装一次,即使该命令存在也是如此。

    Can I create my own modules? Yeah, why not! Ansible allows accommodates the creation of custom modules, in case you don't find what you are looking for don't despair you can create your own package and use it to your discretion. For more details refer to Ansible modules docs.

    我可以创建自己的模块吗? 是的,为什么不呢! Ansible allow可以容纳自定义模块的创建,以防万一您没有找到想要的东西或者不感到失望,可以创建自己的包并酌情使用。 有关更多详细信息,请参阅Ansible模块文档

    任务 ( Tasks )

    These are actions or steps that define the expected state of the host machine at a particular time. Ansible uses tasks as a way to order actions to be executed when a play is run. They are run sequentially this means that a task will only run when the previous task has been completed. It is recommended to name this tasks in a descriptive manner. As we mentioned above this comes I handy when it comes to reports.

    这些是定义主机在特定时间的预期状态的操作或步骤。 Ansible使用任务作为命令,在播放播放时命令要执行的动作。 它们按顺序运行,这意味着仅在上一个任务完成时才运行任务。 建议以描述性方式命名此任务。 正如我们上面提到的,这在报告方面非常方便。

    Tasks are mostly used together with modules to accomplish a particular outcome. It is important to note a task can only do one operation at a time. This means one task for one operation. Sometimes a task can do more that one operation through the use of loops.

    任务通常与模块一起使用以完成特定的结果。 请务必注意,一项任务一次只能执行一项操作。 这意味着一项操作只能完成一项任务。 有时,通过使用循环,一项任务可以完成一项以上的操作。

    The example above in the module section is a good example of a task.

    上面模块部分中的示例是一个很好的任务示例。

    剧本 ( Playbooks )

    Playbooks are Ansible’s configuration, deployment, and orchestration language. They can describe a policy you want your remote systems to enforce or a set of steps in a general IT process. They basically are YAML files that describe the desired state of the host or a group of hosts declared in the inventory file. They are designed to be human-readable and are developed in a basic text language (YAML).

    剧本是Ansible的配置,部署和编排语言。 它们可以描述您希望远程系统执行的策略,或者描述一般IT流程中的一组步骤。 它们基本上是YAML文件,用于描述清单文件中声明的主机或一组主机的所需状态。 它们被设计为易于阅读,并以基本文本语言(YAML)开发。

    If Ansible modules are the tools in your workshop, playbooks are your instruction manuals, and your inventory of hosts are your raw material. - Ansible docs.

    如果Ansible模块是您车间中的工具,则剧本是您的说明手册,主机清单是您的原材料。 -Ansible文档。

    At a basic level, playbooks can be used to manage configurations of and deployments to remote machines. However, they can sequence multi-tier rollouts involving rolling updates, delegate actions to other hosts, interacting with monitoring servers and load balancers.

    从根本上讲,剧本可用于管理远程计算机的配置和部署。 但是,它们可以按顺序排列多层部署,包括滚动更新,将操作委派给其他主机,与监视服务器和负载平衡器进行交互。

    # sample playbook.
    ---
    - hosts: dbservers
      roles:
        - mysql
    

    The playbook above targets hosts under dbservers group and uses the role mysql to provision them. I know you are asking what are roles? We will look into roles in later sections in this article.

    上面的剧本以dbservers组下的主机为目标,并使用mysql角色进行配置。 我知道您在问什么角色? 我们将在本文的后续部分中研究角色。

    的角色 ( Roles )

    While it is possible to write a playbook in one very large file eventually you’ll want to reuse files and start to organise things. Roles in Ansible build on the idea of including files and combining them to form clean, reusable abstractions. This allows you to focus more on the big picture and only dive down into the details when needed.

    尽管最终可以在一个非常大的文件中编写一个剧本,但是您将想要重用文件并开始组织事情。 Ansible中的角色基于包含文件并将其组合以形成干净,可重用的抽象的思想。 这样,您可以将更多精力放在全局上,仅在需要时才深入细节。

    With this approach, we can build Ansible playbooks that are modular and reusable. It also enables developers to share solutions. If you don't like to reinvent the wheel you can refer to the Ansible-galaxy and explore community roles.

    通过这种方法,我们可以构建模块化且可重用的Ansible剧本。 它还使开发人员可以共享解决方案。 如果您不想重新发明轮子,可以参考Ansible星系并探索社区角色。

    变数 ( Variables )

    Variables is not a new name to you, they are like containers that hold values that can be reused during program execution. While automation exists to make it easier to do repetitive tasks, it is not an excuse for you to repeat yourself.

    变量对您来说不是一个新名称,它们就像容器,其中包含可在程序执行期间重用的值。 尽管存在自动化可以使执行重复性任务变得更加容易,但是这并不是您重复自己的借口。

    Taking into consideration that all of your systems are not alike, it is also likely that you want to set some behaviour or configuration slightly different from others. In some cases, the state of the system might need to influence how they are configured.

    考虑到您的所有系统都不尽相同,因此您可能还希望设置某些行为或配置,使其与其他系统稍有不同。 在某些情况下,系统的状态可能需要影响它们的配置方式。

    At times you may want to generate configuration files e.g. Nginx to different servers which vary slightly. Situations like these require variables that can be used to handle these differences.

    有时,您可能想生成配置文件(例如Nginx)到不同的服务器上,这些文件会略有不同。 这些情况需要使用变量来处理这些差异。

    In Ansible variables are used to deal with differences between systems and to ensure that each system is provisioned based on its state and purpose. You can reference Ansible docs for more details.

    在Ansible中,变量用于处理系统之间的差异,并确保根据其状态和目的来配置每个系统。 您可以参考Ansible文档以获取更多详细信息。

    Variables can be defined in host_vars/, group_vars/ or vars/ folders under your roles directory. These variables can be used to override existing defaults where necessary.

    可以在您的角色目录下的host_vars/group_vars/vars/文件夹中定义vars/ 。 必要时,这些变量可用于覆盖现有默认值。

    # group_vars/all.yml
    host_name: db.one.com
    databases: 4
    
    database_names:
        - cia
        - airforce
        - marine
        - navy
    

    These variables can be used in tasks or templates through the use of curly brackets {{ variable_name }} expressions.

    通过使用大括号{{ variable_name }}表达式,可以在任务或模板中使用这些变量。

    范本 ( Templates )

    Ansible uses Jinja templating to enable dynamic expressions and access to variables. This makes templates a powerful resource that Ansible uses to generate files on the host machines. Ansible has also extended Jinja filters and tests as well as adding new plugins that can be used to dynamically resolve variables while generating files.

    Ansible使用Jinja模板来启用动态表达式和访问变量。 这使模板成为Ansible用来在主机上生成文件的强大资源。 Ansible还扩展了Jinja过滤器和测试,并添加了可用于在生成文件时动态解析变量的新插件。

    All the templates are placed in templatesfolder and have an extension of .j2 an indication that they are templates, Ansible can process to get a required output. Below is an example of an Ansible template for Nginx.

    所有模板都放置在templates文件夹中,扩展名为.j2 ,表示它们是模板,Ansible可以处理以获取所需的输出。 以下是Nginx的Ansible模板的示例。

    server {
      listen {{ listen_port }};
    
      location / {
        return 302 https://$host$request_uri;
      }
    }
    
    server {
      listen 443 ssl spdy;
      ssl_certificate    {{ ssl_certificate_path }};
      ssl_certificate_key    {{ ssl_key_path }};
      server_name {{ server_name }} {{ Ansible_eth0.ipv4.address }};
      location / {
        root   {{ web_root }};
        index  index.html index.htm;
      }
    }

    If we had a Nginx role we can use the above template to generate configuration file as follows:

    如果我们具有Nginx角色,则可以使用上面的模板来生成配置文件,如下所示:

    - hosts: webservers
      gather_facts: yes
      remote_user: ubuntu
      sudo: yes
      vars:
        ssl_certificate_path: "/etc/ssl/certs/mysite.crt"
        ssl_key_path: "/etc/ssl/private/mysite.key"
        server_name: "www.mysite.com"
        web_root: "/var/www/public"
        listen_port: 443
      roles:
        - nginx
    

    These variables are passed down to the Nginx role tasks which will, in turn, us the template, compile it and copy these file to its appropriate location on the host machine.

    这些变量传递给Nginx角色任务,这些任务将依次使用模板,对其进行编译,并将这些文件复制到主机上的适当位置。

    有条件的 ( Conditionals )

    Often the result of a play may depend on a value of a variable, facts or previous task result. In some cases, the values of variables may depend on other variables. This means that we have to run this tasks only when specific conditions are met. Let take a scenario where we are installing the MySQL database and later creating databases and users. We can only do this once and only when MySQL has been installed and the service is running.

    通常,比赛的结果可能取决于变量的值,事实或先前的任务结果。 在某些情况下,变量的值可能取决于其他变量。 这意味着我们仅在满足特定条件时才必须运行此任务。 让我们假设一个场景,我们要安装MySQL数据库,然后再创建数据库和用户。 只有在安装了MySQL并且服务正在运行时,我们才能这样做一次。

    Based on the above scenario, first, check if MySQL service is running, register the result and only create users and database when the result returned is Truthy. This is done by using when clause.

    根据上述情况,首先,检查MySQL服务是否正在运行,注册结果,并仅在返回的结果为Truthy时创建用户和数据库。 这是通过使用when子句完成的。

    When语句。 (The When statement.)

    As we have stated above, you might to skip or run tasks only when the certain condition is fulfilled. This could be as simple as installing packages, clean up or database configuration. With when clause in Ansible we can achieve this functionality very easily.

    如上所述,您可能仅在满足特定条件时才跳过或运行任务。 这可以像安装软件包,清理或数据库配置一样简单。 使用Ansible中的when子句,我们可以非常轻松地实现此功能。

    ...
    
    # Create database user
    tasks:
        - name: check if MySql is running
        - command: bash -c 'service mysql start'
          register: mysql
    
        - name: Add user and credentials to the database
          mysql_user:
            name: bob
            password: '*EE0D72C1085C46C5278932678FBE2C6A782821B4'
            encrypted: yes
            priv: '*.*:ALL'
            state: present
         when: mysql|success

    In the above example, the mysql_user task will only run if the check for MySQL database returns a zero output. In other words when the task succeeds.

    在上面的示例中,仅当MySQL数据库检查返回零输出时,mysql_user任务才会运行。 换句话说,任务成功时。

    循环 ( Loops )

    In some instances, you’ll want to do many things in one task, install a lot of packages, or repeat a polling step until a certain result is reached. You can do this by doing one task per operation, but this does not scale. So What to we do?

    在某些情况下,您可能想在一项任务中做很多事情,安装很多软件包,或重复轮询步骤,直到达到特定结果为止。 您可以通过每个操作执行一项任务来执行此操作,但这不会扩展。 那么我们该怎么办?

    Ansible provides us with a way to handle this kind of situation by implementing loops. Through loops, we can install packages or run operations passed to a task as a list.

    Ansible通过实施循环为我们提供了一种处理这种情况的方法。 通过循环,我们可以安装软件包或运行作为列表传递给任务的操作。

    - name: add several users
      user: name={{ item }} state=present groups=wheel
      with_items:
         - testuser1
         - testuser2
    

    With the example above, Ansible will repeat this task pass until all the two users have been added. The user's names are passed as item to the task.

    在上面的示例中,Ansible将重复此任务,直到添加了两个用户为止。 用户名作为item传递给任务。

    There are many complex loops you can achieve depending on the situation. Refer to ansible loops docs for more details.

    您可以根据情况实现许多复杂的循环。 有关更多详细信息,请参阅ansible循环文档

    结论 ( Conclusion )

    Ansible is an open-source automation engine that automates cloud provisioning, configuration management, and application deployment. It provides an easy way for us to manage our infrastructure through easy human readable syntax. The concepts we have looked at in the above sections is a mere drop in the ocean, they are only guidelines to get you started. So it is up to you to take the step further and explore what Ansible has to offer.

    Ansible是一个开源自动化引擎,可自动执行云配置,配置管理和应用程序部署。 它为我们提供了一种简单的方法,使我们可以通过易于理解的语法来管理基础结构。 我们在以上各节中讨论的概念只是沧海一粟,它们只是使您入门的指南。 因此,您需要进一步采取措施,并探索Ansible提供的服务。

    Now that we have understood what Ansible is all about, it is a good time to have some practice. So prepare yourself for hands-on experience in my next article.

    现在我们已经了解了Ansible的全部含义,现在是进行一些练习的好时机。 因此,在我的下一篇文章中为实践经验做准备。

    翻译自: https://scotch.io/tutorials/getting-started-with-ansible

    ansible入门

    展开全文
  • ansible入门

    2021-08-19 22:49:22
    ansible:无主从架构,开箱即用,用完即走。 安装步骤: 第一步:安装epel-relese YUM源 [root@www ~]# yum -y install epel-release 第二步:安装ansible [root@www ~]# yum -y install ansible 验证安装...

    ansible:无主从架构,开箱即用,用完即走。

    安装步骤:

            第一步:安装epel-relese YUM源

    [root@www ~]# yum -y install epel-release

            第二步:安装ansible

    [root@www ~]# yum -y install ansible

            验证安装是否成功

    [root@www ~]# rpm -qa |grep ansible
    ansible-2.9.24-2.el7.noarch
    

    主机清单

            *用于ansible controller配置主机时读取主机列表

            *实现主机分组

    主机清单储存于 /etc/ansible/hosts

            直接在主机清单文件中写入主机IP地址或可解析的主机名,或者添加主机分组,将IP写入分组中。

    vim /etc/ansible/hosts
    
    #写入
    192.168.126.132
    
    #或者
    [webgroup]
    192.168.126.132

    如何实现免密登录ssh,首先生成密钥

    [root@www ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ''
    
    #然后实现密钥同步ssh-copy-id 远程主机IP
    [root@www ~]# ssh-copy-id 192.168.126.132

    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@192.168.126.132's password: 

            *远程主机会生成authorized_keys

            *验证免密登录成功

     ping模块的简单使用

    [root@www ~]# ansible 192.168.126.132 -m ping
    

     

    使用ansible的cron模块实现配置多主机时间同步

            第一步:选择时钟源服务器

    国内建议使用阿里时钟源 time1.aliyun.com

    国际建议使用微软时钟源time.windows.com

            ansible 命令格式

    # ansible 主机清单中IP或者分组名称  -m  模块  -a  参数

            cron模块应用

    #每小时与时钟源同步一次
    [root@www ~]# ansible 192.168.126.132 -m cron -a 'name="cron01" job="ntpdate time1.aliyun.com" minute=0 hour=*/1'
    
    

    远程主机查看结果

    [root@master01 ~]# crontab -l
    #Ansible: cron01
    0 */1 * * * ntpdate time1.aliyun.com
    

    使用ansible copy模块实现多主机配置文件同步

            第一步准备本地域名解析文件 /etc/hosts

    第二步 copy模块应用  #  ansible 主机清单中IP或者分组名称  -m  模块  -a  参数

    [root@www ~]# ansible 192.168.126.132 -m copy -a "src=/etc/hosts dest=/etc/hosts"
    #src原路径 dest目标路径

    远程主机验证 cat /etc/hosts

    展开全文
  • ansible入门 Ansible是一种开源自动化工具,用于从一个中央位置配置服务器,安装软件以及执行各种IT任务。 这是一种一对多的无代理机制,其中所有指令均从通过SSH与远程客户端进行通信的控制机上运行,​​尽管也...

    ansible入门

    Ansible是一种开源自动化工具,用于从一个中央位置配置服务器,安装软件以及执行各种IT任务。 这是一种一对多的无代理机制,其中所有指令均从通过SSH与远程客户端进行通信的控制机上运行,​​尽管也支持其他协议。

    对于具有特权访问权限的系统管理员,他们通常执行诸如安装和配置应用程序之类的任务,而Ansible也可以由非特权用户使用。 例如,使用mysql登录ID的数据库管理员可以使用Ansible创建数据库,添加用户并定义访问级别控件。

    让我们看一个非常简单的示例,其中系统管理员每天配置100台服务器,并且必须在每个服务器上运行一系列Bash命令,然后再将其交付给用户。

    Mapping Bash commands to an Ansible playbook

    这是一个简单的示例,但应说明在yaml文件中指定命令并在远程服务器上执行命令的容易程度。 在异构环境中,可以添加条件语句,以便仅在某些服务器中执行某些命令(例如,“仅在非Ubuntu或Debian的系统中执行yum命令”)。

    Ansible中的一个重要功能是,剧本描述了计算机系统中所需的状态,因此,剧本可以在不影响服务器状态的情况下针对服务器多次运行。 如果已经执行了某个任务(例如,“用户sysman已经存在”),则Ansible会简单地忽略它并继续前进。

    定义

    • 任务: 任务是最小的工作单元。 它可以是“安装数据库”,“安装Web服务器”,“创建防火墙规则”或“将此配置文件复制到该服务器”之类的操作。
    • 播放: 一场戏是由任务组成的。 例如,播放:“准备要由Web服务器使用的数据库”由以下任务组成:1)安装数据库包; 2)为数据库管理员设置密码; 3)创建一个数据库; 和4)设置对数据库的访问。
    • 剧本: 剧本由剧本组成。 一本剧本可能是:“用数据库后端准备我的网站”,而剧本将是:1)设置数据库服务器; 和2)设置Web服务器。
    • 角色: 角色用于保存和组织剧本,并允许共享和重用剧本。 按照前面的示例,如果您需要完全配置Web服务器,则可以使用其他人编写和共享的角色来做到这一点。 由于角色是高度可配置的(如果编写正确),因此可以轻松地重用它们以适应任何给定的部署要求。
    • Ansible星系: Ansible Galaxy是一个在线存储库,其中角色已上载,因此可以与其他人共享。 它与GitHub集成在一起,因此可以将角色组织到Git存储库中,然后通过Ansible Galaxy进行共享。

    这些定义及其关系如下所示:

    Ansible definitions and how they relate to each other

    请注意,这只是组织需要执行的任务的一种方法。 我们本来可以将数据库和Web服务器的安装分成单独的剧本和不同的角色。 Ansible Galaxy中的大多数角色都安装和配置单个应用程序。 您可以看到有关安装mysql和安装httpd的示例。

    编写剧本的技巧

    学习Ansible的最佳来源是官方文档站点。 而且,和往常一样,在线搜索是您的朋友。 我建议从简单的任务开始,例如安装应用程序或创建用户。 准备就绪后,请遵循以下准则:

    • 在测试时,请使用一小部分服务器,以加快播放速度。 如果它们在一台服务器上成功,那么它们将在其他服务器上成功。
    • 务必进行--check-mode运行以确保所有命令均正常运行(使用--check-mode标志运行)。
    • 根据需要进行多次测试,而不必担心会损坏东西。 任务描述了期望的状态,因此,如果已经实现了期望的状态,则将其简单地忽略。
    • 确保/etc/ansible/hosts中定义的所有主机名都是可解析的。
    • 由于与远程主机的通信是使用SSH完成的,因此密钥必须由控制计算机接受,因此:1)在启动之前与远程主机交换密钥; 或2)准备输入“是”以接受要管理的每个远程主机的SSH密钥交换请求。
    • 尽管您可以在一个剧本中组合用于不同Linux发行版的任务,但是为每个发行版编写一个单独的剧本更为干净。

    归根结底

    Ansible是在数据中心实施自动化的绝佳选择:

    • 它是无代理的,因此比其他自动化工具更易于安装。
    • 指令在YAML中(尽管也支持JSON),因此比编写Shell脚本更容易。
    • 它是开源软件,因此请回馈它并使其变得更好!

    您如何使用Ansible自动化数据中心? 在评论中分享您的经验。

    翻译自: https://opensource.com/article/18/2/tips-success-when-getting-started-ansible

    ansible入门

    展开全文
  • $ sudo yum install epel-release $ sudo yum install ansible

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,798
精华内容 2,319
关键字:

ansible入门