ansible_ansible playbook - CSDN
  • 一、Ansible基础 1.1 什么是Ansible Ansible是一款基于python开发的自动化运维工具,是用来批量管理多台机器的。 ansible可以让我们实现: – 自动化部署APP – 自动化管理配置项 – 自动化的持续...

    一、Ansible基础

    1.1 什么是Ansible

    Ansible是一款基于python开发的自动化运维工具,是用来批量管理多台机器的。

    ansible可以让我们实现:
    – 自动化部署APP
    – 自动化管理配置项
    – 自动化的持续交付
    – 自动化的(AWS)于服务管理

    1.2 ansible特性

    1.模块化设计,调用特定的模块来完成特定任务
    2.基于python语言实现
    3.其模块支持JSON等标准输出格式
    4.支持playbook

    1.3 部署Ansible

    1.3.1 环境准备

    1. 对管理主机
    – 要求Python 2.6 或以上环境

    2. 对于被托管主机
    – 要求Pyhton 2.5 或以上环境
    – 托管主机要开启 ssh 服务

    1.3.2 安装Ansible

    1.搭建自定义yum源

       1.1 下载 ansible_soft

       1.2 把软件包解压到ftp指定目录下,通过createrepo创建yum源

        ansible]# createrepo  .

        附:如果自定义yum源添加的rpm包后,只需要更新索引文件即可    createrepo –update . 

    2.客户端挂载后,直接通过yum安装

    ~]# yum -y install ansible

    3.安装后查看版本

    ~]# ansible –version

    二、ad-hoc

    2.1 主机管理

    2.1.1 主机定义与分组

    1.Ansible配置文件查找顺序
       1.首先检测 ANSIBLE_CONFIG 变量定义的配置文件
       2. 其次检查当前目彔下的 ./ansible.cfg 文件
       3.再次检查当前用户家目彔下 ~/ansible.cfg 文件
       4.最后检查 /etc/ansible/ansible.cfg 文件

    2./etc/ansible/ansible.cfg 默认配置文件路径

    3.ansible.cfg 配置文件
    – inventory 是定义托管主机地址配置文件
    – 首先编辑 /etc/ansible/hosts 文件,写入一些进程主机

    4.格式
    – # 表示注释
    [组名称]
    主机名称或ip地址,登录用户名,密码、端口等信息

    5.测试
    – ansible [组名称] –list-hosts

    2.1.2  hosts文件inventory 参数说明

    1. ansible_ssh_port
    – ssh端口号.如果不是默认的端口号,通过此变量设置.

    2. ansible_ssh_user
    – 默认的 ssh 用户名

    3. ansible_ssh_pass
    – ssh 密码(这种方式并不安全,建议使用 –ask-pass 或 SSH 密钥)

    4. ansible_sudo_pass
    – sudo 密码(建议使用 –ask-sudo-pass)

    2.1.3 hosts文件的配置

    1. [web]               //指定分组名称
    2. web[1:2]          // 指定web 1~2的范围
    3. [db]
    4. db1
    5. db2
    6. [app:children]   //指定子组
    7. web
    8. db
    9. [app:vars]         //指定app主的公有变量
    10. ansible_ssh_user=“root”
    11. ansible_ssh_pass=“123456”
    12. [other]
    13. cache        ansible_ssh_user=“root” ansible_ssh_pass=“123456”       //指定连接的用户名和密码

    2.1.4 动态主机

    动态主机可以用一个JSON格式的字符串来表示,这种字符串可以自己写脚本定义

    1. 脚本内容

    #!/usr/bin/python
    import json
    hostlist = {}
    hostlist[“aa”] = [“192.168.1.15”, “192.168.1.16”]
    hostlist[“192.168.1.13”] = {
    “ansible_ssh_user”:”root”,”ansible_ssh_pass”:”pwd”
    }
    hostlist[“bb”] = {
    “hosts” : [“192.168.1.11”, “192.168.1.12”],
    “vars” : {
    “ansible_ssh_user”:”root”,”ansible_ssh_pass”:”pwd”
    }
    }
    print( json.dumps(hostlist))

    2.脚本输出

    {
    “aa” : {
    “hosts” : [“192.168.1.11”, “192.168.1.12”],
    “vars” : {
    “ansible_ssh_user” : “root”,
    “ansible_ssh_pass” : “pwd”
    }
    },
    “bb” : [“192.168.1.15”, “192.168.1.16”],
    “192.168.1.13”: { “ansible_ssh_user” : “root”,
    “ansible_ssh_pass” : “pwd”}
    }

    2.2 批量执行

    2.2.1 ansible命令基础

    ansible  主机分组  -m 模块  -a ‘命令和参数’

    – -M 指定模块路径
    – -m 使用模块,默认 command 模块
    – -a or –args 模块参数
    – -i inventory 文件路径,或可执行脚本
    – -k 使用交互式登录密码
    – -e 定义变量
    – -v 详细信息,-vvvv 开启 debug 模式

    2.2.2 给所有主机部署密钥

    1.创建密钥对 id_rsa 是私钥,  id_rsa.pub 是公钥
    ssh-keygen -t rsa -b 2048 -N ”

    2.使用authorized_key模块实现批量部署免密登录

    ansible all -m authorized_key -a “user=root exclusive=true manage_dir=true key=’$(< /root/.ssh/id_rsa.pub)’” -k

    exclusive=true:表示如果托管主机上有部署过的本机的公钥信息,直接覆盖。没有就添加公钥系信息

    manage_dir: 表示托管主机没有/root/.ssh文件夹就创建,有就直接创建authorized_keys文件

    三、批量配置管理

    3.1 模块 

    3.1.1 ansible-doc 模块

    1. 模块的手册,相当于 shell 的 man
    2. ansible-doc -l 列出所有模块
    3. ansible-doc modulename 查看帮助
    ~]# ansible-doc authorized_key

    3.1.2 ping 模块

    1. ping模块没有参数,测试的是 ssh 的连通性
    ~] # ansible host-pattern -m ping

    3.1.3  command | shell | raw 模块

    1.command 是默认模块,没有启用 shell ,所有shell 相关特性命令无法使用,例如 < > | &

    – 使用默认模块下面两条命令执行会失败
    ~] #ansible all -m command -a ‘ps aux|grep ssh’    
    ~] #ansible all -m command -a ‘set’

    ~] # ansible t1 -m command -a ‘chdir=/tmp touch f3’   //f3在/tmp目录下创建成功

    2.raw    模块,没有 chdir create remove 等参数,能执行大部分操作

    ~] # ansible t1 -m raw -a ‘chdir=/tmp touch f3’     //f3文件会在当前目录下(/root)创建,并不会在/tmp目录下创建,因为raw模块不支持chdir

    3.shell  模块,启动 /bin/sh 运行命令,可以执行所有操作  【生产环境中用】

    ~] # ansible t1 -m raw -a ‘chdir=/tmp touch f3’     //f3会在/tmp目录下创建,shell模块支持所有bash下的所有命令

    3.1.4 script模块

    1. 直接在本地写脚本,然后使用 script 模块批量执行
    2. ansible t1 -m script -a ‘script’
    3.该脚本包含但不限于 shell 脚本,只要指定 Sha-bang 解释器的脚本都可运行

    4.业务需求:

    在web主的所有主机上如果有zhangsan用户就什么都不干

    如果没有zhangsan用户,就添加lisi用户。并设置默认密码为123456,lisi用户第一次登录的时候必须修改自己的密码

    5.功能实现

    1. #!/bin/bash
    2. id zhangsan
    3. if [ $? -ne 0 ];then
    4.         useradd lisi
    5.         echo 654321 | passwd --stdin lisi
    6.         chage -d 0 lisi
    7. fi

    ~ ] # ansible web -m script -a ‘userweb.sh’

    3.1.5 copy模块

    1.copy模块用来复制文件到进程主机

    – src:要复制到进程主机的文件在本地的地址。如果路径是一个目录,它将递归复制。
    在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则
    包含目录在内的整个内容全部复制

    – dest:必选项。进程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目彔

       1.1 实验说明

       ~]# ansible cache -m copy -a ‘src=/root/myansible dest=/root/’

        cache主机的/root下会多一个myansible文件夹

        ~]# ansible cache -m copy -a ‘src=/root/myansible/ dest=/root/’

        cache主机的/root下会多出myansible文件夹里面的文件,并不会有myansible文件夹

    – backup:在覆盖前将原文件备份,备份文件包含时
    间信息。有两个选项:yes|no
    – force:如果目标主机包含该文件,但内容不同,如果
    设置为yes,则强制覆盖,如果为no,则只有当目标主
    机的目标位置不存在该文件时,才复制。默认为yes

    2. 复制文件
    [root@ansible ~]# ansible cache -m copy -a ‘src=/root/rsync.sh dest=/root’
    3. 复制目录
    ansible t1 -m copy -a ‘src=urdir dest=/root/’

    3.1.6 lineinfile | replace 模块

    1. lineinfile | replace是一种替换文本内容的模块

    2.参数说明

       2.1 path 目的文件
       2.2 regexp 正则表达式
       2.3 line 替换后的结果
       2.4 replace 正则匹配到结果需要替换后的内容

    3.lineinfile替换的是一整行的内容
    ansible t1 -m lineinfile -a ‘path=”/etc/selinux/config”
    regexp=”^SELINUX=” line=”SELINUX=disabled”’

    4.replace替换的是指定字符
    ansible t1 -m replace -a ‘path=”/etc/selinux/config”
    regexp=”^(SELINUX=).*” replace=”\1disabled”’

    3.1.7 yum模块

    1.yum模块是用来批量管理多台主机软件包

    2.参数说明

       2.1 name:要进行操作的软件包的名字

       2.2 state:状态(installed,removed)  [Default: installed]

    3.安装删除软件包

       3.1 安装多个软件包

       ansible t1 -m yum -a ‘name=”lrzsz,lftp”’

       3.2 删除多个软件包

       ansible t1 -m yum -a ‘name=”lrzsz,lftp” state=absent’

    3.1.8 service模块

    1.yum模块批量管理多台主机服务

    2.参数说明

    – name:必选项,服务名称
    – enabled:是否开机启动 yes|no
    – state:对当前服务执行启动,停止、重启、重新加载
    等操作(started,stopped,restarted,reloaded)

    ~] # ansible t1 -m service -a ‘name=”sshd” enabled=”yes” state=”started”’

    3.1.9 setup模块

    1.setup模块主要用于获取主机信息

    2.filter 可以过滤到我们需要的信息

    ~]# ansible cache -m setup -a ‘filter=ansible_os_family’

    展开全文
  • 非常好的Ansible入门教程(超简单)

    万次阅读 多人点赞 2017-09-30 10:04:56
    Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt。这是一款很简单也很容易入门的部署工具,它使用SSH连接到服务器并运行配置的任务,服务器上不用安装任何多余的软件,只需要开启ssh,所有工作都交给...

    Ansible是一个配置管理和配置工具,类似于Chef,Puppet或Salt。这是一款很简单也很容易入门的部署工具,它使用SSH连接到服务器并运行配置好的任务,服务器上不用安装任何多余的软件,只需要开启ssh,所有工作都交给client端的ansible负责。
    关于Ansible的一个好处是,将bash脚本转换为可执行任务是非常容易的。我们可以编写自己的配置程序,但是Ansible更加干净,因为它可以自动在执行任务之前获取上下文。ansible任务是幂等的,没有大量额外的编码,ansible可以一次又一次地安全运,而bash命令这种幂等性。
    ansible使用“facts”来确保任务的幂等安全运行, 它是在运行任务之前收集的系统和环境信息。ansible使用这些facts来检查状态,看看是否需要改变某些东西以获得所需的结果。这使得ansible可以让服务器一次又一次地运行可复制的任务。

    1 安装

    当然我们需要先安装Ansible。任务可以从任何可安装的机器上运行。

    1.1 Ubuntu

    在Ubuntu 16.04上安装Ansible的方法。

    sudo apt-get install -y ansible

    apt-get安装的ansible版本很低,建议使用pip方式安装

    sudo pip install ansible

    2 配置

    ansible的默认配置文件路径为 /etc/ansible,然而,一个常见的用途是将其安装在一个virtualenv中,在这种情况下,我们一般不会使用这些默认文件。我们可以根据需要在本地目录中创建配置文件。

    2.1 管理服务器:Inventory文件

    您可以创建一个inventory文件,用于定义将要管理的服务器。这个文件可以命名为任何名字,但我们通常会命名为hosts或者项目的名称。
    在hosts文件中,我们可以定义一些要管理的服务器。这里我们将定义我们可能要在“web”标签下管理的两个服务器。标签是任意的。

    [web]
    192.168.22.10
    192.168.22.11

    现在已经够好了,如果需要,我们可以定义主机范围,多个组,可重用变量,并使用其他花哨的设置,包括创建动态的inventory。
    当我们在本地机器运行ansible时,我们不需要关心inventory文件中的内容,我将告诉您在本地和远程服务器上运行ansible。现在,让我们将hosts文件设置为指向本地主机local和remote虚拟远程主机。
    hosts文件:

    [local]
    127.0.0.1
    
    [remote]
    192.168.1.2

    与本地主机和远程服务器连接的命令。

    2.2 基础:运行命令

    我们开始对服务器运行任务。ansible会假定你的服务器具有SSH访问权限,通常基于SSH-Key。因为Ansible使用SSH,所以它需要能够SSH连接到服务器。但是,ansible将尝试以正在运行的当前用户身份进行连接。如果我正在运行ansible的用户是ubuntu,它将尝试以ubuntu连接其他服务器。

    # Run against localhost
    $ ansible -i ./hosts --connection=local local -m ping
    
    # Run against remote server
    $ ansible -i ./hosts remote -m ping
    127.0.0.1 | success >> {
        "changed": false,
        "ping": "pong"
    }

    如果你是在cygwin下运行,遇到了“Failed to connect to the host via ssh: mux_client_request_session: read from master failed”的错误,可以执行:

    ansible -i ./hosts remote -v -m ping -u root --private-key=~/.ssh/id_rsa

    使用–connection=local告诉ansible不尝试通过SSH运行命令,因为我们只是影响本地主机。但是,我们仍然需要一个hosts文件,告诉我们连接到哪里。
    在任何情况下,我们可以看到从ansible得到的输出是一些JSON,它告诉我们Task(我们对ping模块的调用)是否进行了任何更改和结果。

    命令说明:

    -i ./hosts - 设置库存文件,命名为 hosts
    remote,local,all-使用这个标签的下定义的服务器hosts清单文件。“all”是针对文件中定义的每个服务器运行的特殊关键字
    -m ping- 使用“ping”模块,它只是运行ping命令并返回结果
    -c local| --connection=local - 在本地服务器上运行命令,而不是SSH
    
    一些常用命令:
    -i PATH --inventory=PATH 指定host文件的路径,默认是在/etc/ansible/hosts
    --private-key=PRIVATE_KEY_FILE_PATH 使用指定路径的秘钥建立认证连接
    -m DIRECTORY --module-path=DIRECTORY 指定module的目录来加载module,默认是/usr/share/ansible
    -c CONNECTION --connection=CONNECTION 指定建立连接的类型,一般有ssh ,local

    2.2.1 模块(Modules)

    ansible使用“模块”来完成大部分的任务。模块可以做安装软件,复制文件,使用模板等等。

    模块是使用Ansible 的方法

    因为它们可以使用可用的上下文(“Facts”),以便确定要完成任务需要做什么操作。
    如果我们没有模块,我们将运行任意的shell命令,我们也可以使用bash脚本。这是一个任意shell命令看起来像在Ansible(它使用的shell模块!):

    # Run against a local server
    ansible -i ./hosts local --connection=local -b --become-user=root \
        -m shell -a 'apt-get install nginx'
    
    # Run against a remote server
    ansible -i ./hosts remote -b --become-user=root all \
        -m shell -a 'apt-get install nginx'

    这里,sudo apt-get install nginx命令将使用“shell”模块运行。
    命令说明:

    -b - “成为”,在运行命令时告诉可以成为另一个用户。
    --become-user=root - 以用户“root”运行以下命令(例如,使用命令使用“sudo”)。我们可以在此定义任何现有的用户。
    -a 用于将任何参数传递给定义的模块 -m

    但是这并不是特别强大。尽管能够一次在所有服务器上运行这些命令,但是我们仍然只能完成任何bash脚本可能执行的操作。如果我们使用了更合适的模块,我们可以运行命令来保证结果。可靠的模块确保我们可以一次又一次地运行相同的任务,而不会影响最终结果。
    要在Debian / Ubuntu服务器上安装软件,“apt”模块将运行相同的命令,但确保幂等。

    # Run against a local server
    ansible -i ./hosts local --connection=local -b --become-user=root \
        -m apt -a 'name=nginx state=installed update_cache=true'
    
    127.0.0.1 | success >> {
        "changed": false
    }
    
    # Run against a remote server
    ansible -i ./hosts remote -b --become-user=root \
        -m apt -a 'name=nginx state=installed update_cache=true'
    
    127.0.0.1 | success >> {
        "changed": false
    }
    
    or:
    ansible -i ./hosts remote -v -m apt -a 'name=nginx state=installed update_cache=true' -u test -s -K --private-key=~/.ssh/id_rsa
    

    这将使用apt模块来更新存储库缓存并安装Nginx(如果没有安装)。
    运行任务的结果是”changed”: false。这表明没有变化; 我已经使用该shell模块安装了Nginx 。好的是,我可以一遍又一遍地运行这个命令,而不用担心它会改变预期的结果 - Nginx已经安装,Ansible知道,并且不尝试重新安装它。
    命令说明:

    -i ./hosts - 设置inventory文件,命名为 hosts
    -b - “成”,告诉可以成为另一个用户来运行命令
    --become-user=root - 以用户“root”运行以下命令(例如,使用“sudo”命令)
    local| remote - 从库存文件中的本地或远程定义的主机上运行
    -m apt- 使用apt模块
    -a 'name=nginx state=installed update_cache=true' - 提供apt模块的参数,包括软件包名称,所需的结束状态以及是否更新软件包存储库缓存
    
    常用命令:
    -u USERNAME --user=USERNAME 指定移动端的执行用户
    -U SUDO_USERNAME --sudo-user=USERNAME
    -s --sudo -u指定用户的时候,使用sudo获得root权限
    -k --ask-pass  提示输入ssh的密码,而不是使用基于ssh的密钥认证
    -K --ask-sudo-pass 提示输入sudo密码,与--sudo一起使用

    我们可以通过这种特殊方式运行我们所需要的所有任务(通过模块),但是让我们来做这个更具管理性。我们将把这个任务移动到一个Playbook中,它可以运行和协调多个Tasks。

    2.3 剧本(Playbooks)

    Playbook可以运行多个任务,并提供一些更高级的功能。让我们将上述任务移到一本剧本中。在ansible中剧本(playbooks)和角色(roles)都使用Yaml文件定义。
    创建文件nginx.yml:

    ---
    # hosts could have been "remote" or "all" as well
    - hosts: local
      connection: local
      become: yes
      become_user: root
      tasks:
       - name: Install Nginx
         apt:
           name: nginx
           state: installed
           update_cache: true

    此任务与我们的ad-hoc命令完全相同,包括设置本地连接的使用。
    这将使用inventory文件中[local]标签下的服务器hosts。
    如果我们没有使用本地连接,我们会这样做:

    ---
    - hosts: remote
      become: yes
      become_user: root
      tasks:
       - name: Install Nginx
         apt:
           name: nginx
           state: installed
           update_cache: true

    这将使用inventory文件中[remote]标签下的服务器hosts。

    在我们的Tasks文件中使用become并become_user再次使用Ansible来sudo以root用户身份运行命令,然后传递Playbook文件。

    使用一个yaml playbook文件,我们需要使用这个ansible-playbook命令,现在就更容易运行:

    $ ansible-playbook -i ./hosts nginx.yml
    
    PLAY [local] ******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [127.0.0.1]
    
    TASK: [Install Nginx] *********************************************************
    ok: [127.0.0.1]
    
    PLAY RECAP ********************************************************************
    127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0

    我们在运行过程中获得了一些有用的反馈,包括“可执行任务”运行及其结果。在这里我们看到所有运行都OK,但没有改变。我已经安装了Nginx

    2.3.1 处理程序(Handlers)

    处理程序与任务完全相同(它可以做task可以做的任何事),但只有当另一个任务调用它时才会运行。您可以将其视为事件系统的一部分; 处理程序将通过其侦听的事件调用进行操作。
    这对于运行任务后可能需要的“辅助”操作非常有用,例如在配置更改后安装或重新加载服务后启动新服务。

    ---
    # Example shows using the local machine still
    # Remove 'connection' and set hosts to 'remote' for a remote connection
    - hosts: local
      connection: local
      become: yes
      become_user: root
      tasks:
       - name: Install Nginx
         apt:
           name: nginx
           state: installed
           update_cache: true
         notify:
          - Start Nginx
    
      handlers:
       - name: Start Nginx
         service:
           name: nginx
           state: started

    这里我们添加一个notify指令到安装任务。这将在任务运行后通知名为“Start Nginx”的处理程序。

    然后我们可以创建名为“Start Nginx”的处理程序。此处理程序是通知“Start Nginx”时调用的任务。
    这个特定的处理程序使用服务模块,它可以启动,停止,重启,重新加载(等等)系统服务。在这种情况下,我们告诉Ansible,我们要启动Nginx。
    让我们再次运行这本Playbook:

    $ ansible-playbook -i ./hosts nginx.yml
    
    PLAY [local] ******************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [127.0.0.1]
    
    TASK: [Install Nginx] *********************************************************
    ok: [127.0.0.1]
    
    NOTIFIED: [nginx | Start Nginx] ***********************************************
    ok: [127.0.0.1]
    
    PLAY RECAP ********************************************************************
    127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0

    我们得到类似的输出,但是这次Handler是运行的。
    通知程序只在运行任务时运行。

    Note:如果我已经安装了Nginx,则安装Nginx任务将不会运行,通知程序也将不会被调用。

    我们可以使用Playbook来运行多个任务,添加变量,定义其他设置,甚至包括其他的剧本。

    2.3.2 更多的任务(More Tasks)

    接下来,我们可以为此Playbook添加更多的任务,并探索其他一些功能。

    ---
    # Example shows using the local machine still
    # Remove 'connection' and set hosts to 'remote' for a remote connection
    - hosts: local
      connection: local
      become: yes
      become_user: root
      vars:
       - docroot: /var/www/serversforhackers.com/public
      tasks:
       - name: Add Nginx Repository
         apt_repository:
           repo: ppa:nginx/stable
           state: present
         register: ppastable
    
       - name: Install Nginx
         apt:
           pkg: nginx
           state: installed
           update_cache: true
         when: ppastable|success
         notify:
          - Start Nginx
    
       - name: Create Web Root
         file:
          path: '{{ docroot }}'
          mode: 775
          state: directory
          owner: www-data
          group: www-data
         notify:
          - Reload Nginx
    
      handlers:
       - name: Start Nginx
         service:
           name: nginx
           state: started
    
        - name: Reload Nginx
          service:
            name: nginx
            state: reloaded

    现在有三个任务:

    Add Nginx Repository- 使用apt_repository模块添加Nginx稳定PPA以获取最新的稳定版本的Nginx 。
    Install Nginx - 使用Apt模块安装Nginx。
    Create Web Root - 最后创建一个Web根目录。

    新的register和when指令,可以实现在某些事情发生后让ansible执行任务的功能。

    Note: 您还可以注册模块操作的结果,并使用定义的变量根据注册(register)的变量值有条件(when)地执行操作。例如,注册通过shell模块运行命令的结果可以让您访问该命令的stdout。

    同时还使用了一个变量。docroot变量在定义vars部分。然后将其用作创建定义目录的文件模块的目标参数。

    需要注意的是,path配置使用括号{{ var-name }},这是Jinja2的模板。为了使Ansible能够在括号内解析Jinja2模板变量,该行必须是单引号或双引号 - 例如,path: ‘{{ docroot }}’而不是path: {{ docroot }}。不使用引号将导致错误。
    这个playbook可以用通常的命令运行:

    ansible-playbook -i ./hosts nginx.yml

    所以,我们已经运行了一些ad-hoc命令,使用了可复制的模块,并将一些相关任务组织到一个手册中。

    接下来,我们将通过将Playbook组织成一个角色进一步获得可靠性,这有助于我们组织相关项目,如文件和模板,同时还帮助我们组织更复杂的相关任务和操作。

    2.4 角色(roles)

    角色很适合组织多个相关任务并封装完成这些任务所需的数据。例如,安装Nginx可能涉及添加软件包存储库,安装软件包和设置配置。
    此外,真实的配置通常需要额外的数据,如变量,文件,动态模板等等。这些工具可以与Playbook一起使用,但是我们可以通过将相关任务和数据组织成一个角色(role, 相关的结构)很快就能做得更好。
    角色有一个这样的目录结构:

    roles
      rolename
       - files
       - handlers
       - meta
       - templates
       - tasks
       - vars

    在每个子目录中(eg: files,handlers等等),Ansible将自动搜索并读取叫做main.yml的yaml文件。
    接下来我们将分解nginx.yml文件内容为不同的组件,并将每个组件放在相应的目录中,以创建一个更干净,更完整的配置工具集。

    2.4.1 创建角色(Creating a Role)

    我们可以使用ansible-galaxy命令来创建一个新角色。此工具可用于将角色保存到Ansible的公共注册表,但是我通常只是使用它来在本地创建role的基础目录结构。

    我们来看看如何设置:

    # Head to our previously created directory
    cd ~/ansible-example
    
    # In case we left our virtualenv at some point 
    source .venv/bin/activate
    
    # Create a roles directory
    mkdir roles
    cd roles
    
    # Bootstrap a new role named "nginx"
    ansible-galaxy init nginx

    目录名称roles是一种惯例,在运行一个playbook时可以用来查找角色。该目录应该始终被命名roles,但并不强制。在roles目录中运行 ansible-galaxy init nginx 命令将创建新角色所需的目录和文件。

    我们来看看我们新建的nginx角色的每个部分~/ansible-example/roles/nginx。

    2.4.2 文件(files)

    首先,在files目录中,我们可以添加我们要复制到我们的服务器中的文件。对于nginx,我经常复制H5BP的Nginx组件配置。我只需从Github下载最新的信息,进行一些调整,并将它们放入files目录中。

    ~/ansible-example
     - roles
     - - nginx
     - - - files
     - - - - h5bp

    我们稍后会看到,H5BP配置文件将通过复制模块添加到服务器。

    2.4.3 处理程序(handlers)

    我们可以把曾经在nginx.yml 剧本中的定义的所有处理程序放入到handlers目录中。约定必须包含main.yml文件。

    handlers/main.yml 内容:

    ---
    - name: Start Nginx
      service:
        name: nginx
        state: started
    
    - name: Reload Nginx
      service:
        name: nginx
        state: reloaded

    一旦handlers/main.yml中的处理程序定义好了,我们可以自由地从其他的yaml配置中引用它们。

    2.4.4 元(meta)

    meta目录中的main.yml文件包含Role元数据,包含的依赖关系。如果这个角色依赖于另一个角色,我们可以在这里定义。例如,nginx角色取决于安装SSL证书的ssl角色。约定必须包含main.yml文件。
    meta/main.yml 内容:

    ---
    dependencies:
      - { role: ssl }

    如果我调用了“nginx”角色,它将尝试首先运行“ssl”角色。
    否则我们可以省略此文件,或将角色定义为没有依赖关系:

    ---
    dependencies: []

    2.4.5 模板(templates)

    基于Python的Jinja2模板引擎(和django的模板引擎很类似),模板文件可以包含模板变量。这里的文件应该以.j2为类型后缀(eg.uwsgi.j2),提倡但是不强制,也可以取其他的名字。类似于files,在templates目录中没有main.yml文件,只包含.j2后缀的模板文件。
    这是一个Nginx服务器(“虚拟主机”)配置的例子。请注意,它使用了稍后在vars/main.yml文件中定义的一些变量。
    我们的示例中的Nginx配置文件位于templates/serversforhackers.com.conf.j2:

    server {
        # Enforce the use of HTTPS
        listen 80 default_server;
        server_name {{ domain }};
        return 301 https://$server_name$request_uri;
    }
    
    server {
        listen 443 ssl default_server;
    
        root /var/www/{{ domain }}/public;
        index index.html index.htm index.php;
    
        access_log /var/log/nginx/{{ domain }}.log;
        error_log  /var/log/nginx/{{ domain }}-error.log error;
    
        server_name {{ domain }};
    
        charset utf-8;
    
        include h5bp/basic.conf;
    
        ssl_certificate           {{ ssl_crt }};
        ssl_certificate_key       {{ ssl_key }};
        include h5bp/directive-only/ssl.conf;
    
        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        location = /favicon.ico { log_not_found off; access_log off; }
        location = /robots.txt  { log_not_found off; access_log off; }
    
        location ~ \.php$ {
            include snippets/fastcgi.conf;
            fastcgi_pass unix:/var/run/php7.1-fpm.sock;
        }
    }

    这是一个相当标准的用于PHP应用程序的Nginx配置。这里有三个变量:


    ssl_crt
    ssl_key
    这三个变量将在变量部分(vars)中定义。

    2.4.6 变量(vars)

    在使用任务集成所有事情之前,让我们来看看变量。该vars目录包含一个main.yml文件(如handlers和meta目录一样),在main.yml中我们可以列出将要使用的所有变量。
    以下是该vars/main.yml文件的内容:

    ---
    domain: serversforhackers.com
    ssl_key: /etc/ssl/sfh/sfh.key
    ssl_crt: /etc/ssl/sfh/sfh.crt

    我们可以在这个角色的其他地方使用这三个变量。我们在上面的模板中看到它们的使用,但是我们也可以在我们定义的任务中看到它们。

    Note:如果您有敏感信息添加到变量文件中,则可以使用ansible-vault加密文件,下面将对此进行说明。

    2.4.7 任务(tasks)

    终于到了将一切都是放在一系列的任务中的时候了。
    使用角色时运行的主文件是tasks/main.yml文件。看看我们的用例将会是什么样的:

    ---
    - name: Add Nginx Repository
      apt_repository:
        repo: ppa:nginx/stable
        state: present
    
    - name: Install Nginx
      apt:
        pkg: nginx
        state: installed
        update_cache: true
      notify:
        - Start Nginx
    
    - name: Add H5BP Config
      copy:
        src: h5bp
        dest: /etc/nginx
        owner: root
        group: root
    
    - name: Disable Default Site Configuration
      file:
        dest: /etc/nginx/sites-enabled/default
        state: absent
    
    # `dest` in quotes as a variable is used!
    - name: Add SFH Site Config
      register: sfhconfig
      template:
        src: serversforhackers.com.j2
        dest: '/etc/nginx/sites-available/{{ domain }}.conf' 
        owner: root
        group: root
    
    # `src`/`dest` in quotes as a variable is used!
    - name: Enable SFH Site Config
      file:
        src: '/etc/nginx/sites-available/{{ domain }}.conf'
        dest: '/etc/nginx/sites-enabled/{{ domain }}.conf'
        state: link
    
    # `dest` in quotes as a variable is used!
    - name: Create Web root
      file:
        dest: '/var/www/{{ domain }}/public'
        mode: 775
        state: directory
        owner: www-data
        group: www-data
      notify:
        - Reload Nginx
    
    # `dest` in quotes as a variable is used!
    - name: Web Root Permissions
      file:
       dest: '/var/www/{{ domain }}'
       mode: 775
       state: directory
       owner: www-data
       group: www-data
       recurse: yes
      notify:
        - Reload Nginx

    这一系列任务使得Nginx能被完整的安装。任务按照出现的顺序完成以下工作:

    1 添加nginx / stable库
    2 安装并启动Nginx
    3 添加H5BP配置文件
    4 从sites-enabled目录中删除文件的符号链接来禁用默认的Nginx配置
    5 将serversforhackers.com.conf.j2虚拟主机模板复制到Nginx配置中,渲染模板
    6 通过将其符号链接到sites-enabled目录来启用Nginx服务器配置
    7 创建Web根目录
    8 更改项目根目录的权限(递归),该目录位于之前创建的Web根目录之上

    有一些新的模块(和一些我们已经涵盖的新用途),包括复制,模板和文件模块。通过设置每个模块的参数,我们可以做一些有趣的事情,例如确保文件“不存在”(如果存在则删除它们)的state: absent,或者通过创建一个文件作为符号链接的state: link。您应该检查每个模块的文档,以查看可以用它们完成哪些有趣和有用的事情。

    2.4.8 运行角色(Running the Role)

    要对服务器运行一个或多个角色,我们将重新使用另一个playbook。该playbook与roles目录位于同一个目录中,同一层级。当我们用ansible-playbook命令运行的时候需要先cd进入到该目录中。
    让我们创建一个“主”的yaml文件(被ansible-playbook命令执行的文件),该文件定义要使用的角色以及运行它们的主机:
    文件~/ansible-example/server.yml位于与roles目录相同的目录中:

    ---
    # run locally here, yadda yadda yadda
    - hosts: local
      connection: local
      roles:
        - nginx

    所以,我们只是定义角色,而不是在本Playbook文件中定义所有的变量和任务。角色负责具体细节。

    然后我们可以运行角色:

    ansible-playbook -i ./hosts server.yml

    以下是运行Nginx角色的Playbook文件的输出:

    PLAY [all] ********************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [127.0.0.1]
    
    TASK: [nginx | Add Nginx Repository] ******************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Install Nginx] *************************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Add H5BP Config] ***********************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Disable Default Site] ******************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Add SFH Site Config] *******************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Enable SFH Site Config] ****************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Create Web root] ***********************************************
    changed: [127.0.0.1]
    
    TASK: [nginx | Web Root Permissions] ******************************************
    ok: [127.0.0.1]
    
    NOTIFIED: [nginx | Start Nginx] ***********************************************
    ok: [127.0.0.1]
    
    NOTIFIED: [nginx | Reload Nginx] **********************************************
    changed: [127.0.0.1]
    
    PLAY RECAP ********************************************************************
    127.0.0.1                  : ok=8   changed=7   unreachable=0    failed=0

    我们将所有各种组件放在一起,形成一致的角色,现在已经安装并配置了Nginx!

    2.5 事实(Facts)

    请注意,运行剧本时的第一行总是“收集事实”。
    在运行任何任务之前,Ansible将收集有关其配置的系统的信息。这些被称为事实,并且包括广泛的系统信息,如CPU核心数量,可用的ipv4和ipv6网络,挂载的磁盘,Linux发行版等等。

    事实在“任务”或“模板”配置中通常很有用。例如,Nginx通常设置为使用与CPU内核一样多的工作处理器。知道这一点,您可以选择如下设置nginx.conf.j2文件的模板:

    user www-data;
    worker_processes {{ ansible_processor_cores }};
    pid /var/run/nginx.pid;
    
    # And other configurations...

    或者如果你具有多个CPU的服务器,则可以使用:

    user www-data;
    worker_processes {{ ansible_processor_cores * ansible_processor_count }};
    pid /var/run/nginx.pid;
    
    # And other configurations...

    所有的ansible facts全局变量都是以“anisble_”为前缀,并且可以在其他任何地方使用。
    尝试对你的本地机器运行以下内容以查看可用的事实:

    # Run against a local server
    # Note that we say to use "localhost" instead of defining a hosts file here!
    ansible -m setup --connection=local localhost
    
    # Run against a remote server
    ansible -i ./hosts remote -m setup

    2.6 加密(Vault)

    我们经常需要将敏感数据存储在我们的模板,文件或变量文件中; 这样安全性有一定要求的情况是不可避免的(当我们将这些敏感数据文件推送到远程Git仓库时,这是一个痛苦的事情)。Ansible有一个叫做Ansible Vault的解决方案。
    Vault允许您加密任何Yaml文件,通常将其作用与变量文件,Vault不会加密文件和模板,只能使用Yaml文件。
    在创建加密文件时,系统会询问您必须使用的密码,以便稍后在调用角色或Playbook时进行编辑。
    将密码保存在安全的地方。

    例如我们可以创建一个新的变量文件:

    ansible-vault create vars/main.yml
    Vault Password:

    输入加密密码后,该文件将在您的默认编辑器(通常是Vim或Nano)中打开。
    默认使用的编辑器由EDITOR环境变量定义。默认值通常是Vim。如果您不是Vim用户,可以通过设置环境变量来快速更改:

    EDITOR=nano ansible-vault edit vars/main.yml

    在大多数情况下,我们将使用ansible-vault create|edit /path/to/file.yml。更多可用的命令如下:

    create - 创建一个新文件并进行加密
    decrypt - 从加密文件创建明文文件
    edit - 编辑已经存在的加密文件
    encrypt - 加密现有的纯文本文件
    rekey - 在加密文件中设置新密码

    如果你有一个现有的配置文件要加密,请使用 ansible-vault encrypt /path/to/file.yml。

    示例: users角色

    我们创建一个名为“users”的角色:

    cd ~/ansible-example/roles
    ansible-galaxy init users

    创建新用户并设置密码时,我使用Vault 。在用户角色中,您可以设置带有用户密码和公钥的变量文件,以添加到用户的authorized_keys文件(从而提供SSH访问权限)。公共SSH密钥在技术上是安全的,一般公众可以看到 - 所有人都可以使用它来允许你访问自己的服务器。在没有配对私钥的情况下,公钥是不能获得系统访问权限的,我们没有将密钥加入此角色。
    以下是可以使用Vault创建和加密的示例变量文件。在编辑它时,它是纯文本。

    ~/ansible-example/roles/users/vars/main.yml:

    admin_password: $6$lpQ1DqjZQ25gq9YW$mHZAmGhFpPVVv0JCYUFaDovu8u5EqvQi.Ih
    deploy_password: $6$edOqVumZrYW9$d5zj1Ok/G80DrnckixhkQDpXl0fACDfNx2EHnC
    common_public_key: ssh-rsa ALongSSHPublicKeyHere

    请注意,用户的密码也是散列的。您可以阅读Ansible有关生成加密密码的文档,用户模块需要设置用户密码。作为一个快速入门,它在Ubuntu上看起来像这样:

    # The whois package makes the mkpasswd
    # command available on Ubuntu
    $ sudo apt-get install -y whois
    
    # Create a password hash
    $ mkpasswd --method=SHA-512
    Password:

    这将生成一个散列密码供你与user模块一起使用。

    Note:变量文件中的密码是散列的,但我仍然喜欢加密包含散列密码的yaml文件。这些文件通常包含未标记的数据,如API令牌或SSH私钥,使加密非常重要。

    一旦你设置了用户密码并将公钥添加到变量文件中,我们就可以加密此文件,然后在任务中使用这些加密变量。

    ansible-vault encrypt roles/users/vars/main.yml

    然后我们可以编辑我们的任务文件,使用(加密)变量添加新用户:

    这是文件~/ansible-example/roles/users/tasks/main.yml:

    ---
    - name: Create Admin User
      user:
        name: admin
        password: '{{ admin_password }}'
        groups: sudo
        append: yes
        shell: /bin/bash
    
    - name: Add Admin Authorized Key
      authorized_key:
        user: admin
        key: '{{ common_public_key }}'
        state: present
    
    - name: Create Deploy User
      user:
        name: deploy
        password: '{{ deploy_password }}'
        groups: www-data
        append: yes
        shell: /bin/bash
    
    - name: Add Deployer Authorized Key
      authorized_key:
        user: deploy
        key: '{{ common_public_key }}'
        state: present

    这些任务使用该user模块来创建新用户,传递变量文件中设置的密码。
    它还使用该authorized_key模块将SSH公钥作为SSH授权密钥添加到每个用户的服务器中。
    加密变量的使用像在常规任务文件中使用一样。但是,为了运行此角色,我们需要告诉Ansible请求输入vault密码,以便它可以解密变量。
    编辑我们的server.ymlPlaybook文件,调用user角色:

    ---
    # Local connection here, yadda yadda yadda
    - hosts: local
      connection: local
      sudo: yes
      roles:
        - nginx
        - user

    要运行此Playbook,我们需要告知Ansible请求vault的密码,因为我们正在运行包含加密文件的角色:

    ansible-playbook --ask-vault-pass -i ./hosts server.yml

    3 总结

    本篇文章带着做了如下工作:

    1. 安装了ansible
    2. 配置了ansible inventory文件(仅在不使用connection: local 时才需要)
    3. 同时在多个服务器上执行幂等的 ad-hoc命令
    4. 创建一个基本的Playbook来运行多个任务(tasks),并使用了处理程序(handlers)
    5. 将多个任务抽象为一个角色,以保持所有Nginx相关的操作在一个角色内
      • 展示了如何设置依赖关系
      • 展示了如何注册任务的“依赖”执行关系,当一个任务执行成功后再执行另一个任务
      • 展示了如何在我们的任务中使用更多的模板,文件和变量
    6. 展示了如何整合使用ansible事实(facts)
    7. 展示了如何使用ansible的vault来增加我们的变量的安全性

    参考: https://serversforhackers.com/c/an-ansible2-tutorial

    展开全文
  • Ansible 运维自动化 ( 配置管理工具 )

    万次阅读 2018-06-20 14:14:49
    简介:(参见连接https://www.cnblogs.com/wangxiaoqiangs/p/5685239.html) 当下有... Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobble...

    简介:(参见连接https://www.cnblogs.com/wangxiaoqiangs/p/5685239.html)

    当下有许多的运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。

    Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。

    Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。

    Ansible 特点:

    >> 部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
    >> 默认使用 SSH(Secure Shell)协议对设备进行管理。
    >> 主从集中化管理。
    >> 配置简单、功能强大、扩展性强。
    >> 支持 API 及自定义模块,可通过 Python 轻松扩展。
    >> 通过 Playbooks 来定制强大的配置、状态管理。
    >> 对云计算平台、大数据都有很好的支持。
    >> 提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 ---- AWX 平台。

    Ansible 与 SaltStack

    >> 最大的区别是 Ansible 无需在被监控主机部署任何客户端代理,默认通过 SSH 通道进行远程命令执行或下发配置。
    >> 相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML 格式来描述配置,两者都提供丰富的模板及 API,对云计算平台、大数据都有很好的支持。

    一、安装 Ansible

    shell > yum -y install ansible

    二、配置 Ansible

    shell > ls /etc/ansible   # ansible.cfg 是 Ansible 工具的配置文件;hosts 用来配置被管理的机器;roles 是一个目录,playbook 将使用它
    ansible.cfg hosts roles

    1、Ansible 管理机与被管理机做秘钥认证

    复制代码
    shell > ssh-keygen        # 生成秘钥
    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 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:
    ea:11:72:ea:d2:d1:fa:1c:e0:df:4f:b0:98:31:be:fe root@localhost.localdomain
    The key's randomart image is:
    +--[ RSA 2048]----+
    | |
    | |
    | |
    | |
    | o.= S |
    | ..*.B o |
    | .ooB . . |
    | ..o+ = . |
    | ..oB.E.. |
    +-----------------+
    
    shell > ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 22 root@192.168.12.129"     # 将公钥写入被管理机
    The authenticity of host '192.168.12.129 (192.168.12.129)' can't be established.
    RSA key fingerprint is f0:9e:01:73:a4:bf:14:10:ac:46:a9:48:cd:c5:d8:1c.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.12.129' (RSA) to the list of known hosts.
    root@192.168.12.129's password: 
    Now try logging into the machine, with "ssh '-p 22 root@192.168.12.129'", and check in:
    
    .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    复制代码

    2、hosts 文件添加被管理机

    shell > > /etc/ansible/hosts
    shell > vim /etc/ansible/hosts
    
    [Client]
    
    192.168.12.129

    三、测试 Ansible

    复制代码
    shell > ansible Client -m ping     # 操作 Client 组 ( all 为操作 hosts 文件中所有主机 ),-m 指定执行 ping 模块,下面是返回结果
    192.168.12.129 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
    }
    
    # -i          指定 hosts 文件位置
    # -u username 指定 SSH 连接的用户名
    # -k          指定远程用户密码
    # -f          指定并发数
    # -s          如需要 root 权限执行时使用 ( 连接用户不是 root 时 )
    # -K          -s 时,-K 输入 root 密码
    复制代码

    四、附加

    1、/etc/ansible/hosts 文件

    ## Ansible 定义主机、组规则的配置文件

    复制代码
    shell > vim /etc/ansible/hosts
    
    www.abc.com     # 定义域名
    
    192.168.1.100   # 定义 IP
    
    192.168.1.150:37268   # 指定端口号
    
    [WebServer]           # 定义分组
    
    192.168.1.10
    192.168.1.20
    192.168.1.30
    
    [DBServer]            # 定义多个分组
    
    192.168.1.50
    192.168.1.60
    
    Monitor ansible_ssh_port=12378 ansible_ssh_host=192.168.1.200   # 定义别名
    
    # ansible_ssh_host 连接目标主机的地址
    
    # ansible_ssh_port 连接目标主机的端口,默认 22 时无需指定
    
    # ansible_ssh_user 连接目标主机默认用户
    
    # ansible_ssh_pass 连接目标主机默认用户密码
    
    # ansible_ssh_connection 目标主机连接类型,可以是 local 、ssh 或 paramiko
    
    # ansible_ssh_private_key_file 连接目标主机的 ssh 私钥
    
    # ansible_*_interpreter 指定采用非 Python 的其他脚本语言,如 Ruby 、Perl 或其他类似 ansible_python_interpreter 解释器
    
    [webservers]         # 主机名支持正则描述
    
    www[01:50].example.com
    
    [dbservers]
    
    db-[a:f].example.com
    复制代码

    2、Ansible 常用模块学习

    shell > ansible-doc -l # 列出 Ansible 支持的模块 shell > ansible-doc ping # 查看该模块帮助信息
    例如: ansible-doc yum 查看yum模块
    ansible-doc user 用户管理模块

    >> 远程命令模块( command / script / shell )

    command 作为 Ansible 的默认模块,可以运行远程权限范围所有的 shell 命令,不支持管道符。

    例:

    shell > ansible Client -m command -a "free -m"               # 查看 Client 分组主机内存使用情况

    script 的功能是在远程主机执行主控端存储的 shell 脚本文件,相当于 scp + shell 组合。

    例:

    shell > ansible Client -m script -a "/home/test.sh 12 34"    # 远程执行本地脚本

    shell 的功能是执行远程主机上的 shell 脚本文件,支持管道符。

    例:

    shell > ansible Client -m shell -a "/home/test.sh"           # 执行远程脚本

    >> copy 模块(实现主控端向目标主机拷贝文件,类似于 scp 功能)

    例:

    shell > ansible Client -m copy -a "src=/home/test.sh desc=/tmp/ owner=root group=root mode=0755"   # 向 Client 组中主机拷贝 test.sh 到 /tmp 下,属主、组为 root ,权限为 0755

    >> stat 模块(获取远程文件状态信息,atime/ctime/mtime/md5/uid/gid 等信息)

    例:

    shell > ansible Client -m stat -a "path=/etc/syctl.conf"

    >> get_url 模块(实现在远程主机下载指定 URL 到本地,支持 sha256sum 文件校验)

    例:

    shell > ansible Client -m get_utl -a "url=http://www.baidu.com dest=/tmp/index.html mode=0440 force=yes"

    >> yum 模块(软件包管理)

    例:

    shell > ansible Client -m yum -a "name=curl state=latest"

    >> cron 模块(远程主机 crontab 配置)

    例:

    shell > ansible Client -m cron -a "name='check dirs' hour='5,2' job='ls -alh > /dev/null'"

    效果:

    #Ansible: check dirs
    * 5,2 * * * ls -alh > /dev/null

    >> mount 模块(远程主机分区挂载)

    例:

    shell > ansible Client -m mount -a "name=/mnt/data src=/dev/sd0 fstype=ext4 opts=ro state=present"

    >> service 模块(远程主机系统服务管理)

    例:

    shell > ansible Client -m service -a "name=nginx state=stoped"
    shell > ansible Client -m service -a "name=nginx state=restarted"
    shell > ansible Client -m service -a "name=nginx state=reloaded"

    >> user 服务模块(远程主机用户管理)

    例:

    shell > ansible Client -m user -a "name=wang comment='user wang'"
    
    shell > ansible Client -m user -a "name=wang state=absent remove=yes"    # 添加删除用户

    五、Ansible-playbook

    # 使用 Ansible-playbook 可以完成一组复杂的动作,例如部署环境、搭建服务、修改配置等。

    展开全文
  • 课程详细演示了Ansible从基本使用到高级实战,实战篇详解Zabbix API接口批量 教学环境:CentOS, MacOS, Ansible, vim 课程内容:Ansible安装配置、Ansible功能演示及详解、Playbook: Template\Vars\Handlers\...
  • django项目实战:开发一种ansible web管理工具
  • Ansible自动化运维工具

    2019-08-16 09:09:23
    Ansible核心参数 Modules :包括ansible自带核心模块及自定义模块 Plugins :完成模块功能补充,包括连接插件、邮件等 Playbooks :剧本,定义ansible多任务配置文件,由ansible自动执行 Inventory :定义ansible...

    Ansible核心参数

    Modules :包括ansible自带核心模块及自定义模块
    Plugins :完成模块功能补充,包括连接插件、邮件等
    Playbooks :剧本,定义ansible多任务配置文件,由ansible自动执行
    Inventory :定义ansible管理主机清单
    在这里插入图片描述
    安装ansible
    yum install wget -y
    wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    yum install epel-release-latest-7.noarch.rpm -y
    yum --disablerepo="*" --enablerepo=“epel” list available
    yum install ansible -y

    ansible --version 查看ansible版本

    Ansible命令使用语法
    ansible [-i主机清单文件] [-f批次] [组名] [-m模块名称] [-a模块参数]
    Ansible详细参数
    -v, -verbose # 详细模式,如果命令执行成功,输出详细结果(-vv;-vvv;-vvvv)v越多代表越详细
    -i PATH, -inventory=PATH # 指定host文件路径,默认是在/etc/ansible/hosts inventory清单
    -f NUM, -forks=NUM # NUM是指定一个整数,默认为5,指定fork开启同步进程个数
    -m NAME, -module-name=NAME # 指定使用的module名称,默认使用command模块
    -a, MODULE_ARGS # 指定module模块参数
    -k, -ask-pass #提示输入ssh密码
    -sudo #指定使用sudo获取root权限
    -K, -ask-sudo-pass #提示输入sudo密码,可与sudo一起使用
    -u USERNAME, -user=USERNAME #指定移动端执行用户
    -C, -check #测试此命令执行情况

    ansibl-doc 命令详细参数:
    ansible-doc -l #列出所有的模块列表
    ansible-doc -s 模块名 #查看指定模块参数 -s, --snippet

    例: ansible-doc -s service

    cd /etc/ansible/
    [root@server2 ansible]# ls
    ansible.cfg(主配置文件) hosts(主机清单) roles(决策)

    定义主机清单
    1、基于端口、用户、密码定义主机清单
    ansible 基于ssh连接 -i(inventory)参数后指定远程主机时,也可以写端口、用户、密码。
    使用格式: ansible_ssh_port:指定ssh端口
    ansible_ssh_user:指定ssh用户
    ansible_ssh_pass:指定ssh用户登录认证密码
    ansible_sudo_pass:指明sudo密码

    vim hosts 在最后添加
    [web-servers] #定义组名称
    定义单个IP
    192.168.1.52 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
    定义多个IP(50至53)
    192.168.1.[51:53] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
    例如:

    ansible -i /etc/ansible/hosts web-servers -m ping
    -i	指定host文件路径
    -m	指定ping模块
    

    在这里插入图片描述
    出现报错,这里是因为ssh第一次连接需要认证,手动ssh连接后再次测试
    ssh 192.168.1.52
    在这里插入图片描述
    再次测试发现已经成功单还有明显报错这里明显可以看出hosts文件中有多余的字母删除即可
    在这里插入图片描述
    SUCCESS 表示成功
    False 因为ping命令不能改变目标服务器服务状态返回为false

    基于ssh密钥访问定义主机清单
    一般来说明文密码安全程度不够,增加主机无密码访问
    在ansible服务器中生成密钥并发送公钥至需管理节点
    ssh-keygen #生成密钥直接回车
    [root@server2 ansible]# cd /root/.ssh/
    [root@server2 .ssh]# ls
    id_rsa(私钥) id_rsa.pub(公钥) known_hosts
    ssh-copy-id root@192.168.1.52
    ssh-copy-id root@192.168.1.53
    ssh-copy-id root@192.168.1.51
    配置完成并测试成功
    [root@server2 .ssh]# ssh root@192.168.1.52
    Last login: Tue Apr 23 11:28:18 2019 from 192.168.1.51
    [root@server2 .ssh]# ssh root@192.168.1.53
    Last login: Tue Apr 23 11:28:18 2019 from 192.168.1.51

    修改ansible中清单配置
    cd /etc/ansible/
    vim hosts
    [web-servers]
    #192.168.1.52 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
    192.168.1.52
    192.168.1.51
    192.168.1.53
    测试
    ansible -i /etc/ansible/hosts ‘web-servers’ -m ping在这里插入图片描述
    输入命令查看磁盘空间

    ansible -m command -a 'df -h' web-servers
    -m command		#-m	后添加模块
    -a	后加命令
    

    在这里插入图片描述
    测试添加用户

    ansible -m command -a 'useradd li' web-servers		#添加用户li
    ansible -m command -a 'id li' web-servers			#查看li用户ID
    

    在这里插入图片描述
    command模块是ansible默认模块,不能使用"<",">","|","&"等操作.

    shell 模块
    使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的命令可以使用.
    Shell模块1 :如执行命令少则可直接执行
    例如 :运行free -m命令过滤Mem所对应参数

    ansible -i /etc/ansible/hosts web-servers -m shell -a 'source ~/.bash_profile && free -m | grep Mem'
    

    在这里插入图片描述
    IP及目录
    Shell模块2 :如执行命令较多则可书写为脚本通过script模块来执行
    例如 :执行同时查询系统时间及IP

    vim /root/a.sh
    #!/bin/bash
    date
    ip addr | grep 192 | awk  '{ print $2}' | awk -F '/' '{print $1}'
    
    利用ansible执行
    ansible -i /etc/ansible/hosts web-servers -m script -a '/root/a.sh'
    执行完成可以看到明显的时间及IP
    

    在这里插入图片描述

    copy模块	:实现主控端向目标端口copy文件,类似SCP功能
    例如	:拷贝/etc/hosts文件至 /tmp/下并设置所属人所属组及文件权限大小
    ansible -i /etc/ansible/hosts web-servers -m copy -a 'src=/etc/hosts dest=/tmp/ owner=root group=root mode=0755'
    src	#表示拷贝地址
    dest		#表示目标地址
    owner	#表示所属人
    group	#表示所属组
    mode	#表示权限大小
    

    在这里插入图片描述
    删除

    ansible -i /etc/ansible/hosts web-servers -m command -a 'rm -fr /tmp/hosts'
    

    在这里插入图片描述

    File	模块	:设置文件属性
    
    例如	:修改目标端口/tmp/hosts	文件权限为444及所属人为li用户
    
    ansible web-servers -m file -a 'path=/tmp/hosts mode=444 owner=li'
    

    在这里插入图片描述
    在这里插入图片描述

    Stat	模块	:显示文件信息
    例如	:显示目标端/tmp/hosts文件信息
    
    ansible web-servers -m stat -a 'path=/tmp/hosts'
    
    get_url模块		:实现目标端下载指定url至本地,支持sha256sum文件校验
    
    ansible web-servers -m get_url -a 'url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp force=yes'
    

    这里force=yes
    如果force=yes,当下载文件时,如果所下载的内容和原目录下的文件内容不同,则替换原文件,如果一样就不用下载
    如果force=no,当下载文件时,则只下载不存在的文件.
    在这里插入图片描述
    执行成功且发生改变颜色为黄色
    在这里插入图片描述
    这里因为之前下载过所以为false
    在这里插入图片描述
    执行成功未发生改变颜色为绿色

    Yum模块 :可以提供status状态,
    Status五种状态 :latest、present、installed 代表安装
    :removed、absent 表示卸载
    例如 :安装httpd服务

    ansible web-servers -m yum -a 'name=httpd state=installed'
    

    在这里插入图片描述
    在这里插入图片描述
    这里因为yum源问题配置yum源再次安装
    在这里插入图片描述

    成功并启动服务查看状态
    ansible web-servers -m command -a 'systemctl start httpd'
    ansible web-servers -m command -a 'systemctl status httpd'
    

    在这里插入图片描述

    cron	模块	:目标端crontab配置
    例如	:增加每40分钟执行date
    ansible web-servers -m cron -a "name='date' minute='*/40' job='date'"
    
    name 	#名称
    minute	#执行时间
    Job		#执行命令
    

    在这里插入图片描述

    Service	模块	:指定目标端需要操作的服务如nginx、httpd等
    state有五种状态	started、stopped、restarted、reloaded、enabled
    例如	:启动httpd服务
    ansible web-servers -m service -a 'name=httpd state=started'
    

    在这里插入图片描述在这里插入图片描述

    查看80端口
    ansible -i /etc/ansible/hosts web-servers -m shell -a 'source ~/.bash_profile && netstat -antlp | grep 80'
    

    在这里插入图片描述

    这里报错明显没有命令需安装
    ansible web-servers -m yum -a 'name=net-tools state=installed'
    再次执行
    ansible -i /etc/ansible/hosts web-servers -m shell -a 'source ~/.bash_profile && netstat -antlp | grep 80'
    

    在这里插入图片描述

    Sysctl模块	:指定目标端sysctl配置
    例如	:开启路由转发机制
    ansible web-servers -m sysctl -a 'name=net.ipv4.ip_forward value=1 reload=yes'
    

    在这里插入图片描述
    在这里插入图片描述

    User 模块	:目标端用户管理
    例如	:添加xiao用户
    ansible web-servers -m user -a 'name=xiao state=present'
    ansible web-servers -m command -a 'id xiao'
    

    在这里插入图片描述
    Ansible-Palybook
    Palybook 是一个不同于使用ansible命令执行方式的模块,功能更加强大.
    Palybook 使用方式
    1、在playbook中定义任务
    -name:task description #任务描述信息
    Module_name:module_args #需要使用的模块名称 : 模块参数
    2、ansible-playbook 执行命令
    playbook 是由一个或多个’play’组成的列表.play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色
    github 上提供大量实例 https://github.com/ansible/ansible-examples

    playbook 常用文件夹作用

    files:存放需要同步到异地服务器的源码文件及配置文件
    handlers:当服务的配置文件发生变化时需要进行的操作,比如:重启服务,重新加载配置
    meta:角色定义,可留空
    tasks:lamp安装过程需要进行的执行任务
    templates:用于执行安装任务时的模块文件,一般为脚本
    vars:本次安装定义的变量

    批量安装lamp

    安装httpd服务
    yum install httpd -y
    systemctl start httpd
    安装mysql服务
    yum install mariadb-server -y
    mkdir -p /mydata/data
    chown -R mysql:mysql /mydata/
    vim /etc/my.cnf	#修改第二行
    datadir=/mydata/data
    systemctl start mariadb
    安装php服务
    yum install php php-mysql -y
    vim /var/www/html/index.php
    <?php
    	phpinfo();
    ?>
    systemctl restart httpd
    

    在页面测试
    在这里插入图片描述

    添加目标主机
    vim /etc/ansible/hosts
    [web-servers]
    192.168.1.52
    192.168.1.53
    配置ssh免密登录
    ssh-keygen
    ssh-copy-id root@192.168.1.52
    ssh-copy-id root@192.168.1.53
    创建安装路径目录
    mkdir -pv /etc/ansible/lamp/roles/{prepare,httpd,mysql,php}/
    {tasks,files,templates,vars,meta,default,handlers}
    cd /etc/ansible/lamp/roles
    

    在这里插入图片描述

    使用playbook	创建lamp环境
    并拷贝安装的主配置文件
    cp /etc/httpd/conf/httpd.conf /etc/ansible/lamp/roles/httpd/files/
    cp /etc/my.cnf /etc/ansible/lamp/roles/mysql/files/
    书写配置yum脚本
    vim /etc/ansible/lamp/roles/prepare/tasks/main.yml
    - name:  delete yum
      shell:  rm -fr /etc/yum.repos.d/*
    - name:  provide yum file
      shell:  echo [yum] > /etc/yum.repos.d/yum.repo
    - name:  provide yum name
      shell:  echo name=yum >> /etc/yum.repos.d/yum.repo
    - name:  provide yum route
      shell:  echo baseurl=file:///mnt >> /etc/yum.repos.d/yum.repo
    - name:  provide yum gpg
      shell:  echo gpgcheck=0 >> /etc/yum.repos.d/yum.repo
    - name:  clean yum
      shell:  yum clean all
    

    -name #杠空格name冒号后两个空格

    name #自定义名称
    shell #使用shell模块

    拷贝index.php
    cp /var/www/html/index.php /etc/ansible/lamp/roles/httpd/files/
    
    构建httpd任务
    vim /etc/ansible/lamp/roles/httpd/tasks/main.yml
    - name: web server install
      yum:  name=httpd state=present
    - name:  provide test page
      copy:  src=index.php dest=/var/www/html
    - name:  provide configuration file
      copy:  src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:  restart httpd
    

    copy #使用copy模块
    notify #当copy模块命令执行成功后,notify通知名字为restart httpd的handlers运行
    notify与调用handlers必须同时进行,在handlers中name必须与notify模块命令一致

    配置handlers模块
    vim /etc/ansible/lamp/roles/httpd/handlers/main.yml
    - name: restart httpd
      shell:  systemctl restart httpd
    - name: restart httpd
      shell:  systemctl enable httpd
    配置mysql安装
    vim /etc/ansible/lamp/roles/mysql/tasks/main.yml
    - name:  install mysql
      yum:  name=mariadb-server state=installed
    - name:  mkdir data directory
      shell:  mkdir -p /mydata/data
    - name:  provide configration file
      copy:  src=my.cnf dest=/etc/my.cnf
    - name:  chage the owner
      shell:  chown -R mysql:mysql /mydata/
    - name:  start mariadb
      service:  name=mariadb enabled=yes  state=started
    配置php安装
    vim /etc/ansible/lamp/roles/php/tasks/main.yml
    - name:  php install
      yum:  name=php state=installed
    - name:  install php-mysql
      yum:  name=php-mysql state=installed
    
    使httpd、mysql、php、yum安装连接起来
    vim /etc/ansible/lamp/roles/lamp.yml		#名称随意已yml为后缀
    - name:  LAMP build
      remote_user:  root
      hosts:  web-servers
      roles:
       -  prepare
       -  mysql
       -  php
       -  httpd
    

    roles使用 :roles下跟3个空格加横杆后两个空格
    检测是否正常可安装

    ansible-playbook -C /etc/ansible/lamp/roles/lamp.yml
    

    在这里插入图片描述
    执行安装

    ansible-playbook -i /etc/ansible/hosts /etc/ansible/lamp/roles/lamp.yml
    

    在这里插入图片描述
    安装成功测试
    这里因copy模块没执行成功没有触发notify所以手动执行

    ansible web-servers -m command -a 'systemctl restart httpd'
    

    在这里插入图片描述
    测试
    在这里插入图片描述
    在这里插入图片描述
    ###这里可以修改httpd安装模块之间使用shell模块安装,因安装完成copy模块未执行所有notify模块也不能执行.

    - name: web server install
      yum:  name=httpd state=present
    - name:  provide test page
      copy:  src=index.php dest=/var/www/html
    - name:  delete httpd
      shell:  rm -fr /etc/httpd/conf/httpd.conf
    - name:  provide configuration file
      copy:  src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:  restart httpd
    

    host配置文件
    如需安装多台
    [web-servers]
    192.168.1.52
    192.168.1.53
    192.168.1…100 #IP1-100执行
    ansible因默认通过ssh连接
    在这里插入图片描述
    这里取消ssh检查

    vim /etc/ansible/ansible.cfg 
    host_key_checking = False
    

    在这里插入图片描述
    配置httpd80端口修改为8080端口

    mkdir -pv /etc/ansible/httpd/roles/httpd/
    {tasks,files,templates,vars,meta,default,handlers}
    cp /etc/httpd/conf/httpd.conf /etc/ansible/httpd/roles/httpd/files/
    vim /etc/ansible/httpd/roles/httpd/files/httpd.conf
    

    修改为listen 8080
    配置tasks

    vim /etc/ansible/httpd/roles/httpd/tasks/main.yml
    - name:  delete httpd
      shell:  rm -fr /etc/httpd/conf/httpd.conf
    - name:  update httpd
      copy:  src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:  restart httpd
    

    因notify模块配置handlers模块

    vim /etc/ansible/httpd/roles/httpd/handlers/main.yml
    - name:  restart httpd
      service:  name=httpd enabled=yes state=restarted
    

    连接http至ansible-playbook

    vim /etc/ansible/httpd/roles/http.yml
    - name:  update httpd
      remote_user:  root
      hosts:  httpd-servers
      roles:
    -  httpd
    修改hosts文件
    vim /etc/ansible/hosts
    [httpd-servers]
    192.168.1.52
    

    测试运行是否正确

    ansible-playbook -C /etc/ansible/httpd/roles/http.yml
    

    在这里插入图片描述
    测试完成推送

    ansible-playbook -i /etc/ansible/hosts /etc/ansible/httpd/roles/http.yml
    

    在这里插入图片描述
    查看192.168.1.52
    在这里插入图片描述
    源码编译nginx
    首先可以先进行测试源码编译安装服务时需要安装哪些包及修改哪些配置

    首先优化一些参数
    1、修改nginx版本号,删除nginx后参数

    vim /root/nginx-1.14.0/src/core/nginx.h
    

    在这里插入图片描述
    2、gcc参数优化

    vim /root/nginx-1.14.0/auto/cc/gcc
    

    在这里插入图片描述
    准备利用ansible安装nginx
    创建目录文件
    在这里插入图片描述
    创建ansible安装nginx配置目录

    mkdir -p /etc/ansible/nginx/roles/nginx/{default,files,handlers,meta,tasks,templates,vars}
    

    拷贝nginx源码包至files文件中

    cp /root/nginx-1.14.0.tar.gz /etc/ansible/nginx/roles/nginx/
    

    配置tasks文件

    vim /etc/ansible/nginx/roles/nginx/tasks/main.yml
    - name:  copy nginx package
      copy:  src=nginx-1.14.0.tar.gz dest=/tmp/nginx-1.14.0.tar.gz
    - name:  tar nginx
      shell:  cd /tmp;tar zxf nginx-1.14.0.tar.gz
    - name:  delete nginx.h
      shell:  mv /tmp/nginx-1.14.0/src/core/nginx.h /tmp/nginx-1.14.0/src/core/nginx.h.bak
    - name:  delete gcc
      shell:  mv /tmp/nginx-1.14.0/auto/cc/gcc /tmp/nginx-1.14.0/auto/cc/gcc.bak
    - name:  copy nginx.h
      copy:  src=nginx.h dest=/tmp/nginx-1.14.0/src/core/nginx.h
    - name:  copy gcc
      template:  src=gcc dest=/tmp/nginx-1.14.0/auto/cc/gcc
    - name:  install package
      yum:  name={{ item }} state=installed
      with_items:
        -  openssl-devel
        -  pcre-devel
        -  zlib-devel
        -  gcc
    - name:  configure
      shell:  cd /tmp/nginx-1.14.0;./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre;make && make install
    - name:  copy nginx.conf
      template:  src=nginx.conf dest=/usr/local/nginx/conf/nginx.conf
    - name:  copy shell
      copy:  src=/opt/create_user.sh dest=/tmp/create_user.sh
    - name:  create user nginx
      shell:  sh /tmp/create_user.sh
    - name:  bak index
      shell:  mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak
    - name:  copy index.html
      copy:  src=index.html dest=/usr/local/nginx/html/index.html
      notify:  start nginx service
    

    配置files模块,
    在/etc/ansible/nginx/roles/nginx/files/放置
    index.html nginx-1.14.0.tar.gz nginx.h
    配置handlers模块

    vim /etc/ansible/nginx/roles/nginx/handlers/main.yml
    - name:  start nginx service
      shell:  /usr/local/nginx/sbin/nginx
    

    配置templates模块
    在/etc/ansible/nginx/roles/nginx/templates/放置
    gcc nginx.conf
    创建nginx用户
    vim /opt/create_user.sh
    #!/bin/bash
    a=cat /etc/passwd | grep nginx > /dev/null
    if [ $? == 0 ]
    then
    echo ‘this nginx repeat’
    else
    useradd nginx
    fi
    把所有连接起来

    vim /etc/ansible/nginx/roles/nginx.yml
    - name:  update nginx
      remote_user:  root
      hosts:  nginx-servers
      roles:
    -  nginx
    

    修改hosts

    vim /etc/ansible/hosts
    [nginx-servers]
    192.168.1.52
    192.168.1.53
    

    推送测试
    ansible-playbook -C /etc/ansible/nginx/roles/nginx.yml
    在这里插入图片描述
    测试成功推送

    ansible-playbook -i /etc/ansible/hosts /etc/ansible/nginx/roles/nginx.yml
    

    在这里插入图片描述
    在这里插入图片描述
    查看nginx端口
    在这里插入图片描述
    Ansible打包rpm包供离线安装
    在本地访问外网及有ansible安装源的系统中

    mkdir /ansible
    yum reinstall ansible --downloadonly --downloaddir=/ansible
    

    [root@server2 ansible]# ls
    ansible-2.7.10-1.el7.noarch.rpm
    重新开启一台服务器
    scp ansible-2.7.10-1.el7.noarch.rpm root@192.168.1.53:
    解压rpm发现出现依赖包
    [root@server3 ansible]# rpm -ivh ansible-2.7.10-1.el7.noarch.rpm
    在这里插入图片描述
    在连接外网服务器中安装依赖包

    yum reinstall python-httplib2 python-keyczar python-paramiko python2-jmespath sshpass --downloadonly --downloaddir=/ansible
    

    拷贝安装需要的依赖至无连接网络的服务器

    scp python* sshpass-1.06-1.el7.x86_64.rpm root@192.168.1.53:/
    

    再次测试发现仍有依赖

    [root@server3 ansible]# rpm -ivh ansible-2.7.10-1.el7.noarch.rpm python* sshpass-1.06-1.el7.x86_64.rpm
    

    在这里插入图片描述
    再次安装依赖

    yum reinstall libtomcrypt libtommath --downloadonly --downloaddir=/ansible
    

    并拷贝至未连接外网服务器

    scp libtomcrypt-1.17-25.el7.x86_64.rpm root@192.168.1.53:
    scp libtommath-0.42.0-5.el7.x86_64.rpm root@192.168.1.53:
    
    [root@server3 ansible]# ls
    ansible-2.7.10-1.el7.noarch.rpm     libtommath-0.42.0-5.el7.x86_64.rpm      python2-jmespath-0.9.0-1.el7.noarch.rpm   python-keyczar-0.71c-2.el7.noarch.rpm      sshpass-1.06-1.el7.x86_64.rpm
    libtomcrypt-1.17-25.el7.x86_64.rpm  python2-crypto-2.6.1-16.el7.x86_64.rpm  python-httplib2-0.9.2-0.1.el7.noarch.rpm  python-paramiko-2.1.1-0.10.el7.noarch.rpm
    

    安装ansible安装成功
    [root@server3 ansible]# yum install * -y
    在这里插入图片描述
    测试

    vim /etc/ansible/hosts		最后添加并配置免密
    [web-servers]
    192.168.1.52
    192.168.1.51
    ansible web-servers -m ping
    

    在这里插入图片描述
    安装完成.
    在生产环境中通常用户是不允许直接root连接的所以我们比如修改文件时就需要利用sudo来进行修改
    这里修改bond0配置

    创建ansible所需配置文件

    mkdir -p /etc/ansible/network/roles/network/{default,files,handlers,meta,tasks,templates,vars}
    

    这里利用脚本进行修改,在files中配置使用脚本

    vim b.sh
    #!/bin/bash
    a=`ip addr | grep bond0 | awk -F':' '{print $2}' | head -n1 | awk '{print $1}'`
    cat /etc/sysconfig/network-scripts/ifcfg-bond0
    if [ $? -ne 0 ]
    then 
    exit
    else
            sed -i 's/BOND/#BONDING_OPTS/' /etc/sysconfig/network-scripts/ifcfg-bond0
    fi
    echo 'BONDING_OPTSING_OPTSING_OPTS="mode=1 miimon=50 primary='$a'"' >> /etc/sysconfig/network-scripts/ifcfg-bond0
    sed -i '/^#/d' /etc/sysconfig/network-scripts/ifcfg-bond0
    cat /etc/sysconfig/network-scripts/ifcfg-bond0
    

    在tasks中使用copy模板

    [root@localhost tasks]#vim main.yml 
    - name:  revise networkconfig
      copy:  src=b.sh dest=/tmp/b.sh owner=lichen group=lichen mode=755
    

    在roles中连接起来network

    [root@localhost roles]# vim network.yml 
    - name: revise networkconfig 
      remote_user:  zdadmin
      hosts:  servers
      sudo_user:  zdadmin
      roles:
    -  network
    

    配置hosts文件

    vim /etc/ansible/hosts
    192.168.1.[5:60] ansible_ssh_user=*** ansible_ssh_pass=*** ansible_sudo_pass=***
    192.168.2.[5:30] ansible_ssh_user=*** ansible_ssh_pass=*** ansible_sudo_pass=***
    

    user这里用的sudo的用户
    pass 用户密码
    修改ansible主配置文件vim /etc/ansible/ansible.cfg 添加
    host_key_checking = False
    配置运行脚本

    [root@localhost ~]# vim /root/b.sh 
    #!/bin/bash
    ansible-playbook -i /etc/ansible/hosts /etc/ansible/network/roles/network.yml
    ansible servers -m shell -a 'ls -ll /tmp/b.sh' --sudo
    ansible servers -m shell -a 'chmod +x /tmp/b.sh' --sudo
    ansible servers -m shell -a 'chown root:root /tmp/b.sh' --sudo
    ansible servers -m shell -a 'ls -ll /tmp/b.sh' --sudo
    ansible servers -m shell -a 'sh /tmp/b.sh' --sudo
    ansible servers -m shell -a 'rm -fr /tmp/b.sh' --sudo
    

    sh /root/b.sh,查看修改已成功
    在这里插入图片描述

    Ansible批量升级openssh
    在这里插入图片描述
    创建升级openssh升级目录

    mkdir-p /etc/ansible/openssh7/roles/openssh7/{default,files,handlers,meta,tasks,templates,vars}
    

    Files 放置copy文件
    在这里插入图片描述
    [root@localhost files]# pwd
    /etc/ansible/openssh7/roles/openssh7/files
    书写脚本

    [root@localhost files]# vim openssh.sh 
    #!/bin/bash
    cp /etc/ssh/sshd_config /etc/ssh/sshd.bak
    rpm -Uvh /tmp/*.rpm
    chmod 600 /etc/ssh/ssh_host*key
    sed -i 's/^GSSAPIAuthentication/#GSSAPIAuthentication/' /etc/ssh/sshd_config
    sed -i 's/^GSSAPICleanupCredentials/#GSSAPICleanupCredentials/' /etc/ssh/sshd_config
    sed -i 's/^UsePAM/#UsePAM/' /etc/ssh/sshd_config
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
    systemctl restart sshd
    

    Tasks 剧本文件放置点

    [root@localhost tasks]# vim main.yml 
    - name:  update openssh
      copy:  src=openssh-8.0p1-1.el7.x86_64.rpm dest=/tmp/openssh-8.0p1-1.el7.x86_64.rpm
    - name:  update openssh-clients
      copy:  src=openssh-clients-8.0p1-1.el7.x86_64.rpm dest=/tmp/openssh-clients-8.0p1-1.el7.x86_64.rpm
    - name:  update openssh-server
      copy:  src=openssh-server-8.0p1-1.el7.x86_64.rpm dest=/tmp/openssh-server-8.0p1-1.el7.x86_64.rpm
    - name:  update openssh-askpass
      copy:  src=openssh-askpass-8.0p1-1.el7.x86_64.rpm dest=/tmp/openssh-askpass-8.0p1-1.el7.x86_64.rpm
    - name:  update openssh-askpass-gnome
      copy:  src=openssh-askpass-gnome-8.0p1-1.el7.x86_64.rpm dest=/tmp/openssh-askpass-gnome-8.0p1-1.el7.x86_64.rpm
    - name:  update openssh-debuginfo
      copy:  src=openssh-debuginfo-8.0p1-1.el7.x86_64.rpm dest=/tmp/openssh-debuginfo-8.0p1-1.el7.x86_64.rpm
    - name:  revise openssh.sh
      copy:  src=openssh.sh dest=/tmp/openssh.sh
    

    在这里插入图片描述
    Roles 连接起剧本文件

    [root@localhost roles]# pwd
    /etc/ansible/openssh7/roles
    [root@localhost roles]# ls
    openssh7  openssh.retry  openssh.yml
    [root@localhost roles]# vim openssh.yml 
    - name: update openssh
      remote_user:  zdadmin
      hosts:  servers
      sudo_user:  zdadmin
      roles:
    -  openssh7
    

    添加hosts升级

    vim /etc/ansible/hosts
    [servers]
    Ip	ansible_ssh_user=  ansible_ssh_pass= ansible_sudo_pass=
    

    这里需要升级的IP
    准备完成,开始测试

    ansible servers -m command -a 'cat /proc/version'
    

    在这里插入图片描述
    执行成功后在进行安装

    [root@localhost ~]# vim b.sh 
    #!/bin/bash
    ansible-playbook -i /etc/ansible/hosts /etc/ansible/openssh7/roles/openssh.yml
    ansible servers -m command -a 'sh /tmp/openssh.sh' --sudo
    ansible servers -m command -a 'ssh -V'
    

    在这里插入图片描述
    升级成功.

    展开全文
  • 服务器管理工具

    2020-09-09 09:39:36
    Ansible远程管理工具,记个笔记,搭建部署过程和一些模块使用 Ansible需要python支持,直接二进制安装配置 Ansible首先配置密钥连接需要管理的主机 之后将密钥分发给其他被管理机器 下一步二进制安装的...
  • ansible入门搭建与使用

    2019-03-24 16:36:16
    ansible 简介 ansible 是什么?  ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。  ...
  • ansible自动化批量部署工具

    千次阅读 2019-05-22 20:00:04
    Ansible简介 ansible是一个自动化批量部署工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于模块...
  • 自动化运维工具——【ansible详解 一】

    万次阅读 多人点赞 2018-08-28 15:47:32
    ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ansible 执行流程 ansible 命令执行过程 ansible 配置详解 ansible 安装方式 使用 pip...
  • Ansible详解(一)

    万次阅读 2018-06-28 21:26:31
    ansible简介: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于...
  • ansible

    2019-03-11 20:19:23
  • Ansible全套详细教程

    万次阅读 2019-09-18 09:35:56
    我们使用ssh与托管节点(服务器)通信,默认使用sftp(使用SSH协议进行FTP传输的协议叫做SFTP,),如果不可用,需要在ansible.cfg文件中配置成scp方式 这里不建议使用virtualenv虚拟环境来安装ansible Inventory...
  • Ansible入门(一)

    千次阅读 2019-04-09 11:32:41
    Ansible环境准备 角色 IP master 192.168.30.128 slave 192.168.30.128 slave 192.168.30.129 slave 192.168.30.130 严格来说,ansible不区分master节点和slave节点,它只有deploy(管理员)节点,...
  • Run Ansible playbooks to launch complex multi-tier applications hosted in public clouds Key Features Build your learning curve using Ansible Automate cloud, network, and security infrastructures ...
  • ansible 简介 Ansible 是新出现的自动化运维工具,基于Python研发。糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。ansible无需安装客户端。ansible应用程序存在于...
  • ansible自动化运维实战

    2020-07-30 23:31:58
    主要内容包括:Ansible架构及安装,Ansible 组件、组件扩展、API,playbook详解、*佳实践案例分析,用ansible-vault保护敏感数据,Ansible与云计算的结合,部署Zabbix组件、Haproxy + LAMP架构,以及Ansible在大数据...
  • ansible使用三(ansible roles)

    千次阅读 2018-04-20 18:27:12
    ansible roles 在实际的工作当中,一个完整的项目实际上是很多功能体的组合,如果将所有的功能写在一个playbook中会存在如代码耦合程度高、playbook长而维护成本大、灵活性低等一系列的问题。使用roles能巧妙的解决...
  • The book ends with the enterprise version of Ansible, Ansible Tower and Ansible Galaxy, where you will learn to interact Ansible with different OSs to speedup your work with Ansible Tower and Ansible...
  • 众所周知,ansible是很火的一个自动化部署工具,在ansible控制节点内,存放着当前环境服务的所有服务的配置信息,其中自然也包括一些敏感的信息,例如明文密码、IP地址等等。 从安全角度来讲,这些敏感数据的文件不...
1 2 3 4 5 ... 20
收藏数 31,852
精华内容 12,740
关键字:

ansible