此快速参考备忘单提供了使用 Ansible 的各种方法。
入门 安装 安装命令 环境 brew install ansiblemacos yum install -y ansiblecentos pip install ansiblepython
配置位置 文件路径 说明 /etc/ansible/ansible.cfg系统范围的配置 ~/ansible.cfg用户特定的配置 $pwd/ansible.cfg当前目录下的配置
配置文件优先级
如果没有任何其他配置文件,默认使用 /etc/ansible/ansible.cfg ~/.ansible.cfg 家目录下的 .ansible.cfg当前目录下的 ansible.cfg,即在同一目录下 ansible.cfg 优先级高于 ~/.ansible.cfg 环境变量 exoport ANSIBLE_CONFIG=/$DIR/ansible.cfg 查看正在使用的 ansible 配置文件:
1 ansible --version | grep "config file"
Inventory文件(hosts列表) 静态Inventory /etc/ansible/hosts
1 2 3 4 5 mail.example.com [webservers] foo.example.com bar.example.com
Inventory 主机组使用多个IP和域名 1 2 3 4 [web] 172.18.12.5[1:4] [webservers] www[01:50] .example.com
Inventory 主机组使用子主机组 1 2 3 4 5 [usa:children] southeast northeast southwest northwest
给多台主机设置变量 group variables 如果组中的所有主机共享一个变量值,则可以一次将该变量应用于整个组
1 2 3 4 5 6 7 8 [atlanta] host1 host2 [atlanta:vars] ntp_server =ntp.atlanta.example.comproxy =proxy.atlanta.example.com
命令行(ad-hoc) ansible 检查Inventory是否生效
1 $ ansible all --list-hosts
ping所有目标
ping本地(不使用SSH连接)
1 $ ansible all -i localhost, -e '{"ansible_connection": "local"}' -m ping
本地执行命令
1 $ ansible all -i localhost, -e '{"ansible_connection": "local"}' -a 'hostname'
获取本地主机的信息
1 $ ansible all -i localhost, -e '{"ansible_connection": "local"}' -m setup
获取远程到本地
1 $ ansible target -m fetch -a "src=/tmp/seq dest=/tmp/seq"
拷贝本地到远程
1 $ ansible target -m copy -a "src=/tmp/seq dest=/tmp/seq"
Ansible 命令帮助 1 2 $ ansible $ ansible <host-pattern> [options]
:- - -a MODULE_ARGS, --args=MODULE_ARGS模块参数 --ask-vault-pass询问保险库密码 -B SECONDS, --background=SECONDS异步运行,X 秒后失败 (默认=N/A) -C, --check不要做任何改变;相反,尝试预测可能发生的一些变化 -D, --diff更改(小)文件和模板时,显示这些文件中的差异; 与 --check 配合使用效果很好 -e EXTRA_VARS, --extra-vars=EXTRA_VARS将附加变量设置为 key=value 或 YAML/JSON -f FORKS, --forks=FORKS指定要使用的并行进程数 (default=5) -h, --help显示此帮助信息并退出 -i INVENTORY, --inventory-file=INVENTORY指定清单主机路径(默认=/etc/ansible/hosts)或逗号分隔的主机列表 -l SUBSET, --limit=SUBSET进一步将选定主机限制为其他模式 --list-hosts输出匹配主机列表;不执行任何其他操作 -m MODULE_NAME, --module-name=MODULE_NAME要执行的模块名称 (default=command) -M MODULE_PATH, --module-path=MODULE_PATH指定模块库的路径 (default=None) --new-vault-password-file=NEW_VAULT_PASSWORD_FILE用于重新生成密钥的新保管库密码文件 -o, --one-line压缩输出 --output=OUTPUT_FILE用于加密或解密的输出文件名; 使用 - 用于标准输出 -P POLL_INTERVAL, --poll=POLL_INTERVAL如果使用 -B 则设置轮询间隔(default=15) --syntax-check对 playbook 执行语法检查,但不要执行它 -t TREE, --tree=TREE将输出记录到此目录 --vault-password-file=VAULT_PASSWORD_FILE保险库密码文件 -v, --verbose详细模式(-vvv 更多,-vvvv 启用连接调试) --version显示程序的版本号并退出
控制谁以及如何连接到主机,连接选项:
:- - -k, --ask-pass询问连接密码 --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE使用此文件来验证连接 -u REMOTE_USER, --user=REMOTE_USER以此用户身份连接(default=None) -c CONNECTION, --connection=CONNECTION要使用的连接类型 (default=smart) -T TIMEOUT, --timeout=TIMEOUT以秒为单位覆盖连接超时 (default=10) --ssh-common-args=SSH_COMMON_ARGS指定要传递给 sftp/scp/ssh 的常用参数 (e.g. ProxyCommand) --sftp-extra-args=SFTP_EXTRA_ARGS指定仅传递给 sftp 的额外参数 (e.g. -f, -l) --scp-extra-args=SCP_EXTRA_ARGS指定仅传递给 scp 的额外参数 (e.g. -l) --ssh-extra-args=SSH_EXTRA_ARGS指定仅传递给 ssh 的额外参数 (e.g. -R)
控制您成为目标主机上的用户的方式和用户,特权升级选项:
:- - -s, --sudo使用 sudo (nopasswd) 运行操作(已弃用,使用 become) -U SUDO_USER, --sudo-user=SUDO_USER所需的 sudo 用户(默认=root)(已弃用,使用 become) -S, --su使用 su 运行操作(已弃用,使用 become) -R SU_USER, --su-user=SU_USER以该用户身份使用 su 运行操作(默认 = root)(已弃用,使用 become) -b, --become使用 become 运行操作(不暗示密码提示) --become-method=BECOME_METHOD要使用的权限提升方法(默认=sudo),有效选择:[ sudo | su | pbrun | pfexec | runas | doas | dzdo ] --become-user=BECOME_USER以该用户身份运行操作(默认=root) --ask-sudo-pass询问 sudo 密码(已弃用,使用 become) --ask-su-pass询问 su 密码(已弃用,使用 become) -K, --ask-become-pass要求提权密码
Ansible Galaxy 工具 1 $ ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help ] [options] ...
:- - -h, --help显示此帮助信息并退出 -v, --verbose详细模式(-vvv 更多,-vvvv 启用连接调试) --version显示程序的版本号并退出
1 2 3 4 5 6 7 8 9 10 $ ansible-galaxy search --author <AUTHOR> $ ansible-galaxy search --platforms <PLATFORM> $ ansible-galaxy search --galaxy-tags <TAG> $ ansible-galaxy info <ROLE> $ ansible-galaxy install <ROLE> -p <ROLE_DIRECTORY> $ ansible-galaxy install -r <ROLE1> <ROLE2> <ROLE3> ... $ ansible-galaxy list $ ansible-galaxy remove <ROLE> $ ansible-galaxy init <ROLE> $ ansible-galaxy init --offline <ROLE>
ansible-doc 在本地访问文档
1 2 $ ansible-doc $ ansible-doc [options] [module...]
:- - -h, --help显示此帮助信息并退出 -l, --list列出可用模块 -M MODULE_PATH, --module-path=MODULE_PATH指定模块库的路径 (default=None) -s, --snippet显示指定模块的剧本片段 -v, --verbose详细模式(-vvv 更多,-vvvv 启用连接调试) --version显示程序的版本号并退出
ansible-vault 1 2 $ ansible-vault $ ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help ] [options] vaultfile.yml
:- - --ask-vault-pass询问保险库密码 -h, --help显示此帮助信息并退出 --new-vault-password-file=NEW_VAULT_PASSWORD_FILE用于重新生成密钥的新保管库密码文件 --output=OUTPUT_FILE用于加密或解密的输出文件名; 使用 - 用于标准输出 --vault-password-file=VAULT_PASSWORD_FILE保险库密码文件 -v, --verbose详细模式(-vvv 更多,-vvvv 启用连接调试) --version显示程序的版本号并退出
ansible-playbook 1 2 $ ansible-playbook $ ansible-playbook playbook.yml
:- - --ask-vault-pass询问保险库密码 -C, --check不要做任何改变;相反,尝试预测可能发生的一些变化 -D, --diff更改(小)文件和模板时,显示这些文件中的差异;与 --check 配合使用效果很好 -e EXTRA_VARS, --extra-vars=EXTRA_VARS将附加变量设置为 key=value 或 YAML/JSON --flush-cache清除事实缓存 --force-handlers即使任务失败也运行处理程序 -f FORKS, --forks=FORKS指定要使用的并行进程数(默认值=5) -h, --help显示此帮助信息并退出 -i INVENTORY, --inventory-file=INVENTORY指定清单主机路径(默认=/etc/ansible/hosts)或逗号分隔的主机列表 -l SUBSET, --limit=SUBSET进一步将选定主机限制为其他模式 --list-hosts输出匹配主机列表;不执行任何其他操作 --list-tags列出所有可用的标签 --list-tasks列出所有将要执行的任务 -M MODULE_PATH, --module-path=MODULE_PATH指定模块库的路径(默认=无) --new-vault-password-file=NEW_VAULT_PASSWORD_FILE用于重新生成密钥的新保管库密码文件 --output=OUTPUT_FILE用于加密或解密的输出文件名;使用 - 用于标准输出 --skip-tags=SKIP_TAGS只运行标签与这些值不匹配的播放和任务 --start-at-task=START_AT_TASK在匹配此名称的任务处启动剧本 --step一步一步:在运行前确认每个任务 --syntax-check对 playbook 执行语法检查,但不要执行它 -t TAGS, --tags=TAGS只运行带有这些值标记的播放和任务 --vault-password-file=VAULT_PASSWORD_FILE保险库密码文件 -v, --verbose详细模式(-vvv 更多,-vvvv 启用连接调试) --version显示程序的版本号并退出
连接选项:
:- - -k, --ask-pass询问连接密码 --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE使用此文件来验证连接 -u REMOTE_USER, --user=REMOTE_USER以此用户身份连接(默认=None) -c CONNECTION, --connection=CONNECTION要使用的连接类型(默认=smart) -T TIMEOUT, --timeout=TIMEOUT以秒为单位覆盖连接超时(默认值 = 10) --ssh-common-args=SSH_COMMON_ARGS指定要传递给 sftp/scp/ssh 的常用参数(例如 ProxyCommand) --sftp-extra-args=SFTP_EXTRA_ARGS指定仅传递给 sftp 的额外参数(例如 -f、-l) --scp-extra-args=SCP_EXTRA_ARGS指定仅传递给 scp 的额外参数(例如 -l) --ssh-extra-args=SSH_EXTRA_ARGS指定仅传递给 ssh 的额外参数(例如 -R)
特权升级选项:
:- - -s, --sudo使用 sudo (nopasswd) 运行操作(已弃用,使用 become) -U SUDO_USER, --sudo-user=SUDO_USER所需的 sudo 用户(默认=root)(已弃用,使用become) -S, --su使用 su 运行操作(已弃用,使用 become) -R SU_USER, --su-user=SU_USER以该用户身份使用 su 运行操作(默认 = root)(已弃用,使用become) -b, --become使用 become 运行操作(不暗示密码提示) --become-method=BECOME_METHOD要使用的权限提升方法(默认=sudo),有效选择:[ sudo | su | pbrun | pfexec | runas | doas | dzdo ] --become-user=BECOME_USER以该用户身份运行操作(默认=root) --ask-sudo-pass询问 sudo 密码(已弃用,使用 become) --ask-su-pass询问 su 密码(已弃用,使用 become) -K, --ask-become-pass要求提权密码
ansible-pull 1 2 $ ansible-pull $ ansible-pull -U <repository> [options]
:- - --accept-host-key如果尚未添加,则添加 repo url 的主机密钥 --ask-vault-pass询问保险库密码 -C CHECKOUT, --checkout=CHECKOUT分支/标签/提交结帐。默认为存储库模块的行为。 -d DEST, --directory=DEST签出存储库的目录 -e EXTRA_VARS, --extra-vars=EXTRA_VARS将附加变量设置为 key=value 或 YAML/JSON -f, --force即使无法更新存储库也运行 playbook --full做一个完整的克隆,而不是一个浅的 -h, --help显示此帮助信息并退出 -i INVENTORY, --inventory-file=INVENTORY指定清单主机路径(默认=/etc/ansible/hosts)或逗号分隔的主机列表 -l SUBSET, --limit=SUBSET进一步将选定主机限制为其他模式 --list-hosts输出匹配主机列表;不执行任何其他操作 -m MODULE_NAME, --module-name=MODULE_NAME存储库模块名称,ansible 将使用它来签出 repo。默认是 git -M MODULE_PATH, --module-path=MODULE_PATH指定模块库的路径(默认=无) --new-vault-password-file=NEW_VAULT_PASSWORD_FILE用于重新生成密钥的新保管库密码文件 -o, --only-if-changed仅在存储库已更新时才运行 playbook --output=OUTPUT_FILE用于加密或解密的输出文件名;使用 - 用于标准输出 --purge剧本运行后清除结帐 --skip-tags=SKIP_TAGS只运行标签与这些值不匹配的播放和任务 -s SLEEP, --sleep=SLEEP在开始之前休眠随机间隔(在 0 到 n 秒之间)。这是分散 git 请求的有用方法 -t TAGS, --tags=TAGS只运行带有这些值标记的播放和任务 -U URL, --url=URL剧本存储库的 URL --vault-password-file=VAULT_PASSWORD_FILE保险库密码文件 -v, --verbose详细模式(-vvv 更多,-vvvv 启用连接调试) --verify-commit验证签出提交的 GPG 签名,如果失败则中止运行 playbook。这就需要对应的VCS模块来支持这样的操作 --version显示程序的版本号并退出
连接选项:
:- - -k, --ask-pass询问连接密码 --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE使用此文件来验证连接 -u REMOTE_USER, --user=REMOTE_USER以此用户身份连接(默认=无) -c CONNECTION, --connection=CONNECTION要使用的连接类型(默认=智能) -T TIMEOUT, --timeout=TIMEOUT以秒为单位覆盖连接超时(默认值 = 10) --ssh-common-args=SSH_COMMON_ARGS指定要传递给 sftp/scp/ssh 的常用参数(例如 ProxyCommand) --sftp-extra-args=SFTP_EXTRA_ARGS指定仅传递给 sftp 的额外参数(例如 -f、-l) --scp-extra-args=SCP_EXTRA_ARGS指定仅传递给 scp 的额外参数(例如 -l) --ssh-extra-args=SSH_EXTRA_ARGS指定仅传递给 ssh 的额外参数(例如 -R)
特权升级选项:
:- - --ask-sudo-pass询问 sudo 密码(已弃用,使用become) --ask-su-pass询问 su 密码(已弃用,使用become) -K, --ask-become-pass要求提权密码
ansible常用模块 Ansible 的模块已经高达 3000+ 之多。但是个人在日常工作中,比较常见的大约 20 多个
1 2 $ ansible-doc --list $ ansible <host-pattern> [options]
:- - - ping 检查指定节点机器是否还能连通 ansible all -m pingcommand 用于在各受控端节点运行指定的命令 ansible all -m command -a 'hostname'shell shell模块可以特殊字符,而command是不支持 ansible all -m shell -a 'hostname && date'hostname 修改远程受控节点的主机名的模块 ansible -i /opt/hosts xx -m hostname -a 'name=ansible-client-199'copy 在远程主机执行复制操作文件 ansible all -m copy -a 'src=/etc/hosts dest=/opt/hosts backup=yes'fetch 从远程主机获取文件到管理节点,但是不支持目录操作 ansible all -m fetch -a "src=/etc/yum.repos.d/epel.repo dest=/usr/local/src"script 管理端一个脚本,然后在远程服务器上执行 ansible all -m script -a '/root/time.sh'file 主要用于远程主机上的文件和目录操作 ansible all -m file -a "path=/root/rsync.password mode=600 state=touch"cron 管理执行任务计划模块(增删改查) ansible all -m cron -a "name='test a job' user=root job='/bin/sh /server/scripts/test.sh' minute=* hour=* day=* month=* weekday=*"yum RedHat和CentOS的软件包安装和管理 安装ansible all -m yum -a "name=httpd state=present"ansible all -m yum -a "name=httpd state=installed" 卸载ansible all -m yum -a "name=httpd state=absent"ansible all -m yum -a "name=httpd state=removed" service和systemd用于管理远程主机的服务 ansible all -m systemd -a "name=httpd state=started enabled=yes"ansible all -m systemd -a "name=httpd state=restarted"user useradd, userdel, usermod ansible all -m user -a 'name=haha remove=no state=absent'group groupadd, groupdel, groupmod ansible all -m group -a 'name=mygroup state=absent'setup 可收集远程主机的facts变量的信息 ansible all -m setup -a 'filter=ansible_default_ipv4'authorized_key 为特定的用户账号添加或删除 SSH authorized keys ansible all -m authorized_key -a "user=root key='{{lookup('file','/root/.ssh/id_rsa.pub')}}' path=/root/.ssh/authorized_keys manage_dir=no"replace 和 sed 命令比较类似,用于正则匹配和替换 ansible all -m replace -a "path=/etc/fstab regexp=^(UUID.*) replace='#\1'"lineinfile 正则匹配,更改某个关键参数值 ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
另见