Paramiko,PyYAML,Jinja2Python语言实现python和SSH(默认已安装),agentlessOpenSSHplaybook编排任务PKI(无需ssl)java、Golang…YAML格式,编排任务,支持丰富的数据结构/etc/ansible/hosts# 当没有加入主机清单的时候,可以采用-k选项输入用户密码进行登录.
ansible 10.1.6.87 -m ping -k [webserver]
192.168.1.10[1:103] 或者 192.168.1.10[1:3] # 代表的是192.168.101~103的主机
192.168.1.101:2222 # 如果对方的默认SSH端口不是22,需要制指定默认端口/etc/ssh/sshd_config# 将下面的配置选项修改为no即可
UseDNS no
GSSAPIAuthentication no   
GSSAPICleanupCredentials no  /etc/ansible/ansible.cfg[defaults]
#inventory      = /etc/ansible/hosts   # 主机清单文件
#library        = /usr/share/my_modules/   # 模块库存放目录
#module_utils   = /usr/share/my_module_utils/   # 模块路径
#remote_tmp     = ~/.ansible/tmp   
#local_tmp      = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml  # 插件的配置
#forks          = 5     # 并发执行,先执行5个主机
#poll_interval  = 15    # 监控
#sudo_user      = root   # 默认执行用户
#ask_sudo_pass = True
#ask_pass      = True
#transport      = smart
#remote_port    = 22
#module_lang    = C
#host_key_checking = False # 检查服务器对应的host_key 建议取消注释
#module_set_locale = False
log_path = /var/log/ansible.log   # 开启ansible操作日志记录ansible-doc: 显示模块帮助
    ansible-doc [options] [module...]
        -a            显示所有模块的文档
        -l, --list    列出可用模块
        -s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)
示例:
    ansible-doc -l      列出所有模块
    ansible-doc ping    查看指定模块帮助用法
    ansible-doc -s ping 查看指定模块帮助用法ansible <host-pattern> [-m module_name] [-a args]ansible <host-pattern> [-m module_name] [-a args]
ansible +被管理的主机(ALL) +模块  +参数
    --version              显示版本
    -m module              指定模块,默认为command
    -v                     详细过程 –vv -vvv更详细
    --list-hosts           显示主机列表,可简写 --list
    -k, --ask-pass         提示输入ssh连接密码,默认Key验证
    -C, --check            检查,并不执行
    -T, --timeout=TIMEOUT  执行命令的超时时间,默认10s
    -u, --user=REMOTE_USER 执行远程执行的用户
    -b, --become           代替旧版的sudo切换
        --become-user=USERNAME 指定sudo的runas用户,默认为root
    -K, --ask-become-pass  提示输入sudo时的口令匹配主机的列表
    All :表示所有Inventory中的所有主机
        ansible all –m ping
    * :通配符
        ansible "*" -m ping  (*表示所有主机)
        ansible 192.168.1.* -m ping  # 表示192.168.1.*的所有主机
        ansible "*srvs" -m ping
    或关系 ":"
        ansible "websrvs:appsrvs" -m ping    # 表示执行websrvs或appsrvs的主机清单
        ansible “192.168.1.10:192.168.1.20” -m ping   # 
    逻辑与 ":&"
        ansible "websrvs:&dbsrvs" –m ping    # 表示在websrvs组并且在dbsrvs组的主机才会执行
        在websrvs组并且在dbsrvs组中的主机
    逻辑非 ":!"
        ansible 'websrvs:!dbsrvs' –m ping   # 在websrvs组,但不在dbsrvs组中的主机
        在websrvs组,但不在dbsrvs组中的主机
        注意:此处为单引号
    综合逻辑
        ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping
    正则表达式
        ansible "websrvs:&dbsrvs" –m ping
        ansible "~(web|db).*\.magedu\.com" –m ping/etc/ansible/ansible.cfg通过连接https://galaxy.ansible.com 下载相应的roles
ansible-galaxy list # 列出已经安装的galaxy
ansible-galaxy install geerlingguy.nginx # 安装一个geerlingguy.nginx角色
ansible-galaxy remove geerlingguy.nginx # 删除ansible-vault encrypt进行对剧本的加密ansible-vault encrypt  [剧本文件]
ansible-vault encrypt hello.yaml 
New Vault password: 
Confirm New Vault password:xxxxxxxxxx anansible-vault encrypt hello.yaml New Vault password: Confirm New Vault password:加密的剧本不可直接运行
ansible-vault decrypt解密ansible-vault decrypt hello.yaml 2.0新加的,可以交互式执行命令root:表示操作的用户all: 表示当前要对那些主机进行操作(1): 表示包括几个主机[f:5]: 并发请求数量cd test # 进入test主机列表
forks 100 # 修改并发数
command ls /etc # 执行远程命令
hostname  name=ansible2 # 用法跟命令行一样ansible srvs -m command -a 'service vsftpd start'
ansible srvs -m command -a 'echo adong |passwd --stdin 123456'此命令不支持 $VARNAME < > | ; & 等,用shell模块实现 chdir: 进入到被管理主机目录 creates: 如果有一个目录是存在的,步骤将不会运行Command命令 removes: 如果一个目录不存在,则不会运行命令
Shell:和command相似,用shell执行命令ansible all -m shell  -a 'getenforce'  # 查看SELINUX状态
ansible all -m shell  -a "sed -i 's/SELINUX=.*/SELINUX=disabled' /etc/selinux/config"
ansible all -m shell -a 'echo magedu |passwd –stdin wang'调用bash执行命令 类似 cat /tmp/stanley.md | awk -F'|' '{print 1,2}' &> /tmp/example.txt
ansible all  -m script -a /data/test.shsrc : 源文件 指定拷贝文件的本地路径 (如果有/ 则拷贝目录内容,比拷贝目录本身)dest: 指定目标路径mode: 设置权限backup: 备份源文件content: 代替src 指定本机文件内容,生成目标主机文件owner : 应该拥有文件系统对象的用户的名称# 如果目标存在,默认覆盖,此处指定先备份
ansible all -m copy -a "src=/root/test1.sh dest=/tmp/test2.showner=wang mode=600 backup=yes"
# 指定内容,直接生成目标文件
ansible all -m copy -a "content='test content\nxxx' dest=/tmp/test.txt"注意:如果两个文件的内容一样,则backup=yes不会进行备份.
ansible all -m fetch -a 'src=/root/test.sh dest=/data/scripts'path: 要管理的文件路径 (强制添加)recurse: 递归,文件夹要用递归src: 创建硬链接,软链接时,指定源目标,配合’state=link' ‘state=hard’ 设置软链接,硬链接state: 状态 absent: 删除文件touch: 创建一个空文件direcory: 建立一个文件夹link: 建立软连接# 创建新文件
ansible all -m file -a 'path=/root/java.log state=touch'
# 创建一个目录,并且设置属主、属组、以及目录权限
ansible test -m file -a "path=/data/ state=directory owner=root group=root mode=644"
# 递归方法 recurse=yes
ansible test -m file -a "path=/data/ state=directory owner=root group=root mode=644 recurse=yes"
# 删除
ansible all -m file -a 'path=/root/java.log state=absent'ansible all -m hostname -a "name=app.adong.com"  更改一组的主机名
ansible 192.168.38.103 -m hostname -a "name=app2.adong.com" 更改单个主机名minute,hour,day,month,weekday注意:
name和job是必须添加的
# 每五分钟自动同步一次ntp时间服务器
ansible websrvs -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime" 
# 删除任务
ansible websrvs -m cron -a 'state=absent name=Synctime' 
# 禁用任务,任务不生效
ansible websrvs -m cron -a 'minute=*/10 job='/usr/sbin/ntpdate 172.30.0.100" name=synctime disabled=yes'present: 安装包absent: 卸载包latest: 如果包不是最新版本,则会进行更新update_cache: 检查是否需要更新缓存
 validate_certs: 是否检查SSL认证
 disable_gpg_check: 是否禁用gpg检查
 ansible all -m yum -a 'list=httpd'  # 查看程序列表
ansible all -m yum -a 'name=httpd state=present' # 安装
ansible all -m yum -a 'name=httpd state=absent' # 删除state stopped:停止服务started: 启动服务reloaded: 重新加载服务restarted: 重启服务ansible all -m service -a 'name=httpd state=stopped'  # 停止服务
ansible all -m service -a 'name=httpd state=started enabled=yes' # 启动服务,并设为开机自启
ansible all -m service -a 'name=httpd state=reloaded'  # 重新加载
ansible all -m service -a 'name=httpd state=restarted' # 重启服务home 指定家目录路径system 指定系统账号group 指定组remove 清除账户shell 指定shell类型ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1'
ansible all -m user -a 'name=user1 state=absent remove=yes'  # 清空用户所有数据
ansible all -m user -a 'name=app uid=88 system=yes home=/app groups=root shell=/sbin/nologin password="$1$zfVojmPy$ZILcvxnXljvTI2PhP2Iqv1"'  # 创建用户
ansible websrvs -m user -a 'name=app state=absent'  # 不会删除家目录ansible srv -m group -a "name=testgroup system=yes"   # 创建组
ansible srv -m group -a "name=testgroup state=absent" # 删除组ansible test -m setup -a 'filter=*hostname*'
[root@bogon ~]# ansible test -m setup -a 'filter=*ipv4*'
10.1.6.171 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.1.6.171"
        ], 
        "ansible_default_ipv4": {
            "address": "10.1.6.171", 
            "alias": "ens192", 
            "broadcast": "10.1.6.255", 
            "gateway": "10.1.6.254", 
            "interface": "ens192", 
            "macaddress": "00:0c:29:ee:66:b2", 
            "mtu": 1500, 
            "netmask": "255.255.255.0", 
            "network": "10.1.6.0", 
            "type": "ether"
        }, 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}get_url模块进行下载内容[root@bogon ~]# ansible test -m get_url -a "url=http://nginx.org/download/nginx-1.23.1.tar.gz dest=/usr/nginx-1.23.1.tar.gz"
10.1.6.205 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": true, 
    "checksum_dest": null, 
    "checksum_src": "17015c7a73ba4ec8c64c7d3a09d0c71892740a8d", 
    "dest": "/usr/nginx-1.23.1.tar.gz", 
    "elapsed": 1, 
    "gid": 0, 
    "group": "root", 
    "md5sum": "5cc3eeb0f866fbd2e3f4a9611837c62b", 
    "mode": "0644", 
    "msg": "OK (1104352 bytes)", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 1104352, 
    "src": "/root/.ansible/tmp/ansible-tmp-1660634222.63-2295-136850669667126/tmptku8eyyk", 
    "state": "file", 
    "status_code": 200, 
    "uid": 0, 
    "url": "http://nginx.org/download/nginx-1.23.1.tar.gz"
}checksum:md5:xxxxx进行md5校验ansible test -m get_url -a "url=http://nginx.org/download/nginx-1.23.1.tar.gz dest=/usr/nginx-1.23.1.tar.gz checksum=md5:5cc3eeb0f866fbd2e3f4a9611837c62b"