• Jenkins+Gitlab+Ansible自动化部署(二)


    接Jenkins+Gitlab+Ansbile自动化部署(一):https://www.cnblogs.com/zd520pyx1314/p/10210727.html

    Ansible的配置与部署

    工具名称 介绍
    Chef 采用Ruby编写,C/S架构,配置需要Git依赖,Recipe脚本编写规范,需要良好的编程经验。
    Ansible

    采用Python编写,无Client,模块化配置管理,Playbook脚本编写规范,易于上手,

    适合中小规模快速部署。

    Saltstack

    采用Python编写,C/S架构,模块化配置管理,YAML脚本编写规范,内置

    异步文件服务器可以为客户端文件加快服务速度,适合大规模集群部署,但是需要安装客户端。

    Ansible的优势和应用场景

    优势:

    • 轻量级无客户端(Agentless);
    • 开源免费,学习成本低,快速上手;
    • 使用playbook作为核心配置架构,同意的脚本格式批量化部署;
    • 完善的模块化扩展,支持目前主流的开发环境;
    • 强大的稳定性和兼容性;
    • 活跃的官方社区问题讨论,方便troubleshooting与debug问题;

    Ansible配合virtualenv安装配置

    使用python自带的python virtualenv工具隔离Python3.6、Ansible2.5和系统其他python依赖环境。

    Ansible安装方式

    1.yum一键安装(不推荐) 

    [root@ansible ~]# yum install -y ansible
    # 虽然简单,但是会带来一系列的依赖和模块混乱

    2.Git源码安装(推荐)

    [root@ansible ~]# yum install -y git      #如果系统中没有git的话,使用这条命令安装即可
    [root@ansible ~]# git clone https://github.com/ansible/ansible.git

    Ansible2.5+Python3.6安装步骤

    1.安装python3.6.5和virtualenv工具

    [root@ansible ~]# wget http://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
    [root@ansible ~]# tar -xf Python-3.6.5.tar.xz -C /usr/local/src/
    [root@ansible ~]# cd /usr/local/src/Python-3.6.5/
    [root@ansible ~]# cd /usr/local/src/Python-3.6.5/
    [root@ansible Python-3.6.5]# ./configure --prefix=/usr/local/ --with-ensurepip=install --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
    #竟然报错
    configure: error: in `/usr/local/src/Python-3.6.5':
    configure: error: no acceptable C compiler found in $PATH
    See `config.log' for more details
    # 根据报错信息,需要安装GCC套件
    [root@ansible Python-3.6.5]# yum install -y gcc 
    # 然后再次执行编译操作,完事执行安装
    [root@ansible Python-3.6.5]# make && make altinstall
    # 然而又报错了
    ....
        import pip
    zipimport.ZipImportError: can't decompress data; zlib not available
    make: *** [altinstall] Error 1
    # 提示很明显了直接执行
    [root@ansible Python-3.6.5]# yum install zlib*
    # 然后再吃运行安装命令即可
    [root@ansible Python-3.6.5]# make && make altinstall
    # 当看到
    .....
    Collecting setuptools
    Collecting pip
    Installing collected packages: setuptools, pip
    Successfully installed pip-9.0.3 setuptools-39.0.1
    # 表明安装成功
    # 接着安装virtualenv,然而并不顺利
    [root@ansible bin]# pwd
    /usr/local/bin
    [root@ansible bin]# ./pip --trusted-host pypi.python.org install virtualenv
    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
    Collecting virtualenv
      Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Could not fetch URL https://pypi.python.org/simple/virtualenv/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.python.org', port=443): Max retries exceeded with url: /simple/virtualenv/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
      Could not find a version that satisfies the requirement virtualenv (from versions: )
    No matching distribution found for virtualenv
    # 使用网友提供的方法  加上--trusted-host参数,哦...依然不行
    [root@ansible bin]# ./pip --trusted-host pypi.python.org install virtualenv
    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
    Collecting virtualenv
      Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/virtualenv/
      Could not fetch URL https://pypi.python.org/simple/virtualenv/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.python.org', port=443): Max retries exceeded with url: /simple/virtualenv/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
      Could not find a version that satisfies the requirement virtualenv (from versions: )
    No matching distribution found for virtualenv
    # 根据第一行报错提示
    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available
    # 需要安装openssl相关软件包
    [root@ansible bin]# yum install -y openssl*
    #除此之外,卸载掉python2.7安装的pip防止干扰
    [root@ansible bin]# python -m pip uninstall pip
    Uninstalling pip-18.1:
      Would remove:
        /usr/bin/pip
        /usr/bin/pip2
        /usr/bin/pip2.7
        /usr/lib/python2.7/site-packages/pip-18.1.dist-info/*
        /usr/lib/python2.7/site-packages/pip/*
    Proceed (y/n)? y
      Successfully uninstalled pip-18.1
    # 然后回到解压包里,重新运行编译安装过程
    [root@ansible Python-3.6.5]# ./configure --prefix=/usr/local/ --with-ensurepip=install --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
    [root@ansible Python-3.6.5]# make && make altinstall 
    .......
    Requirement already satisfied: setuptools in /usr/local/lib/python3.6/site-packages
    Requirement already satisfied: pip in /usr/local/lib/python3.6/site-packages
    [root@ansible Python-3.6.5]# cd ../../bin/
    [root@ansible bin]# ll
    total 68
    -rwxr-xr-x. 1 root root   101 Jan  7 11:42 2to3-3.6
    -rwxr-xr-x. 1 root root   242 Jan  7 11:00 easy_install-3.6
    -rwxr-xr-x. 1 root root    99 Jan  7 11:42 idle3.6
    lrwxrwxrwx. 1 root root    21 Jan  7 11:03 pip -> /usr/local/bin/pip3.6
    -rwxr-xr-x. 1 root root   214 Jan  7 11:00 pip3.6
    -rwxr-xr-x. 1 root root    84 Jan  7 11:42 pydoc3.6
    -rwxr-xr-x. 2 root root 17712 Jan  7 11:41 python3.6
    -rwxr-xr-x. 2 root root 17712 Jan  7 11:41 python3.6m
    -rwxr-xr-x. 1 root root  3109 Jan  7 11:42 python3.6m-config
    -rwxr-xr-x. 1 root root   441 Jan  7 11:42 pyvenv-3.6
    [root@ansible bin]# ln -s /usr/local/bin/pip3.6 /usr/local/bin/pip
    # 再次使用pip安装virtualenv
    [root@ansible bin]# pip install virtualenv
    Collecting virtualenv
      Cache entry deserialization failed, entry ignored
      Cache entry deserialization failed, entry ignored
      Downloading https://files.pythonhosted.org/packages/6a/d1/e0d142ce7b8a5c76adbfad01d853bca84c7c0240e35577498e20bc2ade7d/virtualenv-16.2.0-py2.py3-none-any.whl (1.9MB)
        100% |████████████████████████████████| 1.9MB 64kB/s
    Requirement already satisfied: setuptools>=18.0.0 in /usr/local/lib/python3.6/site-packages (from virtualenv)
    Installing collected packages: virtualenv
    Successfully installed virtualenv-16.2.0
    You are using pip version 9.0.3, however version 18.1 is available.
    You should consider upgrading via the 'pip install --upgrade pip' command.
    # 安装成功

    2.创建ansible账户并安装python3.6.5版本virtualenv实例

    [root@ansible ~]# useradd deploy && su - deploy
    [deploy@ansible ~]$ virtualenv -p /usr/local/bin/python3.6 .py3-a2.5-env
    Already using interpreter /usr/local/bin/python3.6
    Using base prefix '/usr/local'
    New python executable in /home/deploy/.py3-a2.5-env/bin/python3.6
    Also creating executable in /home/deploy/.py3-a2.5-env/bin/python
    Installing setuptools, pip, wheel...
    done.
    [deploy@ansible ~]$

    3.Git源码安装ansible2.5

    # 首先使用root账户确保git nss curl命令已经安装
    [root@ansible ~]# yum install -y git nss curl
    # 然后切到deploy用户,进入之前创建的.py3-a2.5-env目录下
    [deploy@ansible ~]$ cd /home/deploy/.py3-a2.5-env/
    [deploy@ansible .py3-a2.5-env]$ git clone https://github.com/ansible/ansible.git

    4. 加载python3.6.5 virtualenv环境

    [deploy@ansible .py3-a2.5-env]$ source /home/deploy/.py3-a2.5-env/bin/activate
    (.py3-a2.5-env) [deploy@ansible .py3-a2.5-env]$

    5. 安装ansible依赖包

    # 安装依赖包
    (.py3-a2.5-env) [deploy@ansible .py3-a2.5-env]$ pip install paramiko PyYAML jinja2
    (.py3-a2.5-env) [deploy@ansible .py3-a2.5-env]$ ll
    total 8
    drwxrwxr-x. 14 deploy deploy 4096 Jan  7 13:31 ansible
    drwxrwxr-x.  2 deploy deploy 4096 Jan  7 11:52 bin
    drwxrwxr-x.  2 deploy deploy   24 Jan  7 11:52 include
    drwxrwxr-x.  3 deploy deploy   23 Jan  7 11:52 lib
    (.py3-a2.5-env) [deploy@ansible .py3-a2.5-env]$ pwd
    /home/deploy/.py3-a2.5-env

    6. 在python3.6.5虚拟环境下加载ansible2.5

    # 确认ansible源码包在.py3-a2.5-env目录下
    # 进入ansible目录
    (.py3-a2.5-env) [deploy@ansible .py3-a2.5-env]$ cd ansible/
    (.py3-a2.5-env) [deploy@ansible ansible]$ pwd
    /home/deploy/.py3-a2.5-env/ansible
    (.py3-a2.5-env) [deploy@ansible ansible]$ git checkout stable-2.5  #将ansible切换到2.5版本
    Branch stable-2.5 set up to track remote branch stable-2.5 from origin.
    Switched to a new branch 'stable-2.5'
    (.py3-a2.5-env) [deploy@ansible ansible]$ source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q  #在此虚拟环境下加载ansible2.5版本

    7.验证ansible版本

    (.py3-a2.5-env) [deploy@ansible ansible]$ ansible --version
    ansible 2.5.14 (stable-2.5 6548b7a558) last updated 2019/01/07 13:56:01 (GMT +800)
      config file = None
      configured module search path = ['/home/deploy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
      ansible python module location = /home/deploy/.py3-a2.5-env/ansible/lib/ansible
      executable location = /home/deploy/.py3-a2.5-env/ansible/bin/ansible
      python version = 3.6.5 (default, Jan  7 2019, 11:40:52) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
    # 至此ansible2.5在虚拟环境下安装加载完成

    Playbooks框架与格式

    父目录 1级子目录 2级子目录  
    inventory/ Server详细清单目录 用来保存主机域名、IP地址和相关参数  
      testenv 具体清单与变量声明文件  
    roles/ roles任务列表 可以存放一个或多个role  
      testbox/  testbox详细任务  
        tasks/  
        main.yml testbox主任务文件
    deploy.yml Playbook任务入口文件    

    格式说明

    testenv文件 说明
    [testservers] Server组列表
    test.example.com 目标部署服务器主机名
    [testservers:vars] Server组列表参数
    server_name=test,example.com 目标主机Key/Value参数
    user=root
    output=/root/test.txt

    主任务文件main.yml

    文件内容 说明
    - name:Print Server name and user to remote testbox 任务名称
        shell:"echo 'Currently{{user}} is logining {{server_name}}' > {{output}}" shell:使用shell模块执行命令
    inventory/testenv文件[testservers:vars]

    server_name=test.example.com

    user=root

    output=/root/test.txt

    任务入口文件deploy.yml

    - hosts:"testservers"      #Server列表
      gather_facts:true         #获取Server基本信息   
       remote_user:root        # 目标服务器系统用户指定
       roles:
       - testbox                      #进入roles/testbox任务目录

    登录ansible主机,加载之前配置好的python3.6.5和ansible2.5环境,并验证

    [root@ansible ~]# su - deploy
    Last login: Mon Jan  7 11:51:41 CST 2019 on pts/1
    [deploy@ansible ~]$ source .py3-a2.5-env/bin/activate
    (.py3-a2.5-env) [deploy@ansible ~]$ source .py3-a2.5-env/ansible/hacking/env-setup -q
    (.py3-a2.5-env) [deploy@ansible ~]$ ansible-playbook --version
    ansible-playbook 2.5.14 (stable-2.5 6548b7a558) last updated 2019/01/07 13:56:01 (GMT +800)
      config file = None
      configured module search path = ['/home/deploy/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
      ansible python module location = /home/deploy/.py3-a2.5-env/ansible/lib/ansible
      executable location = /home/deploy/.py3-a2.5-env/ansible/bin/ansible-playbook
      python version = 3.6.5 (default, Jan  7 2019, 11:40:52) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

    开始编写playbooks

    (.py3-a2.5-env) [deploy@ansible ~]$ mkdir test-playbooks
    (.py3-a2.5-env) [deploy@ansible ~]$ cd test-playbooks/
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ mkdir inventory
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ mkdir roles
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ cd inventory
    (.py3-a2.5-env) [deploy@ansible inventory]$ vim testenv
    [testservers]
    test.example.com
    
    [testservers:vars]
    server_name=test.example.com
    user=root
    output=/root/test.txt
    (.py3-a2.5-env) [deploy@ansible inventory]$ cd ..
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ls
    inventory  roles
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ cd roles/
    (.py3-a2.5-env) [deploy@ansible roles]$ mkdir testbox
    (.py3-a2.5-env) [deploy@ansible roles]$ cd testbox/
    (.py3-a2.5-env) [deploy@ansible testbox]$ mkdir tasks
    (.py3-a2.5-env) [deploy@ansible testbox]$ cd tasks/
    (.py3-a2.5-env) [deploy@ansible tasks]$ vim main.yml
    - name: Print server name and user to remote testbox
      shell:"echo 'Currently {{ user }} is loggging {{ server_name }}' > {{ output }}"
    (.py3-a2.5-env) [deploy@ansible tasks]$ cd ../../..
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ pwd
    /home/deploy/test-playbooks
    (.py3-a2.5-env) [deploy@ansible tasks]$ cd ../../..
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ pwd
    /home/deploy/test-playbooks
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim deploy.yml
    
    - hosts: "testservers"
      gather_facts: true
      remote_user: root
       
       
      roles:
        - testbox

    查看test_playbooxs目录结构

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ tree .
    .
    ├── deploy.yml
    ├── inventory
    │?? └── testenv
    └── roles
        └── testbox
            └── tasks
                └── main.yml
    
    4 directories, 3 files

    这里需要另外一台测试被部署机器test.example.com

    系统版本 主机名 IP地址
    CentOS  Linux release 7.5.1804 (core) test.example.com 192.168.244.133

    被部署的机器test.example.com与其他三台主机实验环境一致。

    配置SSH免秘钥认证

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ su - root
    Password:
    Last login: Mon Jan  7 10:05:23 CST 2019 from 192.168.244.1 on pts/1
    [root@ansible ~]# vim /etc/hosts
    ....
    192.168.244.133 test.example.com
    [root@ansible ~]# exit
    logout
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/deploy/.ssh/id_rsa):
    Created directory '/home/deploy/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/deploy/.ssh/id_rsa.
    Your public key has been saved in /home/deploy/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:Aj+FzKSwqZS19eI/3EQt13L78+u3vjMtseX8YXNFnnY deploy@ansible.example.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |  .. ..          |
    |  o+o=..  . .    |
    | oo.o.+..o + o  .|
    |..  .o... o o .o.|
    |.    .+ S.   . oE|
    |      ooo     + +|
    |       + .     %o|
    |        .     +o@|
    |              oB@|
    +----[SHA256]-----+
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh-copy-id -i /home/deploy/.ssh/id_rsa.pub root@test.example.com
    /bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/deploy/.ssh/id_rsa.pub"
    The authenticity of host 'test.example.com (192.168.244.133)' can't be established.
    ECDSA key fingerprint is SHA256:66hu+WU6R2SL4+7r/WYk2kjrGi7IwjuJieTrdMhwLc0.
    ECDSA key fingerprint is MD5:af:c7:bd:88:0d:40:d8:19:6d:28:7f:dd:af:aa:3a:c9.
    Are you sure you want to continue connecting (yes/no)? yes
    /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@test.example.com's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@test.example.com'"
    and check to make sure that only the key(s) you wanted were added.
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com
    Last login: Mon Jan  7 17:35:38 2019 from 192.168.244.1
    [root@test ~]# whoami
    root
    [root@test ~]# hostname
    test.example.com

    测试部署

    (.py3-a2.5-env) [deploy@ansible ~]$ cd test-playbooks/
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ls
    deploy.yml  inventory  roles
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ansible-playbook -i inventory/testenv ./deploy.yml
    
    PLAY [testservers] *************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [test.example.com]
    
    TASK [testbox : Print server name and user to remote testbox] ******************
    changed: [test.example.com]
    
    PLAY RECAP *********************************************************************
    test.example.com           : ok=2    changed=1    unreachable=0    failed=0  
    # 以下内容可以看出已经成功在远程被部署主机test.example.com上创建一个test.txt文件,且文件内容与预先设置的一致
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com
    Last login: Mon Jan  7 17:42:57 2019 from 192.168.244.132
    [root@test ~]# ls
    anaconda-ks.cfg  test.txt
    [root@test ~]# cat test.txt
    Currently root is loggging test.example.com

    Ansible Playbooks常用模块

    File模块:

    在目标主机创建文件或目录,并赋予其系统权限,如:

    - name: create a file   # 任务名称
      file: 'path=/root/a.txt state=touch mode=0755 owner=sishen group=sishen'
    # 任务内容

    Copy模块:

    实现Ansible服务端到目标主机的文件传送,如:

    - name: copy a file   #任务名称 复制一个文件
      copy: 'remote_src=no src=roles/testbox/files/test.sh dest=/root/test.sh mode=0644 force=yes'
    
    # 说明
    remote_src:声明将ansible服务端文件传送到目标主机当中
    src:源文件的路径
    dest:目标文件的路径
    mode:赋予的文件权限
    force:强制执行

    Stat模块:

    获取远程文件状态信息,如:

    - name: check if test.sh exists
      stat: 'path=/root/test.sh'   #需要获取的文件路径
      register: script_stat           #将stat变量获取到的信息传递给script_stat

    Debug模块:

    打印语句到Ansible执行输出:

    - debug: msf=test.sh exists
      when:script_stat.stat.exists

    Command/Shell模块

    用来执行Linux目标主机命令行

    - name: run the script
      command: "sh /root/test.sh"
    
    - name: run the script
      shell: "echo 'test' > /root/test.txt" (推荐)

    Template模块

    实现Ansible服务端到目标主机的jinja2模板传送

    - name: write the nginx config file
      template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf

    Packaging模块

    调用目标主机系统包管理工具(yum,apt)进行安装

    - name: ensure nginx is at the latest version
      yum: pkg=nginx state=latest  #(CentOS/RHEL)
    
    - name: ensure nginx is at the latest version
      apt: pkg=nginx state=latest    #(Debian/Ubuntu)

    Service模块

    管理目标主机系统服务

    - name: start nginx service
      service: name=nginx state=started

    登录被部署主机,创建测试用户

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com
    Last login: Mon Jan  7 17:44:56 2019 from 192.168.244.132
    [root@test ~]# useradd sishen
    useradd: user 'sishen' already exists
    [root@test ~]# useradd god
    [root@test ~]# useradd deploy
    [root@test ~]# mkdir /etc/nginx
    [root@test ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    Retrieving http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    warning: /var/tmp/rpm-tmp.i5SPeu: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
    Preparing...                                                            (100%################################# [100%]
    Updating / installing...
       1:nginx-release-centos-7-0.el7.ngx                                   ( 81%################################# [100%]

    退出被部署主机

    [root@test ~]# exit
    logout
    Connection to test.example.com closed.
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ pwd
    /home/deploy/test-playbooks
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ls
    deploy.yml  inventory  roles
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/tasks/main.yml
    - name: Print server name and user to remote testbox
      shell: "echo 'Currently {{ user }} is loggging {{ server_name }}' > {{ output }}"
    #添加以下内容
    - name: create a file
      file: 'path=/root/god.txt state=touch mode=0755 owner=god group=god'
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ansible-playbook -i inventory/testenv ./deploy.yml
    
    PLAY [testservers] *************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [test.example.com]
    
    TASK [testbox : Print server name and user to remote testbox] ******************
    changed: [test.example.com]
    
    TASK [testbox : create a file] *************************************************
    changed: [test.example.com]
    
    PLAY RECAP *********************************************************************
    test.example.com           : ok=3    changed=2    unreachable=0    failed=0  

    登录到远程主机查看

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com
    Last login: Mon Jan  7 19:05:41 2019 from 192.168.244.132
    [root@test ~]# ls -l
    total 8
    -rw-------. 1 root root 1732 Dec 26 20:03 anaconda-ks.cfg
    -rwxr-xr-x. 1 god  god     0 Jan  7 19:05 god.txt  #已经成功创建并赋予文件权限
    -rw-r--r--. 1 root root   44 Jan  7 19:05 test.txt

    或者直接

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com ls -l  /root/god.txt
    -rwxr-xr-x. 1 god god 0 Jan  7 19:05 /root/god.txt

    创建god.sh

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ mkdir roles/testbox/files
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/files/god.sh
    echo "this is a test script"
    echo "If you see this message, the script is executed successfully."
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/tasks/main.yml
    - name: Print server name and user to remote testbox
      shell: "echo 'Currently {{ user }} is loggging {{ server_name }}' > {{ output }}"
    - name: create a file
      file: 'path=/root/god.txt state=touch mode=0755 owner=god group=god'
    #添加以下内容
    - name: copy a file
      copy: 'remote_src=no src=roles/testbox/files/god.sh dest=/root/god.sh mode=0644 force=yes'
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ansible-playbook -i inventory/testenv ./deploy.yml

    验证并查看

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com ls -l /root/god.sh
    -rw-r--r--. 1 root root 99 Jan  7 19:19 /root/god.sh

    演示stat与debug模块

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/tasks/main.yml
    ....
    # 文件末尾添加以下内容
    - name: check if god.sh exists
      stat: 'path=/root/gid.sh'
      register: script_stat
    
    - debug: msg="god.sh exists"
      when: script_stat.stat.exists
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ansible-playbook -i inventory/testenv ./deploy.yml
    
    PLAY [testservers] *************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [test.example.com]
    
    TASK [testbox : Print server name and user to remote testbox] ******************
    changed: [test.example.com]
    
    TASK [testbox : create a file] *************************************************
    changed: [test.example.com]
    
    TASK [testbox : copy a file] ***************************************************
    ok: [test.example.com]
    
    TASK [testbox : check if god.sh exists] ****************************************
    ok: [test.example.com]
    
    TASK [testbox : debug] *********************************************************
    ok: [test.example.com] => {
        "msg": "god.sh exists"
    }
    
    PLAY RECAP *********************************************************************
    test.example.com           : ok=6    changed=2    unreachable=0    failed=0  
    
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$

    演示command模块

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/tasks/main.yml
    # 末尾添加以下内容
    - name: run the script
      command: 'sh /root/god.sh'
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ansible-playbook -i inventory/testenv ./deploy.yml
    
    PLAY [testservers] *************************************************************
    
    TASK [Gathering Facts] *********************************************************
    ok: [test.example.com]
    
    TASK [testbox : Print server name and user to remote testbox] ******************
    changed: [test.example.com]
    
    TASK [testbox : create a file] *************************************************
    changed: [test.example.com]
    
    TASK [testbox : copy a file] ***************************************************
    ok: [test.example.com]
    
    TASK [testbox : check if god.sh exists] ****************************************
    ok: [test.example.com]
    
    TASK [testbox : debug] *********************************************************
    ok: [test.example.com] => {
        "msg": "god.sh exists"
    }
    
    TASK [testbox : run the script] ************************************************
    changed: [test.example.com]
    
    PLAY RECAP *********************************************************************
    test.example.com           : ok=7    changed=3    unreachable=0    failed=0  

    template模块演示

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim inventory/testenv
    # 末尾添加以下内容
    server_name=test.example.com
    port=80
    user=deploy
    worker_processes=4
    max_open_file=65505
    root=/www
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ mkdir roles/testbox/templates (.py3
    -a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/templates/nginx.conf.j2 # For more information on configuration, see: user {{ user }}; worker_processes {{ worker_processes }}; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections {{ max_open_file }}; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # Load config files from the /etc/nginx/conf.d directory # The default server is in conf.d/default.conf #include /etc/nginx/conf.d/*.conf; server { listen {{ port }} default_server; server_name {{ server_name }}; #charset koi8-r; #access_log logs/host.access.log main; location / { root {{ root }}; index index.html index.htm; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } } 配置main.yml文件 (.py3-a2.5-env) [deploy@ansible test-playbooks]$ vim roles/testbox/tasks/main.yml # 末尾添加如下内容 - name: write the nginx config file template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.c onf - name: ensure nginx is at the latest version yum: pkg=nginx state=latest - name: start nginx service service: name=nginx state=started (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ansible-playbook -i inventory/testenv ./deploy.yml PLAY [testservers] ************************************************************* TASK [Gathering Facts] ********************************************************* ok: [test.example.com] TASK [testbox : Print server name and user to remote testbox] ****************** changed: [test.example.com] TASK [testbox : create a file] ************************************************* changed: [test.example.com] TASK [testbox : copy a file] *************************************************** ok: [test.example.com] TASK [testbox : check if god.sh exists] **************************************** ok: [test.example.com] TASK [testbox : debug] ********************************************************* ok: [test.example.com] => { "msg": "god.sh exists" } TASK [testbox : run the script] ************************************************ changed: [test.example.com] TASK [testbox : write the nginx config file] *********************************** changed: [test.example.com] TASK [testbox : ensure nginx is at the latest version] ************************* changed: [test.example.com] TASK [testbox : start nginx service] ******************************************* changed: [test.example.com] PLAY RECAP ********************************************************************* test.example.com : ok=10 changed=6 unreachable=0 failed=0 (.py3-a2.5-env) [deploy@ansible test-playbooks]$

    查看并验证

    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com cat /etc/nginx/nginx.conf
    # For more information on configuration, see:
    user              deploy;
    worker_processes  4;
    
    error_log  /var/log/nginx/error.log;
    
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  65505;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        # Load config files from the /etc/nginx/conf.d directory
        # The default server is in conf.d/default.conf
        #include /etc/nginx/conf.d/*.conf;
        server {
            listen       80 default_server;
            server_name  test.example.com;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   /www;
                index  index.html index.htm;
            }
    
            error_page  404              /404.html;
            location = /404.html {
                root   /usr/share/nginx/html;
            }
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   /usr/share/nginx/html;
            }
    
        }
    
    }
    (.py3-a2.5-env) [deploy@ansible test-playbooks]$ ssh root@test.example.com ps -ef | grep nginx
    root       5047      1  0 19:49 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    deploy     5048   5047  0 19:49 ?        00:00:00 nginx: worker process
    deploy     5049   5047  0 19:49 ?        00:00:00 nginx: worker process
    deploy     5050   5047  0 19:49 ?        00:00:00 nginx: worker process
    deploy     5051   5047  0 19:49 ?        00:00:00 nginx: worker process

    至此ansible的安装、配置与演示已全部完成。

  • 相关阅读:
    机器学习模型评估指标汇总
    Linux 搭建Hadoop集群错误锦集
    机器学习--聚类系列--DBSCAN算法
    机器学习--聚类系列--层次聚类
    机器学习--聚类系列--K-means算法
    数据分析--降维--LDA和PCA
    自然语言处理--Word2vec(一)
    自然语言处理--TF-IDF(关键词提取)
    Android学习笔记之BitmapFactory.Options实现图片资源的加载...
    Android学习笔记之蓝牙通信...
  • 原文地址:https://www.cnblogs.com/zd520pyx1314/p/10213549.html
Copyright © 2020-2023  润新知