Ansible-基础

Posted xzkzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible-基础相关的知识,希望对你有一定的参考价值。

1、安装

通过Yum安装RPMs适用于 EPEL 6, 7, 以及仍在支持中的Fedora发行版.这里我们直接安装就行。

sudo yum install ansible

这里我们需要准备两台主机,我们需要在主机A上生成秘钥

 ssh-keygen -t rsa

编辑(或创建)/etc/ansible/hosts 并在其中加入一个或多个远程系统.你的public SSH key必须在这些系统的``authorized_keys``中:

$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]172.16.138.41
#新增系统,并命名为webhost主机组
$ vim /etc/ansible/hosts
[webhost]
172.16.138.40
172.16.138.41

2、远程执行命令

ansible all -m ping
172.16.138.40 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
172.16.138.41 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

我们也可以通过主机组执行命令

$ ansible webhost -m command -a  "w"
172.16.138.41 | CHANGED | rc=0 >>
 01:35:17 up 29 days,  3:34,  2 users,  load average: 0.24, 0.33, 0.27
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    172.16.40.86     23:29   41.00s  0.00s  0.00s -bash
root     pts/1    k8s-master       01:35    0.00s  0.06s  0.00s w

172.16.138.40 | CHANGED | rc=0 >>
 01:35:18 up 29 days,  3:34,  3 users,  load average: 0.98, 0.88, 0.86
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    172.16.40.86     23:06    1:08m  0.29s  0.29s -bash
root     pts/1    172.16.40.86     01:26    6.00s  1.11s  0.00s ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/2c6989e158 -tt 172.16.138.40 /bin/sh -c /usr/bin/python /root/.ansible/tmp/ansible-tmp-1553146517.04-153785974352870/AnsiballZ_command.py && sleep 0
root     pts/3    k8s-master       01:35    1.00s  0.10s  0.01s w
  • webhost 是指定的主机组
  • -m 是指定模块
  • -a 是执行的命令

这里还有一个shell模块。同样也支持写一个命令。

3、管理文件和目录

ansible 172.16.138.41 -m copy -a "src=/etc/ansible dest=/tmp/ansible_test owner=root group=root mode=755"
172.16.138.41 | CHANGED => {
    "changed": true,
    "dest": "/tmp/ansible_test/",
    "src": "/etc/ansible"
}

我们看一下目标主机下/tmp目录

[[email protected] tmp]# ls
ansible_test
[[email protected] tmp]# ls ansible_test/
ansible
[[email protected] tmp]#
  • src 指定源目录
  • dest 指定目标目录

需要注意的是,如果目标主机没有这个目录会自动创建这个目录,如果拷贝是文件,目标主机指定的名字和源如果不同,并且不是已经存在的目录,相当于copy过去又重命名。但相反,如果目标主机上已经处在的目录,则会直接把文件copy到该目录下。

3、脚本管理

我们先随便写一个脚本

#!/bin/bash
date >> /tmp/data.txt

ansible需要先把脚本copy到对应主机上

$ ansible 172.16.138.41 -m copy  -a "src=/tmp/1.sh dest=/tmp/test.sh owner=root group=root mode=755"
172.16.138.41 | CHANGED => {
    "changed": true,
    "checksum": "a0d6b0777539641b9aab412a0297b1273e836bbb",
    "dest": "/tmp/test.sh",
    "gid": 0,
    "group": "root",
    "md5sum": "fc416150a5e218531c550b98e6ea35b6",
    "mode": "0755",
    "owner": "root",
    "size": 36,
    "src": "/root/.ansible/tmp/ansible-tmp-1553151731.05-254487603693246/source",
    "state": "file",
    "uid": 0
}

执行远程脚本

ansible 172.16.138.41 -m shell -a "/tmp/test.sh"
172.16.138.41 | CHANGED | rc=0 >>

4、管理任务计划

ansible 172.16.138.41 -m cron -a "name=‘test cron‘ job=‘touch /tmp/111.txt‘ weekday=6"
172.16.138.41 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "test cron"
    ]
}
  • cron 定时任务模块
  • name 指定定时任务的名字
  • job 指定定时任务的内容
  • weekday 指定是时间计划,也可以使用*****表示

我们看一下目录主机的定时任务

$ crontab -l
#Ansible: test cron
* * * * 6 touch /tmp/111.txt

我们看到有个Ansible的表示,下面是定时任务的内容。

我们可以通过state=absent 来删除定时任务

$ ansible 172.16.138.41 -m cron -a "name=‘test cron‘ state=absent"
172.16.138.41 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": []
}

5、Playbook

playbook就是把一些模块的集合搞到一个文件里。

例如:

---   #表示开始
- hosts: 172.16.138.41   #指定远程主机
  remote_user: root   #指定远程用户
  tasks:   #任务
    - name: test_playbook   #任务名字
      shell: touch /tmp/playbook.txt   #具体的任务,核心

执行

ansible-playbook /etc/ansible/test.yaml

PLAY [172.16.138.41] ******************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [172.16.138.41]

TASK [test_playbook] ******************************************************************************************************************
 [WARNING]: Consider using the file module with state=touch rather than running touch.  If you need to use command because file is
insufficient you can add warn: false to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

changed: [172.16.138.41]

PLAY RECAP ****************************************************************************************************************************
172.16.138.41              : ok=2    changed=1    unreachable=0    failed=0

6、Playbook变量

我们创建一个用户。通过变量传过去

---
- name: create_user
  hosts: 172.16.138.41
  remote_user: root
  gather_facts: false
  vars:
    - user: "zzkk"
  tasks:
    - name: create-user
      user: name="{{ user }}"

执行:

ansible-playbook /etc/ansible/user.yaml

PLAY [create_user] ********************************************************************************************************************

TASK [create-user] ********************************************************************************************************************
changed: [172.16.138.41]

PLAY RECAP ****************************************************************************************************************************
172.16.138.41              : ok=1    changed=1    unreachable=0    failed=0

7、playbook循环

创建三个文件,并修复其权限为600

---
- hosts: 172.16.138.41
  user: root
  task:
    - name: "touch 1 2 3 file and change file mode"
      file: path=/tmp/{{ item }} state=touch mode=600
      with_items:
        - 1.txt
        - 2.txt
        - 3.txt

执行:

ansible-playbook /etc/ansible/while.yaml

PLAY [172.16.138.41] ******************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [172.16.138.41]

TASK [touch 1 2 3 file and change file mode] ******************************************************************************************
changed: [172.16.138.41] => (item=1.txt)
changed: [172.16.138.41] => (item=2.txt)
changed: [172.16.138.41] => (item=3.txt)

PLAY RECAP ****************************************************************************************************************************
172.16.138.41              : ok=2    changed=1    unreachable=0    failed=0

8、playbook 条件判断

我们查看一下gather_facts收集到的信息,来作为我们判断的条件,这里我们要获取IP地址。

ansible 172.16.138.41 -m setup
....
"ansible_ens160": {
            "active": true,
            "device": "ens160",
.... 
 "ipv4": {
                "address": "172.16.138.41",
                "broadcast": "172.16.138.255",
                "netmask": "255.255.255.0",
                "network": "172.16.138.0"
            },
....

我们写一个判断条件 当ansible_ens160.ipv4.address = 172.16.138.41 执行创建文件

---
- hosts: webhost
  user: root
  gather_facts: True
  tasks:
    - name: stady when
      shell: touch /tmp/when.txt
      when: ansible_ens160.ipv4.address == "172.16.138.41"

执行结果:

ansible-playbook /etc/ansible/when.yaml

PLAY [webhost] ************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [172.16.138.41]
ok: [172.16.138.40]

TASK [stady when] *********************************************************************************************************************
skipping: [172.16.138.40]
 [WARNING]: Consider using the file module with state=touch rather than running touch.  If you need to use command because file is
insufficient you can add warn: false to this command task or set command_warnings=False in ansible.cfg to get rid of this message.

changed: [172.16.138.41]

PLAY RECAP ****************************************************************************************************************************
172.16.138.40              : ok=1    changed=0    unreachable=0    failed=0
172.16.138.41              : ok=2    changed=1    unreachable=0    failed=0

这里我们看到跳过172.16.138.40,172.16.138.41中执行。

 

8、playbook Handlers

module 具有”幂等”性,所以当远端系统被人改动时,可以重放 playbooks 达到恢复的目的. playbooks 本身可以识别这种改动,并且有一个基本的 event system(事件系统),可以响应这种改动.

(当发生改动时)’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions 只会被触发一次.

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

样例:

---
- name: handler test
  hosts: 172.16.138.41
  user: root
  tasks:
    - name: copy file
      copy: src=/etc/passwd dest=/tmp/aaaaa.txt
      notify: test handlers
  handlers:
    - name: test handlers
      shell: echo "1111" >> /tmp/aaaaa.txt

执行:

ansible-playbook /etc/ansible/handler.yaml

PLAY [handler test] *******************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [172.16.138.41]

TASK [copy file] **********************************************************************************************************************
changed: [172.16.138.41]

RUNNING HANDLER [test handlers] *******************************************************************************************************
changed: [172.16.138.41]

PLAY RECAP ****************************************************************************************************************************
172.16.138.41              : ok=3    changed=2    unreachable=0    failed=0

 Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

 

以上是关于Ansible-基础的主要内容,如果未能解决你的问题,请参考以下文章

[vscode]--HTML代码片段(基础版,reactvuejquery)

基础Ansible 自动化运维工具简单入门

Ansible 时间同步全自动化实现

Ansible基础使用

Ansible基础知识

使用 Testinfra 和 Ansible 验证服务器状态 | Linux 中国