安装ansible

ansible特点:
只要在主控制端部署Ansible环境
默认使用SSH协议对设备管理
轻量级,无需在客户端安装agent
基于python开发
支持api及自定义模块

alter_hosts(){
cat >> /etc/hosts <<eof
192.168.44.50 ansible
192.168.44.51 web1
192.168.44.52 web2
eof
}
stop_firewalld(){
systemctl stop firewalld
sed -ri '/^SELINUX=/c SELINUX=disabled' /etc/sysconfig/selinux
setenforce 0
systemctl disable firewalld  
systemctl status firewalld
}
  ssh-keygen        
        ssh-copy-id   web1
        ssh-copy-id   web2

安装ansible

yum -y install ansible

=====================Ad-Hoc===================================

ad hoc 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。其实就是
执行简单的命令——一条命令。对于复杂的命令则为 playbook。
列出ansible支持的模块:      
ansible-doc命令:
    获取模块列表,及模块使用格式;
    -l:获取列表
    -s module_name:获取指定模块的使用信息      
    
    [root@ansible ~]# ansible-doc -l
    [root@ansible ~]# ansible-doc yum
    [root@ansible ~]# ansible-doc -s yum
a.在执行 /usr/bin/ansible 时,默认是以当前用户的身份去执行这个命令.如果想以指定
的用户执行 /usr/bin/ansible, 请添加 “-u username”选项,如下:
$ ansible webs -a "/usr/bin/foo" -u username

b.[root@localhost ~]# ansible webs -m shell -a 'echo $TERM'
web1 | SUCCESS | rc=0 >>
xterm

web2 | SUCCESS | rc=0 >>
xterm

c.复制文件 
ansible webs -m copy -a "src=/etc/hosts dest=/tmp/hosts"

d.Ansible 提供对 yum 和 apt 的支持.这里是关于 yum 的示例
ansible webs -m yum -a "name=acme state=present"

e.使用 file 模块也可以创建目录,与执行 mkdir -p 效果类似 (webs要有alice用户)
ansible webs -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"

f.使用 ‘user’ 模块可以方便的创建账户,删除账户,或是管理现有的账户
ansible webs -m user -a "name=foo password=<root>"

g.webs上重启某个服务(reloaded, restarted, started, stopped)
ansible webservers -m service -a "name=httpd state=stopped"  

=========================facts=======================================

facts组件是Ansible用于采集被管理主机信息的一个功能,可以使用setup模块查看主机的有的facts信息。
[root@localhost ~]# ansible web1 -m setup -a 'filter=ansible_all_ipv4_addresses'
web1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.44.51", 
            "192.168.44.66"
        ]
    }, 
    "changed": false
}
查看主机内存信息
[root@ansible ansible]# ansible web1 -m setup -a 'filter=ansible_*_mb'

查看地接口为eth0-2的网卡信息
[root@ansible ansible]# ansible web1 -m setup -a 'filter=ansible_ens33' 

========================playbook=====================================

playbook的基础组件:
name
    定义playbook或者task的名称

hosts 
    playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。
hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。与命令模式
下的ansible匹配规则一样

user 
    remote_user则用于指定远程主机上的执行任务的用户,也可以使用user

tasks 
    任务列表
    play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主
机上执行,即在所有主机上完成第一个任务后再开始第二个。 

======================================Variables=================================

Variables: 
类型:
    内建变量
    自定义变量

变量调用: 
    {{ var_name }}

内建变量
    由facts组件提供,可以使用setup模块查询
    [root@ansible ansible]# ansible web1 -m setup
    
自定义变量
1.用命令行传递参数
为了使Playbook更灵活、通用性更强,允许用户在执行的时候传入变量的值,这个时候就需要用到“额外变量”。

定义命令行变量
在release.yml文件里,hosts和user都定义为变量,需要从命令行传递变量值。
---
- hosts: '{{ hosts }}'
  remote_user: '{{ user }}'

  tasks:
     - ...

使用命令行变量
在命令行里面传值的方法:  
#ansible-playbook e33_var_in_command.yml --extra-vars "hosts=web user=root"

还可以用json格式传递参数:  
ansible-playbook e33_var_in_command.yml --extra-vars "{'hosts':'vm-rhel7-1', 'user':'root'}"

还可以将参数放在文件里面:  
ansible-playbook e33_var_in_command.yml --extra-vars "@vars.json"
                                                                                                
2.在hosts Inventory中为每个主机定义专用变量值
    向不同的主机传递不同的变量:
        IP/HOSTNAME variable_name=value 

    向组内的所有主机传递相同的变量:
        [groupname:vars] 
        variable_name=value 

3.在playbook中定义 
 vars: 
 - var_name: value 
 - var_name: value

通过vars_files关键字引入变量文件:
- hosts: all
  remote_user: root
  vars:
    favcolor: blue
  vars_files:
    - /vars/external_vars.yml
    - /vars/nginx_vars.yml

示例文件:
    # vim /vars/nginx_vars.yml
    http_port: 80
    server_name: localhost
    cert_file: /etc/nginx/ssl/nginx.crt
    key_file: /etc/nginx/ssh/nginx.key
    conf_file: /etc/nginx/conf/default.conf
    注意:变量文件不一定以.yml结尾,变量冒号后面必须有空格

4.Inventory使用参数: 
 用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量; 
 ansible_ssh_host 
 ansible_ssh_port 
 ansible_ssh_user 
 ansible_ssh_pass 
 ansible_sudo_pass 
 …
 
5.在角色调用时传递 
 roles: 
 - { role: ROLE_NAME, var: value, …}

6.set_fact自定义facts变量:
     set_fact模块可以自定义facts,这些自定义的facts可以通过template或者变量的方式
在playbook中使用。如果你想要获取一个进程使用的内存的百分比,则必须通过set_fact来进行计算之后得出其值,并将其值在playbook中引用。
下面是一个配置mysql innodb buffer size的示例:
- name: Configure MySQL
  hosts: mysqlservers
  tasks: 
    - name: install MySql
      yum: name=mysql-server state=installed
 
    - name: Calculate InnoDB buffer pool size
      set_fact: innodb_buffer_pool_size_mb="{{ ansible_memtotal_mb / 2 }}"
 
    - name: Configure MySQL 
      template: src=templates/my.cnf dest=/etc/my.cnf owner=root group=root mode=0644 
      notify: restart mysql 
 
    - name: Start MySQL 
      service: name=mysqld state=started enabled=yes 
  handlers: 
    - name: restart mysql 
      service: name=mysqld state=restarted

my.cnf的配置示例:
# {{ ansible_managed }}
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted
security risks
symbolic-links=0
 
# Configure the buffer pool
innodb_buffer_pool_size = {{ innodb_buffer_pool_size_mb|int }}M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

所有变量都可以在playbook或者jinja2模板中通过{{  varname }}中使用。另外,
当变量和jinja2的管道配合起来的时候能提供各种灵活的条件判断和变量处理。具体看下边两个例子。
如果第一个任务执行失败了才会执行第二个任务,可以这么写:
[root@ansible ansible]# cat wait.yml
---
- name: test
  hosts: web1
  tasks:
   - shell: /usr/bin/ls
     register: result
     ignore_errors: True
     
   - debug: msg="it failed"
     when: result|failed

变量的优先级
• -e 命令行指定的最高
• inventory文件定义的变量次之,其实inventory文件也分全局,group级别的和hosts级别的变量定义
• fact变量次之
• 角色的default变量优先级最低

===========================ansible模版======================

最简示例:
[root@ansible ansible]# cat wait.yml 
- name: user
  hosts: web1
  user: root
  vars:
  - user: "wing"
  - say: "wingfile"
  tasks:
  - name: task {{ user }}
    template: src=/root/testfile dest=/root/{{ say }}

[root@ansible ansible]# cat /root/testfile 
hello
i love {{ user }}

[root@ansible ansible]# ansible-playbook wait.yml 

===============================playbook===========

示例1:简单playbook
文档以---开头,没有也可以
[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml     //固定后缀为yml
---
  - hosts: webs
    user: root
    - name: playbook_test
      shell: touch /tmp/playbook.txt
      tags: suibian
核心元素:
Playbooks  
    Variables     #变量元素,可传递给Tasks/Templates使用;  
    Tasks          #任务元素,由模块定义的操作的列表,即调用模块完成任务;  
    Templates   #模板元素,使用了模板语法的文本文件,可根据变量动态生成配置文件;  
    Handlers     #处理器元素,通常指在某事件满足时触发的操作;  
    Roles          #角色元素
参数解释:
    hosts参数指定了对哪些主机进行操作;
    user参数指定了使用什么用户登录远程主机操作;
    tasks指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来。
    tags:给指定的任务定义一个调用标识,形式如下
        - name:cd  NAME
          module: arguments
          tags: TAG_ID
cd /etc/ansible
vim test.yaml
---
- hosts: webs
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

          
语法检测:
    [root@ansible ansible]# ansible-playbook --syntax-check test.yml 
    playbook: test.yml

测试运行 
    [root@master ansible]#ansible-playbook -C /path/to/playbook.yaml 
    可以使用如下参数:
        --list-hosts 
        --list-tasks 
        --list-tags 
        
运行Playbook:
    [root@master ansible]# ansible-playbook test.yml 

    只运行指定标记的任务:-t tags
    [root@ansible ansible]# ansible-playbook  -t 标记名称 test.yml 

    跳过某一个被标记的任务:--skip-tags=SKIP_TAGS 
    [root@ansible ansible]# ansible-playbook  --skip-tags=标记名称 test.yml 

    从某一个任务开始往下运行:--start-at-task 任务名称
    [root@ansible ansible]# ansible-playbook  --start-at-task "start httpd service" test.yml 

批量上传公钥

常用选项:

Options: (= is mandatory)(= 后面的参数是强制要有的)

- exclusive [default: no]: 是否移除 authorized_keys 文件中其它非指定 key

= key: SSH public key(s) 可以是字符串或 url,如:https://github.com/username.keys

- key_options [Default: None]: 附加到 key 中的字符串,该字符串会加到 key 的开头

- path [Default: (homedir)+/.ssh/authorized_keys]: 指定 authorized_keys 文件存放的位置

- state (Choices: present, absent) [Default: present]: present 添加指定 key 到 authorized_keys
 文件中;absent 从 authorized_keys 文件中移除指定 key

= user: 指定修改远端服务器上哪个用户的 authorized_keys

- manage_dir (Choices: yes, no) [Default: yes]: 指定模块是否应该管理 authorized key 文件所在的目录。
如果设置为 yes,模块会创建目录,以及设置一个已存在目录的拥有者和权限。如果通过 path 选项,重新指定
了一个 authorized key 文件所在目录,那么应该将该选项设置为 no
[root@localhost ~]# grep -v '#' /etc/ssh/ssh_config
StrictHostKeyChecking no
[root@localhost ~]# ansible webs --list-hosts
  hosts (2):
    10.0.0.21
    10.0.0.22

法一
[root@localhost ~]# cat push.ssh.ymal 
---
- hosts: webs
  remote_user: root
  tasks:
    - name: Set authorized key in alternate location
      authorized_key:
        user: root
        state: present
        key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
        #path: /etc/ssh/authorized_keys/charlie  \\指定远端存储的路径
        # manage_dir: False

[root@localhost ~]# ansible-playbook push.ssh.ymal -k
法二
[root@localhost ~]# ansible  webs  -m authorized_key -a "user=root key='{{ lookup('file','/root/.ssh/id_rsa.pub') }}'" -k

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • ansible ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、c...
    君惜丶阅读 1,159评论 0 0
  • ansible 系统架构 ansible简介ansible是新出现的自动化运维工具,ansible是一个配置管理和...
    运维阿文阅读 9,582评论 1 52
  • 第一步: 设置EPEL仓库 Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。 ...
    madfrog_hc阅读 775评论 0 0
  • 1.首先安装epel: 2.修改配置文件 3.yum install ansible -y
    JustFantasy阅读 527评论 0 0
  • 安装git yum -y install git 安装Ansible软件包 从github拉取指定版本的ansib...
    CaiGuangyin阅读 1,641评论 3 0