一、setup模块

  ansible的setup模块主要用来收集信息,查看参数:

[root@localhost ~]# ansible-doc -s setup        # 查看参数,部分参数如下:
filter # 过滤,筛选

  示例一:查看所有信息

[root@localhost ~]# ansible cache -m setup          # 查看cache组的被管控机的信息,可查到部分信息如下
ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain # 系统所在的域
ansible_env # 系统的环境变量
ansible_hostname # 系统的主机名
ansible_fqdn # 系统的全名(主机名+域名)
ansible_machine # 系统的架构
ansible_memory_mb # 系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores # 系统的cpu的核数(每颗)
ansible_processor_count # 系统cpu的颗数
ansible_processor_vcpus # 系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python

  示例二:搜索某个信息

[root@localhost ~]# ansible cache -m setup -a 'filter=*processor*'       # 用来搜索,*代表匹配任意个任意字符,可自行回顾正则表达式相关知识,可得如下信息
192.168.133.132 | SUCCESS => {
"ansible_facts": {
"ansible_processor": [
"0",
"GenuineIntel",
"Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1
},
"changed": false
}

二、ansible条件判断

1、条件判断

  ansible的playbook支持条件判断,当针对不同系统,不同版本,不同环境,不同用户有不同操作时,可以使用 when 作条件判断,示例如下:

[root@localhost yaml]# vi p5.yml               # 写一个yml文件,内容如下:
- hosts: db
remote_user: root
tasks:
- name: createfile3
copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
when: a==""
- name: createfile4
copy: content="小弦切切如私语" dest=/tmp/a.txt
when: a==""
[root@localhost yaml]# ansible-playbook --syntax-check p5.yml # 验证语法合法性 playbook: p5.yml
[root@localhost yaml]# ansible-playbook -e 'a="3"' p5.yml # 只执行name为 createfile3 的任务,结果自行验证

2、tags

  假如在一playbook文件中有多个任务,但是我们只想执行其中一个,该怎么办?此时,可以使用tags,如下示例:

[root@localhost yaml]# vi p6.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: src=/etc/redis.conf dest=/etc/redis.conf
tags: copyfile
- name: start
service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p6.yml playbook: p6.yml
[root@localhost yaml]# ansible-playbook -t copyfile p6.yml # 执行脚本,结果自行验证

3、循环with_items

  通常你想在一个任务中干很多事,比如创建一群用户、安装很多包、或者重复一个轮询步骤直到收到某个特定结果,这时就可以使用循环。

  示例一:单个循环

[root@localhost yaml]# vi p7.yml
- hosts: web
tasks:
- name: createuser
user: name={{ item }}
with_items:
- zhangsan
- lisi
- wangwu
[root@localhost yaml]# ansible-playbook --syntax-check p7.yml playbook: p7.yml
[root@localhost yaml]# ansible-playbook p7.yml

  示例二:多个循环

[root@localhost yaml]# vi p8.yml               # 写入如下内容
- hosts: web
tasks:
- name: createuser
user: name={{ item }}
with_items:
- zs
- lss
- ww
- name: creategroup
group: name={{ item }}
with_items:
- yunwei
- kaifa
- ceshi
[root@localhost yaml]# vi p8.yml
[root@localhost yaml]# ansible-playbook --syntax-check p8.yml playbook: p8.yml
[root@localhost yaml]# ansible-playbook p8.yml # 执行命令,结果自行验证

  示例三:循环嵌套

[root@localhost yaml]# vi p9.yml          # 写入如下内容
- hosts: web
tasks:
- name: creategroup
group: name={{ item }}
with_items:
- yunwei
- kaifa
- ceshi
- name: createuser
user: name={{ item.name }} group={{ item.group }}
with_items:
- {'name':zs,'group':yunwei}
- {'name':lss,'group':kaifa}
- {'name':ww,'group':ceshi}
[root@localhost yaml]# ansible-playbook p9.yml # 结果自行验证 playbook: p9.yml
[root@localhost yaml]# ansible-playbook p9.yml

4、template模块

  先来回忆一下redis的安装,为了安全起见,我们通常在redis安装完成后要更改redis的配置文件redis.conf,其中有一项是更改bind参数,让redis可以远程访问,实际开发中bind 参数为本机对外ip地址,而不能使用0.0.0.0开启,这时,问题来了,使用ansible批量传输配置文件时,如何将bind参数设置为被管控机的ip地址?

  首先,我们使用setup模块查询一下被管控机的ip地址,如下 :

  在管控机上安装redis后,编辑配置文件redis.conf,更改bind参数如下:

[root@localhost yaml]# vi /etc/redis.conf            # 编辑redis配置文件,更改bind参数为如下内容

  示例:(在130下载redis : yum install -y redis,这样可以修改配置文件之后发给其他)

[root@localhost yaml]# vi p10.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
template: src=/etc/redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml # 校验语法是否正确 playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml # 执行

  

验证:查看web组的被管控机的redis配置文件中bind参数

  copy模块与template模块的区别:

      copy模块不替换参数,(在131中还是130中写的 bind {{ ansible_default_ipv4.address }})

      template模块替换参数, (将130中写的 bind {{ ansible_default_ipv4.address }} 替换成131中自己的地址 192.168.107.131)

  使用相对路径:在上面p10.yml中,template模块的src参数使用的是绝对路径,除此之外,我们还可以使用相对路径,如下:

[root@localhost yaml]# vi p10.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml

  注意:使用相对路径的前提是在当前目录(p10.yml文件所在目录)下新建一个templates(必须叫这个)目录,然后把文件redis.conf放在templates目录里面。

5、handlers

  上面我们曾提到过,module 具有"幂等"性,所以当远端系统被人改动时,可以重放 playbooks 达到恢复的目的,playbooks 本身可以识别这种改动,并且有一个基本的 event system(事件系统),可以响应这种改动。(当发生改动时)'notify' actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, 'notify' actions 只会被触发一次。

  举例来说,比如多个 resources 指出因为一个配置文件被改动,所以 apache 需要重新启动,但是重新启动的操作只会被执行一次。

  'notify' 下列出的即是 handlers。Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别。Handlers 是由通知者进行 notify,如果没有被 notify,handlers 不会执行,不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次。

  示例:

[root@localhost yaml]# vi p11.yml
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
tags: copyfile # 标签
notify: restart # 触发 , 用来触发 handlers的name
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted # 重启
[root@localhost yaml]#
[root@localhost yaml]# ansible-playbook --syntax-check p11.yml # 校验语法是否正确 playbook: p11.yml
[root@localhost yaml]#
[root@localhost yaml]# ansible-playbook p11.yml
[root@localhost yaml]# ansible-playbook -t copyfile p11.yml # 执行copyfile任务 和 restart任务,即修改完配置文件后重启redis服务

三、roles

  现在我们已经学过 tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?简单的回答就是:使用 roles ! roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。

  roles的优点:

  - 目录清晰

  - 可以互相调用

  roles目录结构:

  - 文件夹里面是要创建的每一个角色,每一个角色一个文件夹;

  - 每一个角色里面都有tasks(必须的),templates,files,handlers,vars目录;

  - 每个目录都要有main.yml文件,通过import_tasks来调用;

  - 其中templates文件夹中的文件可以通过相对路径来调用;

  其中files文件夹中的文件是否可以通过相对路径来调用?

1 . 示例:

root
├── roles
│   ├── cache
│   ├── db
│   └── web
│   ├── files # 用来存放 一些 copy的不需要传参的文件
│   ├── handlers
│   │   └── main.yml
│   ├── tasks # 存放要执行的任务
│   │   ├── copy_redis_conf.yml
│   │   ├── install_redis.yml
│   │   ├── main.yml
│   │   └── start_redis.yml
│   ├── templates # 存放配置文件
│   │   └── redis.conf.j2
│   └── vars # 用来存放变量
└── web.yml
[root@localhost ~]# ansible-playbook web.yml
[root@localhost ~]# ansible-playbook -t copy_redis_conf web.yml # 修改配置文件后加参数-t,触发handler中任务

图示 :

创建几个文件夹 : 

[root@localhost roles]# mkdir web
[root@localhost roles]# mkdir db
[root@localhost roles]# mkdir cache # 在 web 文件夹下创建几个文件夹,
#templates 文件夹是存放 配置文件
#files 文件夹是存放 copy的不需要传参的一些文件
#tasks 文件夹存放 保存任务
#vars 文件夹 用来保存变量的 [root@localhost roles]# mkdir -pv web/{templates,files,tasks,vars} # 递归创建
[root@localhost roles]# cd web/
[root@localhost web]# cd tasks # 写任务 [root@localhost tasks]# vi install.yml
[root@localhost tasks]# cat install.yml #一个任务写一个文件
- name: install
yum: name=redis [root@localhost tasks]# vi copyfile.yml
[root@localhost tasks]# cat copyfile.yml
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf [root@localhost tasks]# vi start.yml
[root@localhost tasks]# cat start.yml
- name: start
service: name=redis state=started 调用 :
[root@localhost tasks]# vi main.yml
[root@localhost tasks]# cat main.yml
- import_tasks: install.yml
- import_tasks: copyfile.yml
- import_tasks: start.yml # copy /templates/redis.conf到template/redis.conf.j2,jinja2de 文件后缀名是 j2 [root@localhost web]# cp /root/yaml/templates/redis.conf templates/redis.conf.j2 # 修改下文件
[root@localhost web]# vi tasks/copyfile.yml
[root@localhost web]# cat tasks/copyfile.yml
- name: copyfile
template: src=redis.conf.j2 dest=/etc/redis.conf # 如何调用
[root@localhost ~]# vi web.yml
[root@localhost ~]# cat web.yml
- hosts: web
remote_user: root # 可写可不写
roles:
- web # 文件夹的名称(roles文件夹里面的文件夹的名称)
 

# 有些任务是要被触发的时候才做的
[root@localhost web]# vi handlers/main.yml
[root@localhost web]# cat handlers/main.yml
- name: restart
service: name=redis state=restarted # 写条件去触发handlers
[root@localhost web]# vi tasks/copyfile.yml
[root@localhost web]# cat tasks/copyfile.yml
- name: copyfile
template: src=redis.conf.j2 dest=/etc/redis.conf
tags: copyfile
notify: restart # 修改文件重新触发,ansible的幂等性
[root@localhost roles]# vi web/templates/redis.conf.j2
修改端口 port 6379
 

  检查是否触发了端口的修改

(这就是目录结构的清晰)

(好处 : 当把这些上传到gethub上,这太电脑坏了,就可以在新机器上直接拉下来roles)

 2 . 如何调用别人的任务 
[root@localhost db]# vi tasks/createuser.yml
[root@localhost db]# cat tasks/createuser.yml
- name: createuser
user: name=tom60
# 回到web中调用
[root@localhost web]# vi tasks/main.yml
[root@localhost web]# cat tasks/main.yml
- import_tasks: install.yml
- import_tasks: copyfile.yml
- import_tasks: start.yml
- import_tasks: roles/db/tasks/createuser.yml
# 注意 : 查找顺序,当前目录下
# 执行
 

这样我们就可以调用别人的任务了

 3 . 同步时间 

  机器的同步时间可以是计划任务

  同步时间很重要

# 下载个模块,这个目录就是同步时间的
# 时间服务器 :
[root@localhost ~]# yum install -y ntp
[root@localhost ~]# ll /etc/localtime #查看所在时区
[root@localhost ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #将亚洲的上海的时区复制过去(中国只有上海时区在Linux中)
[root@localhost ~]# date #查看时间(查看时区的时候或许是别的,但是没关系,软连接的事情)

四、nginx基于uwsgi部署django

  参考博客:https://blog.51cto.com/wangfeng7399/2341281

  思考:如何用roles 来安装nginx+uwsgi+mariadb + redis?

 
 
 

ansible3的更多相关文章

  1. ansible-3 主机清单hosts的设置

    主机清单的设置参考:http://www.ansible.com.cn/docs/intro_inventory.html [ceshi]192.168.220.98log ansible_ssh_h ...

  2. Ansible3:ansible.cfg配置说明【转】

    Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码.是否开启sudo认证.actio ...

  3. Ansible3: ansible.cfg配置说明

    常用配置 Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码.是否开启sudo认证. ...

  4. ansible-3

    setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_tim ...

  5. 随笔-ansible-3

    关于循环的一些事: 是否是因为模块的原因? item适用于copy,但不适用于yum.虽然出现了警告,但并不表示不能用.功能还是不受影响的. 在上例中,我们使用了yum.copy.service模块( ...

  6. Ansible自动化运维笔记3(playbook)

    1.基本语法 playbook文件格式为yaml语法.示例如下: 1.1 nginx.yaml --- - hosts: all tasks: - name: Install Nginx Packag ...

  7. Ansible安装及配置

    ansible分为以下几个部份: Ansible:核心引擎 Modules:包括 Ansible 自带的核心模块(core modules)及自定义模块 (custom modules): 核心模块: ...

  8. 运维自动化之ansible

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

随机推荐

  1. HTML小技巧将table边框改为细线

    HTML制作新手在用TABLE表格时,会碰到如何改变边线粗线,因为默认的TABLE边线设置即使是1px 是很粗的.因此会使用其他一些方法来制作出细线边框,这里介绍一种利用CSS来实现细线的方法,很有效 ...

  2. Ubuntu下sudo apt-get install vim 失败的解决办法

    Ubuntu下 执行命令:sudo apt-get install vim 失败 解决办法: 更新一下,命令:sudo apt-get update 再安装即可成功:sudo apt-get inst ...

  3. MFC中 日期字符串的转换

    一.将字符串2011-08-1800:00:00转换为字符串2011-8-18,通过以下的函数 CString DataDeleteZero(CString DATA) { CStringstrmon ...

  4. SFTP & FTP Upload

    简述 >> FTP: 1. Install FTP service on Linux(Red Hat) as root user    [root]# yum install ftp 2. ...

  5. 如何在IIS7上配置 FTP7并使用IIS管理凭据方式进行验证

    在 Windows Server 2008 R2 发布后,gOxiA 就开始着手于相关的测试和评估.IIS 是重点测试和评估之一!而今天与大家分享的是如何在  IIS7 上配置 FTP7 使用 IIS ...

  6. Nginx学习——Nginx进程间的通信

    nginx进程间的通信 进程间消息传递 共享内存 共享内存还是Linux下提供的最主要的进程间通信方式,它通过mmap和shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者 ...

  7. VC6 在使用VC助手(Visual AssistX)在Win7下不能使用↑↓←→及回车键选择的解决的方法

    VC6使用Visual AssistX版本号的问题,换一个版本号.如"Visual Assist X 10.8.2029"就可以解决. http://pan.baidu.com/w ...

  8. 调用聚合数据新闻头条API

    基于聚合数据新闻头条接口 支持阅读新闻类型包括: 各类社会.国内.国际.体育.娱乐.科技等资讯,更新周期5-30分钟. 新闻内容类型的多选,支持皮肤功能. 使用前需要有聚合数据账号,并实名制后通过 新 ...

  9. 如何在vs2010中添加Picture控件

    1.新建项目,并在对话框控件中拖入picture控件,并做如下设置 2.在picture控件的属性栏需要进行如下修改:ID需要修改,不能为static ID是控件的唯一标识,PictureCtrl(p ...

  10. 【电子签章】HTML格式合同转化成PDF文件

    代码地址如下:http://www.demodashi.com/demo/12476.html 一.主要思路 通过itextpdf 生成想要的pdf 文件 通过itextpdf 中 XMLWorker ...