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的安装、配置与演示已全部完成。