Centos7学习笔记(十五)- ansible初步
1、安装要求
管理主机:
必须不能是windows系统。类Uinx系统下,python版本为2.6或者2.7。OS X系统,需修改ulimit值才能使用ansible的多子进程。
托管节点:
Python版本不得低于2.4,如果Python版本低于2.4,那么需要安装python-simplejson模块。
2、ansible安装
redhat系需要安装epel源,fedora不用,可以直接安装
yum -y install ansible
(yum -y install libselinux-python,系统如果没这个包,需安装。在被操控主机(托管节点)上,也需要安装此软件,否则与copy/file/template相关的函数将不能使用)
3、基本的文件构成
/etc/ansible/hosts默认主机列表清单文件
/etc/ansible/ansible.cfg默认配置文件
/etc/ansible/roles/角色目录
4、基本的用法——公钥与密码
①公钥指纹的免yes确认。
三种方法:
1)/etc/ansible/ansible.cfg第71行,去除#符,修改为host_key_checking = False
2)/etc/ansible/ansible.cfg第375行,去除改行#注释,修改为
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no
3)ansible命令执行时,添加--ssh-common-args "-p 52113 -o StrictHostkeyChecking=no"选项。
ansible -u study -k --ssh-common-args "-p 52113 -o StrictHostKeyChecking=no" -m command -a "df -h" 172.16.1.71 SSH password: [WARNING]: sftp transfer mechanism failed on [172.16.1.71]. Use ANSIBLE_DEBUG=1 to see detailed information [WARNING]: scp transfer mechanism failed on [172.16.1.71]. Use ANSIBLE_DEBUG=1 to see detailed information 172.16.1.71 | CHANGED | rc=0 >> 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 476M 0 476M 0% /dev tmpfs 487M 0 487M 0% /dev/shm tmpfs 487M 7.6M 479M 2% /run tmpfs 487M 0 487M 0% /sys/fs/cgroup /dev/sda3 28G 2.0G 26G 8% / /dev/sda1 253M 136M 118M 54% /boot tmpfs 98M 0 98M 0% /run/user/1000
②免输入密码认证
1)在/etc/ansible/hosts文件中,指定托管主机的ssh_user,ssh_pass,ssh_port等。

2)密码统一的情况下,可修改/etc/ansible/ansible.cfg中default部分,指定密码。
3)用ssh公钥免密登录方式。
5、基本用法——基本模块
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
[--become-user BECOME_USER] [-K] [-i INVENTORY] [--list-hosts] [-l SUBSET] [-P
POLL_INTERVAL] [-B SECONDS] [-o] [-t TREE] [-k] [--private-key PRI‐
VATE_KEY_FILE] [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT] [--ssh-common-args
SSH_COMMON_ARGS] [--sftp-extra-args SFTP_EXTRA_ARGS] [--scp-extra-args
SCP_EXTRA_ARGS] [--ssh-extra-args SSH_EXTRA_ARGS] [-C] [--syntax-check] [-D]
[-e EXTRA_VARS] [--vault-id VAULT_IDS] [--ask-vault-pass | --vault-pass‐
word-file VAULT_PASSWORD_FILES] [-f FORKS] [-M MODULE_PATH] [--playbook-dir
BASEDIR] [-a MODULE_ARGS] [-m MODULE_NAME] pattern
ansible-doc -l ——用于列表出所有模块
ansible-doc -s 模块名 ——查看该“模块名”的所有使用参数
①command模块
[root@m01 ~/.ssh]#ansible-doc -s command - name: Execute commands on targets command: argv: # Passes the command as a list rather than a string. Use `argv' to avoid quoting values that would otherwise be interpreted incorrectly (for example "user name"). Only the string or the list form can be provided, not both. One or the other must be provided. chdir: # Change into this directory before running the command. #《=====相当于cd命令,改变到某目录。用法:-a "chdir=/root ls" cmd: # The command to run. creates: # A filename or (since 2.0) glob pattern. If it already exists, #《=======相当于测试[ -e 文件或目录 ],测试成功则不执行后续步骤。 this step *won't* be run. free_form: # The command module takes a free form command to run. There is no #《======= -a能跟的""里的命令内容,基本都属于free_form. actual parameter named 'free form'. removes: # A filename or (since 2.0) glob pattern. If it already exists, #《=======跟creates相反,当[ -e 文件或目录 ]成功时,执行后续步骤。 this step *will* be run. stdin: # Set the stdin of the command directly to the specified value. stdin_add_newline: # If set to `yes', append a newline to stdin data. strip_empty_ends: # Strip empty lines from the end of stdout/stderr in result. warn: # Enable or disable task warnings. #《========忽略或显示警告内容,布尔值,范围:0, 'on', 'f', 'false', 1, 'no', 'n', '1', '0', 't', 'y', 'off', 'yes', 'true'

②shell模块
shell跟command一样,不过shell支持管道等所有特殊字符
③copy模块
常用参数:
src——要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用"/"来结尾,则只复制目录里的内容,如果没有使用"/"来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
dest——必有参数。文件应被拷贝到的远程绝对路径。如果src是一个目录,dest也必须是目录。
ower——定义所拥有文件/目录的所属用户名称,类似chown功能
group——定义所拥有文件/目录的所属用户组名称,类似chown功能
mode——定义文件或目录的权限,等同于chmod,参数可以为“u+rwx or u=rw,g=r,o=r”形式,也可以是数字形式,新版本可以是preserve字串
backup——创建备份文件并包含时间戳信息,以便能够还原回文件,在某种情况下原文件被错误覆盖事。默认是no,可选值为yes、no。
content——当使用src参数时,将文件的内容直接设置为指定的值。远端创建有指定内容的文件,并且只能设置简单值。当设置复杂或格式化内容,用template模块。
force——默认为yes。当远程文件内容和源文件内容不同时,将覆盖目标文件。如果设置为no,文件将只被传输,在目标文件不存在时
remote-src——默认false。如果为true,那么将在远程/目标机器上搜索文件。2.8版本开始支持递归copy。
follow——yes/no。当拷贝的文件夹内有link存在的时候,那么拷贝过match去的也会有link
[study@c7study ~/.ssh]$ ansible www -u manager -m shell -a 'echo -e "abc\ndef" >/tmp/hosts'
156.96.148.72 | CHANGED | rc=0 >>
[study@c7study ~/.ssh]$ ansible www -u manager -m shell -a "cat /tmp/hosts"
156.96.148.72 | CHANGED | rc=0 >>
abc
def
[study@c7study ~/.ssh]$ ^C
[study@c7study ~/.ssh]$ ansible www -u manager -m copy -a "src=/etc/hosts dest=/tmp/hosts backup=yes" #《=====这里,用了backup=yes
156.96.148.72 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/hosts.19719.2020-09-15@16:11:52~",
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts",
"gid": 1001,
"group": "manager",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"mode": "0664",
"owner": "manager",
"size": 158,
"src": "/home/manager/.ansible/tmp/ansible-tmp-1600157497.67-3521-279608571329628/source",
"state": "file",
"uid": 1001
}
[study@c7study ~/.ssh]$ ansible www -u manager -m shell -a "cat /tmp/hosts"
156.96.148.72 | CHANGED | rc=0 >>
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[study@c7study ~/.ssh]$ ansible www -u manager -m shell -a "ls /tmp"
156.96.148.72 | CHANGED | rc=0 >>
ansible_command_payload_4WI3Xn
ansible_command_payload_z5ykCG
hosts
hosts.19719.2020-09-15@16:11:52~ #《===========这里,备份后的文件,附加了时间戳信息
percona-version-check
systemd-private-b551031a4dbc4015a42883a5cc5143e2-php-fpm.service-0AYW2P
[study@c7study ~/.ssh]$ ansible www -u manager -m shell -a "cat /tmp/hosts.19719.2020-09-15@16:11:52~"
156.96.148.72 | CHANGED | rc=0 >>
abc
def④script模块
作用:在远程主机上执行ansible主机上的脚本,且不需要将脚本复制到被执行的远程主机上。
参数:
脚本路径,必须参数
chdir:在执行脚本之前,先进入到指定目录
creates:当远程主机上的该文件存在时,不执行脚本;反之执行
removes:当远程主机上的该文件不存在时,不执行脚本;反之执行
⑤file模块
主要用于远程机器上的文件操作,file模块包含以下参数:
force:当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件。不过强制创建链接文件分为三种情况。情况一:当要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,会将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
group: 定义文件目录属性,用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
mode:定义文件目录的权限,比如,如果想要将文件权限设置为”rw-r-x---“,则可以使用mode=650进行设置,或者使用mode=0650,效果也是相同的。如果想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700。
owner:定义文件目录的所有者,属主对应的用户必须在远程主机中存在,否则会报错。
path:必选项,定义文件目录的路径。在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以
recurse: 只对目录有效,当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。
src:只适用于state=link或hard的情况。当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。
dest:被连接到的路径,,只适用于state=link或hard的情况
state:以下是stat的各种值
directory:如果目录不存在,创建目录
file:即使文件不存在,也不会被创建
link:创建软连接
hard:创建硬链接
touch:如果文件不存在时候,则则会创建一个新文件,如存在文件目录,则更新最后修改时间
absent:删除目录文件或者取消连接文件
⑥yum模块
参数比较多,常用的2个
name:需要安装的软件包名称,或包的版本标识信息
state:是否安装(present or installed, lastest),或者是删除(absent or removed)软件包
⑦systemed模块
常用的参数:
name:指定服务名称,必须是全称,比如crond.service
state:可以是started,stopped,restarted,reloaded四个值
enable:可以是yes或no的值
scope:可选值为user、system、global。该参数用于定义执行systemctl的能力。默认的应该为root用户,对应的是system的能力。对于user来说,执行命令的用户必须拥有开启dbus示例的权限。常规理解,对于普通拥有sudo权限的用户,则应制定为global。global是面向所有用户的。
[study@m01 ~]$ansible test -m systemd -a "name=crond.service state=restarted scope=global" #《=====“test”清单中的主机,均启用的是study的普通sudo用户开启ssh通道
[WARNING]: Target is a chroot. This can lead to false positives or prevent the init system
tools from working.
172.16.1.81 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"name": "crond.service",
"state": "restarted",
"status": {}
}
172.16.1.71 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"name": "crond.service",
"state": "restarted",
"status": {}
}
