Skip to main content

ansible 学习基础

ansible 基础

ansible, ansible-doc, ansible-galaxy, ansible-lint, ansible-playbook, ansible-pull, ansible-vault

管理节点

ssh映射: 10.44.111.115:179

安装常用工具

sudo yum install -y vim wget lrzsz screen
username root/develop
password 2019@eagle/develop
  • ip: 172.17.163.179
  • netmask 255.255.255.240
  • gateway
  • route 172.17.163.177
  • DNS 172.17.163.177

控制管理节点安装 ansible

sudo yum install ansible -y

使用 ssh-keygen 生成 ssh key 并使用 ssh-copy-id 分发到 server 节点

[develop@localhost ~]$ ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/home/develop/.ssh/id_rsa): 
Created directory '/home/develop/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/develop/.ssh/id_rsa.
Your public key has been saved in /home/develop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:i8laZFq8RAnOUEBdWLIy8LpDbZUiri9MbFmh+RKnUz4 develop@localhost.locald
The key's randomart image is:
+---[RSA 2048]----+
|..++++o          |
| o =o+..         |
| .*.=oo          |
|.=o*oo           |
|ooXo  * S        |
|oX.E B + .       |
|B o o * .        |
|.+   o           |
| .. .            |
+----[SHA256]-----+

[develop@localhost ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFCAJp1+ER36dn1HN92/e2VbFAex1bLvaKEqXyG07l7NmQ0hXsfLHHMFkaHgRiVKdRccNe1gFOvRmmApxTocm+6X/S+e6SRQUjTlnVlOLWpKG42MqaEnmfNYb10uWrRKboBVUpt4xCIvd41TDAyqSQq5lPPPFPkc5J7vs9DIc1C5Seuzl2epMRhLQ195QPntxjLeD/Pgt+f7TCt8Q7PAkYWFwkIjcozUtFTS69CHobiMec5xPhpfWDUb7El8yC8KVR7hcFeDEG/gkqaU5Hzgow96T182jZG8ujOwVJ9dltpKuWvFnKxavZqVcooiCyi3jXjI2oaY8kdOKvvxJjWhwH develop@localhost.localdomain
[develop@localhost ~]$ 


[develop@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.17.163.181
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/develop/.ssh/id_rsa.pub"
The authenticity of host '172.17.163.181 (172.17.163.181)' can't be established.
ECDSA key fingerprint is SHA256:iVZEKj9NsHP/zhwdfu/gZLfV51LIsidtEhp2HpNg9k0.
ECDSA key fingerprint is MD5:54:99:0d:aa:e8:c5:8a:5e:f2:e6:a6:e9:4c:d6:db:ac.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
develop@172.17.163.181's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '172.17.163.181'"
and check to make sure that only the key(s) you wanted were added.

[develop@localhost ~]$ ssh 172.17.163.181
Last login: Sat Nov  2 14:00:59 2019 from gateway
[develop@localhost ~]$ exit
登出
Connection to 172.17.163.181 closed.
[develop@localhost ~]$ 


配置 ansible 文件

sudo vim /etc/ansible/ansible.cfg

sudo vim /etc/ansible/hosts

配置 host

sudo vim /etc/ansible/hosts

追加参数:


server-spring-cloud ansible_ssh_host=10.44.111.231 ansible_ssh_port=22 ansible_ssh_user=spring-cloud ansible_ssh_pass=spring-cloud

server-test-vars ansible_ssh_host=10.44.111.127 ansible_ssh_port=2222 ansible_ssh_user=develop ansible_ssh_pass=develop

[test]
172.17.163.179
172.17.163.181
172.17.163.186
172.17.163.184

[test:vars] # 属性
ansible_ssh_port=22
ansible_ssh_user=develop
ansible_ssh_pass=develop

[test:children] # 继承
10.44.111.127
server-centos-01 ansible_ssh_host=10.44.111.115  ansible_ssh_port=179 ansible_ssh_pass=develop
server-centos-02 ansible_ssh_host=10.44.111.115  ansible_ssh_port=181 ansible_ssh_pass=develop
server-ubuntu-01 ansible_ssh_host=10.44.111.115  ansible_ssh_port=190 ansible_ssh_pass=develop
server-ubuntu-02 ansible_ssh_host=10.44.111.115  ansible_ssh_port=189 ansible_ssh_pass=develop

inventory 内置参数

ansible_ssh_host # 要连接的主机名
ansible_ssh_port # 端口号默认是22
ansible_ssh_user # ssh连接时默认使用的用户名
ansible_ssh_pass # ssh连接时的密码
ansible_sudo_pass # 使用sudo连接用户是的密码
ansible_ssh_private_key_file # 秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type # shell的类型默认sh
ansible_connection # SSH 连接的类型: local , ssh , paramiko在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提)
ansible_python _ interpreter #用来指定 python 解释器的路径,同样可以指定ruby 、perl 的路径

测试

ansible test -m shell -a 'echo "Hello Ansible.." && date'

172.17.163.186 | SUCCESS | rc=0 >>
Hello Ansible..
2019年 11月 02日 星期六 14:47:00 CST

172.17.163.184 | SUCCESS | rc=0 >>
Hello Ansible..
2019年 11月 02日 星期六 14:47:00 CST

172.17.163.181 | SUCCESS | rc=0 >>
Hello Ansible..
2019年 11月 02日 星期六 14:47:00 CST

172.17.163.179 | SUCCESS | rc=0 >>
Hello Ansible..
2019年 11月 02日 星期六 14:47:00 CST

[develop@localhost ~]$ 

动态 inventory

动态inventory的意思是所有的变量可以从外部获取,也就是说我们可以从CMDB以及zabbix系统拉取所有的主机信息然后使用ansible进行管理。引用inventory只需要把ansible.cfg文件中的inventory定义值改成一个执行脚本即可

#!/usr/bin/env python
# coding=utf-8
import json
masterIp = ['172.17.163.179']
slaveIp = ['172.17.163.181','172.17.163.186','172.17.163.184']
masterGroup = 'master'
slaveGroup = 'slave'
hostdata = {masterGroup:{"hosts":masterIp},slaveGroup:{"hosts":slaveIp}}
print json.dumps(hostdata,indent=4)

[develop@localhost ~]$ python inverti.py 
{
    "slave": {
        "hosts": [
            "172.17.163.181", 
            "172.17.163.186", 
            "172.17.163.184"
        ]
    }, 
    "master": {
        "hosts": [
            "172.17.163.179"
        ]
    }
}

[root@vagrant-centos65 opt]# ansible -i inverti.py all -a 'date'
SSH password: 
192.168.1.15 | SUCCESS | rc=0 >>
 07:25:27 up  3:56,  3 users,  load average: 0.00, 0.00, 0.00
192.168.1.110 | SUCCESS | rc=0 >>
 07:25:27 up 7 min,  3 users,  load average: 0.00, 0.02, 0.00

ping 模块

ansible test -m ping

setup模块

获取主机信息

ansible test -m setup

过滤

ansible test -m setup -a 'filter=ansible_default_ipv4'
ansible test -m setup -a 'filter=ansible_memory_mb'
ansible test -m setup -a 'filter=*mb'

参数

ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例: centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例: 32位,还是64位。
ansible_eth0: 仅显示eth0的信息。
ansible_hostname: 仅显示主机名。
ansible_kernel: 仅显示内核版本。
ansible_lvm: 显示lvm相关信息。
ansible_memtotal_mb: 显示系统总内存。
ansible_memfree_mb: 显示可用系统内存。
ansible_memory_mb: 详细显示内存情况。
ansible_swaptotal_mb: 显示总的swap内存。
ansible_swapfree_mb: 显示swap内存的可用内存。
ansible_mounts: 显示系统磁盘挂载情况。
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
ansible_python_version: 显示python版本。

file 模块

https://docs.ansible.com/ansible/latest/cli/ansible.html

file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等

[develop@localhost ~]$ ansible test -m file -a 'src=/etc/fstab dest=/home/develop/fstab state=link'
172.17.163.186 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/fstab", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0777", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 10, 
    "src": "/etc/fstab", 
    "state": "link", 
    "uid": 1000
}
172.17.163.184 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/fstab", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0777", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 10, 
    "src": "/etc/fstab", 
    "state": "link", 
    "uid": 1000
}
172.17.163.181 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/fstab", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0777", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 10, 
    "src": "/etc/fstab", 
    "state": "link", 
    "uid": 1000
}
172.17.163.179 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/fstab", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0777", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 10, 
    "src": "/etc/fstab", 
    "state": "link", 
    "uid": 1000
}
[develop@localhost ~]$ ansible test -a 'ls -l'
172.17.163.181 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab

172.17.163.186 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab

172.17.163.184 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab

172.17.163.179 | SUCCESS | rc=0 >>
总用量 108
lrwxrwxrwx. 1 develop develop     10 11月  2 16:42 fstab -> /etc/fstab
-rwxrwxr-x. 1 develop develop    295 11月  2 15:42 inverti.py
-rw-rw-r--. 1 develop develop 102710 11月  2 16:26 sysinfo

[develop@localhost ~]$ 





[develop@localhost ~]$ ansible test -m file -a 'path=/home/develop/touch.txt state=touch'
172.17.163.186 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/touch.txt", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0664", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
172.17.163.181 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/touch.txt", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0664", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
172.17.163.184 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/touch.txt", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0664", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
172.17.163.179 | SUCCESS => {
    "changed": true, 
    "dest": "/home/develop/touch.txt", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0664", 
    "owner": "develop", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
[develop@localhost ~]$ ansible test -a 'ls -l'
172.17.163.184 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab
-rw-rw-r--. 1 develop develop  0 11月  2 16:45 touch.txt

172.17.163.186 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab
-rw-rw-r--. 1 develop develop  0 11月  2 16:45 touch.txt

172.17.163.181 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab
-rw-rw-r--. 1 develop develop  0 11月  2 16:45 touch.txt

172.17.163.179 | SUCCESS | rc=0 >>
总用量 108
lrwxrwxrwx. 1 develop develop     10 11月  2 16:42 fstab -> /etc/fstab
-rwxrwxr-x. 1 develop develop    295 11月  2 15:42 inverti.py
-rw-rw-r--. 1 develop develop 102710 11月  2 16:26 sysinfo
-rw-rw-r--. 1 develop develop      0 11月  2 16:45 touch.txt

[develop@localhost ~]$ 

参数

  • force: 需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项: yes|no
  • group: 定义文件/目录的属组
  • mode: 定义文件/目录的权限
  • owner: 定义文件/目录的属主
  • path: 必选项,定义文件/目录的路径
  • recurse: 递归的设置文件的属性,只对目录有效
  • src: 要被链接的源文件的路径,只应用于state=link的情况
  • dest: 被链接到的路径,只应用于state=link的情况
  • state:
    • directory: 如果目录不存在,创建目录
    • file: 即使文件不存在,也不会被创建
    • link: 创建软链接
    • hard: 创建硬链接
    • touch: 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    • absent: 删除目录、文件或者取消链接文件

copy模块

[develop@localhost ~]$ ansible test -m copy -a 'src=/home/develop/xxx dest=/home/develop/xxx owner=develop mode=0700'
172.17.163.184 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0700", 
    "owner": "develop", 
    "path": "/home/develop/xxx", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
172.17.163.181 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0700", 
    "owner": "develop", 
    "path": "/home/develop/xxx", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
172.17.163.186 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0700", 
    "owner": "develop", 
    "path": "/home/develop/xxx", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
172.17.163.179 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "gid": 1000, 
    "group": "develop", 
    "mode": "0700", 
    "owner": "develop", 
    "path": "/home/develop/xxx", 
    "secontext": "unconfined_u:object_r:user_home_t:s0", 
    "size": 0, 
    "state": "file", 
    "uid": 1000
}
[develop@localhost ~]$ ansible test -a 'ls -l'
172.17.163.181 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab
-rw-rw-r--. 1 develop develop  0 11月  2 16:45 touch.txt
-rwx------. 1 develop develop  0 11月  2 17:41 xxx

172.17.163.186 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab
-rw-rw-r--. 1 develop develop  0 11月  2 16:45 touch.txt
-rwx------. 1 develop develop  0 11月  2 17:41 xxx

172.17.163.184 | SUCCESS | rc=0 >>
总用量 0
lrwxrwxrwx. 1 develop develop 10 11月  2 16:42 fstab -> /etc/fstab
-rw-rw-r--. 1 develop develop  0 11月  2 16:45 touch.txt
-rwx------. 1 develop develop  0 11月  2 17:41 xxx

172.17.163.179 | SUCCESS | rc=0 >>
总用量 108
lrwxrwxrwx. 1 develop develop     10 11月  2 16:42 fstab -> /etc/fstab
-rwxrwxr-x. 1 develop develop    295 11月  2 15:42 inverti.py
-rw-rw-r--. 1 develop develop 102710 11月  2 16:26 sysinfo
-rw-rw-r--. 1 develop develop      0 11月  2 16:45 touch.txt
-rwx------. 1 develop develop      0 11月  2 17:34 xxx

[develop@localhost ~]$ 
名称 必选 默认值 可选值 备注
backup no no yes/no 在覆盖之前将原文件备份,备份文件包含时间信息
content no 当用content代替src参数的时候,可以把文档的内容设置到特定的值
dest yes 目标绝对路径。如果src是一个目录,dest也必须是一个目录。如果dest是不存在的路径,并且如果dest以/结尾或者src是目录,则dest被创建。如果srcdest是文件,如果dest的父目录不存在,任务将失败
follow no no yes/no 是否遵循目的机器中的文件系统链接
force no yes yes/no 当内容不同于源时,将替换远程文件。设置为no,则只有在目标不存在的情况下才会传输文件
group no 设置文件/目录的所属组,将被馈送到chown
local_follow no yes yes/no 是否遵循本地机器中的文件系统链接
mode no 设置文件权限,模式实际上是八进制数字(如0644),少了前面的零可能会有意想不到的结果。从版本1.8开始,可以将模式指定为符号模式(例如u+rwx或u=rw,g=r,o=r)
owner no 设置文件/目录的所属用户,将被馈送到chown
remote_src(2.0+) no no yes/no 如果yes它会从目标机上搜索src文件
src no 将本地路径复制到远程服务器; 可以是绝对路径或相对的。如果是一个目录,它将被递归地复制。如果路径以/结尾,则只有该目录下内容被复制到目的地,如果没有使用/来结尾,则包含目录在内的整个内容全部复制
unsafe_writes no yes/no 是否以不安全的方式进行,可能导致数据损坏
validate no None 复制前是否检验需要复制目的地的路径

service 模块

1、启动服务:

ansible test -m service -a "name=nginx state=started"

2、停止服务:

ansible test -m service -a "name=nginx state=stopped"

3、重启服务:

ansible test -m service -a "name=nginx state=restarted"

4、开机启动:

ansible test -m service -a "name=nginx enable=yes"

5、停止开机启动:

ansible test -m service -a "name=nginx enable=no"

6、带参数启动:

ansible test -m service -a "name=network state=restarted args=eth0"
  • name参数:此参数用于指定需要操作的服务名称,比如 nginx
  • state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 startedstoppedrestartedreloaded
  • enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

. . . . . . . .

playbook

首先简单说明一下 playbookplaybook 是什么呢?根本上说 playbookshell 脚本没有任何的区别, playbook 就像 shell 一样,也是把一堆的命令组合起来,然后加入对应条件判断等等,在shell脚本中是一条一条的命令,而在 playbook 中是一个一个的 task 任务构成,每个 task 任务可以看做 shell 中的一条命令;shell脚本一般只是在当前服务器上执行,而 playbook 则是在不止一个服务器上执行,因此 playbook 需要在其中指定运行该 playbook 的服务器名。

playbook的语法结构

playbook 使用 yml 标记语言,这是一种标记语言,这种标记语言在文件的最开始需要使用三个“-”来说明文件开始,然后使用缩进来说明代码块的范围。下面通过一个简易的实例,来说明playbook的语法。【实例来自官方文档】

---                             #标记文件的开始
- hosts: webservers             #指定该playbook在哪个服务器上执行
  vars:                         #表示下面是定义的变量,
    http_port: 80               #变量的形式,key: value,这里http_port是变量名,80是值
    max_clients: 200
  remote_user: root             #指定远程的用户名,这里缩进和vars保持了一致,说明变量的代码块已经结束。
  tasks:                        #下面构成playbook的tasks,每个task都有 - name: 开始,name指定该任务的名称。
  - name: ensure apache is at the latest version  #指定该任务的名称。
    yum: pkg=httpd state=latest                   #yum说明要是用的模板名称,后面指定对应的参数,这两行结合起来就相当于一个shell命令。

  - name: write the apache config file            #每个task之间可以使用空行来做区分。
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf

#需要说明的是缩进的意义和python中缩进的意义是一样,是来区分代码块的。
  • 核心元素

Tasks:任务,由模板定义的操作列表 Variables:变量 Templates:模板,即使用模板语法的文件 Handlers:处理器 ,当某条件满足时,触发执行的操作 Roles:角色

  • hosts和users介绍

在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。其中remote_user表示执行的用户账号。

---
- hosts: test                        #指定主机组,可以是一个或多个组。
  remote_user: root                #指定远程主机执行的用户名

指定远程主机sudo切换用

# vim ping.yml
---
- hosts: test
  remote_user: root
  become: yes                 #2.6版本以后的参数,之前是sudo,意思为切换用户运行
  become_user: mysql          #指定sudo用户为mysql

执行playbook
# ansible-playbook ping.yml -K
  • Tasks list 和 action 介绍

1:Play的主体部分是task列表, task 列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。 在运行playbook时(从上到下执行),如果一个host执行task失败,整个tasks都会回滚,请修正playbook 中的错误,然后重新执行即可。 Task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。 2:每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。如果没有定义name,‘action’的值将会用作输出信息中标记特定的task。 3:定义一个task,常见的格式:”module: options” 例如:yum: name=httpd 4:ansible的自带模块中,command模块和shell模块无需使用key=value格式

playbook基础使用

ansible-playbook playbook.yml [options]

-u REMOTE_USER, --user=REMOTE_USER 
# ssh 连接的用户名 
-k, --ask-pass 
#ssh登录认证密码 
-s, --sudo 
#sudo 到root用户,相当于Linux系统下的sudo命令
-U SUDO_USER, --sudo-user=SUDO_USER 
#sudo 到对应的用户 
-K, --ask-sudo-pass #用户的密码(—sudo时使用) 
-T TIMEOUT, --timeout=TIMEOUT 
# ssh 连接超时,默认 10 秒 
-C, --check # 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改 
-e EXTRA_VARS, --extra-vars=EXTRA_VARS 
# 设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e 
-f FORKS, --forks=FORKS # 进程并发处理,默认 5 
-i INVENTORY, --inventory-file=INVENTORY 
# 指定 hosts 文件路径,默认 default=/etc/ansible/hosts 
-l SUBSET, --limit=SUBSET 
# 指定一个 pattern,对- hosts:匹配到的主机再过滤一次 
--list-hosts # 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook 
--list-tasks # 列出该 playbook 中会被执行的 task 
--private-key=PRIVATE_KEY_FILE # 私钥路径 
--step # 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍 
--syntax-check # 只检测 playbook 文件语法是否有问题,不会执行该 playbook 
-t TAGS, --tags=TAGS #当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔 
--skip-tags=SKIP_TAGS # 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行 
-v, --verbose #输出更详细的执行过程信息,-vvv可得到所有执行过程信息。

原文链接:https://www.imooc.com/article/22729
  • 常用命令
  • ansible-playbook [yaml文件名、也可以yml结尾]
  • 例如:ansible-playbook a.yml
  • 参数:

-k(–ask-pass) 用来交互输入ssh密码 -K(-ask-become-pass) 用来交互输入sudo密码 -u 指定用户

ansible-playbook a.yml --syntax-check    #检查yaml文件的语法是否正确
ansible-playbook a.yml --list-task       #检查tasks任务
ansible-playbook a.yml --list-hosts      #检查生效的主机
ansible-playbook a.yml --start-at-task='Copy Nginx.conf'     #指定从某个task开始运行
  • 示例
# vim a.yml
---
- hosts: 192.168.200.129                  //指定主机
    remote_user: root                         //指定在被管理的主机上执行任务的用户
    tasks:                                            //任务列表↓
     - name: disable selinux                //任务名关闭防火墙
       command: '/sbin/setenforce 0'    //调用command模块 执行关闭防火墙命令
     - name: start httpd                         //任务名 开启httpd
       service: name=httpd state=started         //调用service模块 开启httpd 服务
# ansible-playbook a.yml --syntax-check    #检查yaml文件的语法是否正确
# ansible-playbook a.yml
  • 综合练习
mkdir -p ansible-playbook/roles/nginx/tasks

cd ansible-playbook

touch site.yml

touch roles/nginx/tasks/main.yml

site.yml

---
- hosts: dev1
  gather_facts: no
  remote_user: develop
  roles:
    - nginx

roles/nginx/tasks/main.yml

---
- name: install nginx
  yum: name=nginx state=present
- name: start service nginx
  service: name=nginx state=restated

ansible-playbook site.yml --syntax-check

ansible-playbook roles/nginx/tasks/main.yml --syntax-check

ansible centos -m user -a 'name=gdtcs'

vim chgpwd.yml

---
- hosts: centos
  gather_facts: false
  remote_user: root
  tasks:
  - name: Change password
    user: name={{ username }} password={{ passwd | password_hash('sha512') }} update_password=always

ansible-playbook chgpwd.yml -e "username=root passwd=root"

ansible centos -a 'yum install -y /root/docker/docker-ce-19.03.3-3.el7.x86_64.rpm'