Ansible的多版本共存
我想試試新版本,或者根據舊版本進行調整以確保功能的正常運作,這是我的實驗紀錄。
如果你希望将其放置在本地用户环境的主目录中而不是全局环境中,你可以执行以下操作:
将export PATH=$HOME/.local/bin:$PATH的命令添加到~/.bashrc或其他类似文件中,并执行pip install ansible=2.0.0.2 –user命令,这样它将被优先读取。
以下是使用virtualenv的方法,如果使用Python 2.6,则无法正确安装virtualenvwrapper,但如果使用Python 2.7,则可以成功安装。
在CentOS 6上安装Python 2.7时,搜索得到的是从非base仓库进行安装的步骤。
另外,如果要迁移正在运行的Jenkins,可以按照以前的方法进行操作,大致如下。
安装pip和python-devel。
curl -kL https://bootstrap.pypa.io/get-pip.py | python
yum install python-devel
安装virtualenv。
pip install virtualenv
pip install virtualenvwrapper
find /usr -name virtualenvwrapper.sh
vi .bashrc
以下を追記
if [ -f /usr/bin/virtualenvwrapper.sh ]; then
export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh
fi
source .bashrc
通过使用mkvirtualenv命令为每个版本创建环境,并使用workon命令指定环境名称进行切换。
mkvirtualenv ansible2.5
workon ansible2.5
pip install ansible
ansible --version
pip list|grep ansible
如果不指定环境名称,则会显示环境列表。
workon
创建一个适用于Ansible 2.0的环境并安装它。
mkvirtualenv ansible2.0
which ansible
pip install ansible==2.0
ansible --version
退出 virtualenv(提示符返回原始状态)。
deactivate
嗯,大致上就是说在执行ansible-playbook之前,需要使用”workon ansible2.0″命令,执行完之后再使用”deactivate”来取消激活。
我试过一下,发现在yum模块周围显示找不到yum模块的错误提示,所以我进行了以下切换操作,问题就解决了。
- set_fact:
# ansible_python_interpreter="/root/.virtualenvs/ansible2.0/bin/python"
ansible_python_interpreter="/usr/bin/python"
- name: install needed network manager libs
yum:
name: '{{ item }}'
state: installed
with_items:
- NetworkManager-glib
- nm-connection-editor.x86_64
- libsemanage-python
- policycoreutils-python
- set_fact:
ansible_python_interpreter="/root/.virtualenvs/ansible2.0/bin/python"
此外,当我想要仅使用正在开发的模块的新功能时,我向懂Python的人请教后得知可以通过gitclone进行复制或通过raw进行下载,然后将其放置在以下位置,就能够正常运行。例如,如果是nmcli,将其放置在这个位置似乎是不错的选择:
/usr/lib/python2.x/site-packages/ansible/modules/network/
如果使用virtualenv,以下位置可能更适合:
/root/.virtualenvs/ansible2.0/lib/python2.7/site-packages/ansible/
我尝试按照下面的方式添加playbook侧的条件分支,但在低版本中出现了语法错误,因为使用了不存在的模块名。真让人沮丧。似乎在2.0版本中根本不存在ansible_version.full。
有人在 Playbook 中撰写了有关如何指定版本的方法,我将其链接贴在这里。
- name: check systemd
stat:
path: /usr/bin/systemctl
register: check_systemd
- name: set timezone to common_timezone(default value is Asia/Tokyo)
timezone:
name: "{{ common_timezone }}"
when:
- ansible_version.full >= '2.3'
- check_systemd.stat.xusr
- block:
- name: check if timezone is common_timezone
command: /usr/bin/timedatectl status|grep -i 'time zone'|awk '{print $3}'
register: check_timezone
ignore_errors: true
when: check_systemd.stat.xusr
- name: set timezone to common_timezone
command: /usr/bin/timedatectl set-timezone '{{ common_timezone }}'
when: check_timezone != common_timezone
when: ansible_version.full < '2.3'
由于某种原因,需要将在ansible2.4版本下编写的程序与2.0版本下无法运行的程序进行比较并确定特定部分。大致关注以下内容。
include_tasks ## -> include
import_tasks ## -> include
loop_controls,loop_vars ## -> with_items等に使うloop内の変数はitemのみ
replace: path ## ->dest
when:
- check_result1.rc == 0 ## ansible2.4~ check_result1|succeeded
- check_result2.rc == 1 ## ansible2.4~ check_result2|failed
yum: # enablerepoは2.0ではつかえず
后来我觉得with_indexes和with_nested也没有正常工作(可能)
当出现以下情况时,可见出现了UnicodeDecodeError错误:无法对0xe3位置上的字节进行解码:该位置上的字节不在128范围内。换句话说,当执行检查任务失败且变量无法获取时,往往会出现这种错误。
所以,在仅需要获取shell或command的信息而不对环境进行操作的检查任务中,最好将以下内容全部包含进去:
always_run:是 ## ansible2.4~ checkmode:否
想不到的是,出现像0xe3这样的错误代码是Python错误,而不是Ansible错误。具体来说,据说是这个bug的原因。另外,版本号为0的补丁存在很多bug(语义化版本控制),因此最好使用稳定的版本(如果最新稳定版本在现有环境等方面很难使用,则可以使用最新的补丁版本等)。我听说,当遇到这种情况时,通过virtualenv使用不同的版本来确认,可以得到一个合法的语法错误,并且可以更容易地确定错误的位置。(还听说,通过在issue中搜索,可以找到大部分错误信息)
请参考以下链接,链接地址如下:
https://dev.classmethod.jp/server-side/ansible/select_ansible_version_via_virtualenv/
https://qiita.com/TatsuNet/items/7719ddcdf856de7cfc9a